package com.android.dvci.resample; import com.android.dvci.auto.Cfg; import com.android.dvci.util.Check; import com.musicg.dsp.Resampler; import com.musicg.wave.Wave; import com.musicg.wave.WaveFileManager; import com.musicg.wave.WaveHeader; public class Resample { private static final String TAG = "Resample"; //$NON-NLS-1$ public static void resample(String src, String dst) { Wave wave = new Wave(src); // Resample to Resampler resampler = new Resampler(); int sourceRate = wave.getWaveHeader().getSampleRate(); int targetRate = 8000; byte[] resampledWaveData = resampler.reSample(wave.getBytes(), wave.getWaveHeader().getBitsPerSample(), sourceRate, targetRate); // update the wave header WaveHeader resampledWaveHeader = wave.getWaveHeader(); if (Cfg.DEBUG) { //Check.log(TAG + "(resample): header: " + resampledWaveHeader.toString()); } resampledWaveHeader.setSampleRate(targetRate); // Make resampled wave Wave resampledWave = new Wave(resampledWaveHeader, resampledWaveData); //System.out.println(resampledWave); WaveFileManager wfm = new WaveFileManager(resampledWave); wfm.saveWaveAsFile(dst); } public static Wave resampleRaw(WaveHeader header, byte[] data) { // Resample to Resampler resampler = new Resampler(); int sourceRate = header.getSampleRate(); if(sourceRate == 0){ return null; } int targetRate = 8000; byte[] resampledWaveData = resampler.reSample(data, header.getBitsPerSample(), sourceRate, targetRate); // update the wave header WaveHeader resampledWaveHeader = header; if (Cfg.DEBUG) { //Check.log(TAG + "(resampleRaw): header: " + resampledWaveHeader.toString()); } resampledWaveHeader.setSampleRate(targetRate); // Make resampled wave Wave resampledWave = new Wave(resampledWaveHeader, resampledWaveData); return resampledWave; } public static WaveHeader createHeader(int sampleRate, int chunkSize) { // https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ WaveHeader wh = new WaveHeader(); int numSamples = chunkSize / 2; // 16-bit per sample wh.setChunkId(WaveHeader.RIFF_HEADER); wh.setChunkSize(chunkSize); // Filesize - 8 wh.setFormat(WaveHeader.WAVE_HEADER); wh.setSubChunk1Id(WaveHeader.FMT_HEADER); wh.setSubChunk1Size(16); wh.setAudioFormat(1); // PCM wh.setChannels(1); wh.setSampleRate(sampleRate); wh.setByteRate(sampleRate * 1 * 16/8); // SampleRate * NumChannels * BitsPerSample/8 wh.setBlockAlign(1 * 16/8); // NumChannels * BitsPerSample/8 wh.setBitsPerSample(16); wh.setSubChunk2Id(WaveHeader.DATA_HEADER); wh.setSubChunk2Size(numSamples * 1 * 16/8); // NumSamples * NumChannels * BitsPerSample/8 if (Cfg.DEBUG) { //Check.log(TAG + "(createHeader): " + wh.toString()); } return wh; } }