From: Gordon M. <go...@us...> - 2006-04-14 07:40:21
|
Update of /cvsroot/bitcollider/jbitcollider/plugins/org.bitpedia.collider.wav/src/org/bitpedia/collider/wav In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20753/plugins/org.bitpedia.collider.wav/src/org/bitpedia/collider/wav Added Files: WavFormatHandler.java Log Message: initial commit from code drop of april 12 --- NEW FILE: WavFormatHandler.java --- package org.bitpedia.collider.wav; import java.io.FileInputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.HashMap; import java.util.Map; import org.bitpedia.collider.core.FormatHandler; import org.bitpedia.util.Sha1; import org.bitpedia.collider.core.ArrayUtils; public class WavFormatHandler implements FormatHandler { private String errorString; private Sha1 audioSha1; private boolean stereo; private int sampleRate, channels, sampleSize; private int dataLen; private int samples; private int bytesProcessed; public boolean supportsExtension(String ext) { return "wav".equalsIgnoreCase(ext); } public boolean supportsMemAnalyze() { return true; } public boolean supportsFileAnalyze() { return false; } public void analyzeInit() { audioSha1 = new Sha1(); stereo = false; sampleRate = 0; channels = 0; sampleSize = 0; dataLen = 0; samples = 0; bytesProcessed = 0; } public void analyzeUpdate(byte[] buf, int bufLen) { if (-1 == bytesProcessed) { return; } if (0 == bytesProcessed) { if (buf[0] != 'R' || buf[1] != 'I' || buf[2] != 'F' || buf[3] != 'F' || buf[8] != 'W' || buf[9] != 'A' || buf[10] != 'V' || buf[11] != 'E' || buf[12] != 'f' || buf[13] != 'm' || buf[14] != 't' || buf[15] != ' ') { errorString = "File is not in WAV format."; bytesProcessed = -1; return; } /* * We're going to assume that we have the entire header in the first * block */ assert bufLen >= 44; ByteBuffer bbuf = ByteBuffer.wrap(buf); bbuf.order(ByteOrder.LITTLE_ENDIAN); channels = bbuf.getShort(22); sampleRate = bbuf.getInt(24); sampleSize = bbuf.getShort(34); dataLen = bbuf.getInt(40); if ((8 != sampleSize) && (16 != sampleSize)) { bytesProcessed = -1; errorString = "Invalid sample size found in wav file."; return; } samples = dataLen / (channels * (sampleSize >> 3)); audioSha1.engineUpdate(buf, 44, bufLen-44); bytesProcessed += bufLen - 44; } else { audioSha1.engineUpdate(buf, 0, bufLen); bytesProcessed += bufLen; } } public Map analyzeFinal() { if (-1 == bytesProcessed) { return null; } byte[] hash = audioSha1.engineDigest(); String value; Map attrs = new HashMap(); /* Do a quick check to see which integer math calc is appropriate */ if (0 < sampleRate) { if (samples < sampleRate) { value = Integer.toString(samples * 1000 / sampleRate); } else { value = Integer.toString((samples / sampleRate) * 1000); } attrs.put("tag.wav.duration", value); } attrs.put("tag.wav.samplerate", Integer.toString(sampleRate)); attrs.put("tag.wav.channels", Integer.toString(channels)); attrs.put("tag.wav.samplesize", Integer.toString(sampleSize)); value = ArrayUtils.byteArrayToHex(hash, 0, hash.length); attrs.put("tag.wav.audio_sha1", value); return attrs; } public static void main(String[] args) { try { FileInputStream fis = new FileInputStream( "c:\\WINDOWS\\Media\\chord.wav"); byte[] buf = new byte[44]; fis.read(buf); WavFormatHandler wfh = new WavFormatHandler(); wfh.analyzeUpdate(buf, 44); System.out.println("sampleRate: " + wfh.sampleRate + ", channels:" + wfh.channels + ", sampleSize:" + wfh.sampleSize + ", dataLen:" + wfh.dataLen); fis.close(); } catch (Exception e) { } } public Map analyzeFile(String fileName) { errorString = "analyzeFile method is not supported."; return null; } public String getError() { return errorString; } } |