/* * Created on Jul 18, 2006 * * Copyright (c) 2006 P.J.Leonard * * http://www.frinika.com * * This file is part of Frinika. * * Frinika is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * Frinika is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with Frinika; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.frinika.benchmark; /* * riffread class reads existing RIFF format file and determines (1) if valid * RIFF file (2) chunk structure (3) details of fmt chunk by M. Gallant 2/14/97 */ import java.io.*; import java.awt.*; public class AudioReader { public static void main(String args[]) throws IOException { String nl = System.getProperty("line.separator"); String fileSeparator = System.getProperty("file.separator"); String selectFileDir; String selectFile; FileInputStream fis = null; FileOutputStream fos = null; Frame myFrame = new Frame("Parent Frame"); FileDialog myFD; myFrame.resize(200, 200); // myFrame.show() ; myFrame.hide(); myFD = new FileDialog(myFrame, "Open a Text File"); myFD.show(); // this blocks main program thread until select. // System.out.println("Chosen File" +myFD.getFile() ); // System.out.println("Chosen Directory" +myFD.getDirectory() ) ; selectFileDir = myFD.getDirectory(); // determine is file directory // ends properly. if (selectFileDir.charAt(selectFileDir.length() - 1) != fileSeparator .charAt(0)) selectFileDir += fileSeparator; selectFile = selectFileDir + myFD.getFile(); // System.out.println("Input File Location " + selectFile) ; try { fis = new FileInputStream(selectFile); } catch (IOException ie) { } DataInputStream dis = new DataInputStream(fis); try { int riffdata = 0; // size of RIFF data chunk. int chunkSize = 0, bytecount = 0; String sfield = ""; String sp = " "; // spacer string. String indent = sp + " "; long filesize = (new File(selectFile)).length(); // get file // length. System.out.println(" ****** FILE: " + selectFile + " LENGTH: " + filesize + " bytes ****** \n"); /* -------- Get RIFF chunk header --------- */ for (int i = 1; i <= 4; i++) sfield += (char) dis.readByte(); if (!sfield.equals("RIFF")) { System.out.println(" **** Not a valid RIFF file ****"); return; } for (int i = 0; i < 4; i++) chunkSize += dis.readUnsignedByte() * (int) Math.pow(256, i); System.out.println(sp + sfield + " ----- data size: " + chunkSize + " bytes"); sfield = ""; for (int i = 1; i <= 4; i++) sfield += (char) dis.readByte(); System.out .println(sp + " ----- form type: " + sfield + "\n"); riffdata = chunkSize; /* --------------------------------------------- */ bytecount = 4; // initialize bytecount to include RIFF form-type // bytes. while (bytecount < riffdata) { // check for chunks inside RIFF data // area. sfield = ""; for (int i = 1; i <= 4; i++) sfield += (char) dis.readByte(); chunkSize = 0; for (int i = 0; i < 4; i++) chunkSize += dis.readUnsignedByte() * (int) Math.pow(256, i); bytecount += (8 + chunkSize); System.out.println("\n" + sp + sfield + " ----- data size: " + chunkSize + " bytes"); if (sfield.equals("fmt ")) { // extract info from "format" // chunk. if (chunkSize < 16) { System.out .println(" **** Not a valid fmt chunk ****"); return; } int wFormatTag = dis.readUnsignedByte(); dis.skipBytes(1); if (wFormatTag == 1) System.out.println(indent + "wFormatTag: MS PCM format"); else System.out.println(indent + "wFormatTag: non-PCM format"); int nChannels = dis.readUnsignedByte(); dis.skipBytes(1); System.out.println(indent + "nChannels: " + nChannels); int nSamplesPerSec = 0; for (int i = 0; i < 4; i++) nSamplesPerSec += dis.readUnsignedByte() * (int) Math.pow(256, i); System.out.println(indent + "nSamplesPerSec: " + nSamplesPerSec); int nAvgBytesPerSec = 0; for (int i = 0; i < 4; i++) nAvgBytesPerSec += dis.readUnsignedByte() * (int) Math.pow(256, i); System.out.println(indent + "nAvgBytesPerSec: " + nAvgBytesPerSec); int nBlockAlign = 0; for (int i = 0; i < 2; i++) nBlockAlign += dis.readUnsignedByte() * (int) Math.pow(256, i); System.out.println(indent + "nBlockAlign: " + nBlockAlign); if (wFormatTag == 1) { // if MS PCM format int nBitsPerSample = dis.readUnsignedByte(); dis.skipBytes(1); System.out.println(indent + "nBitsPerSample: " + nBitsPerSample); } else dis.skipBytes(2); dis.skipBytes(chunkSize - 16); // skip over any extra bytes // in format specific field. } else // if NOT the fmt chunk. dis.skipBytes(chunkSize); } // end while. System.out.println("\n" + sp + "Final RIFF data bytecount: " + bytecount); if ((8 + bytecount) != (int) filesize) System.out.println(sp + "!!!!!!! Problem with file structure !!!!!!!!! "); else System.out.println(sp + "File chunk structure consistent with valid RIFF "); System.out .println(" -------------------------------------------------------"); } // end try. finally { myFrame.dispose(); dis.close(); // close all streams. fis.close(); } } }