protected Map doInBackground(File... songs) {
for (int count = 0; count < songs.length; count++){
String songName = songs[count].getAbsolutePath().split(songsFolder)[1].replaceAll("/","");
int bpm = calculateBpm(songs[count]);
publishProgress(songName, Integer.toString(bpm));
bpmMap.put(songName, bpm);
}
return bpmMap;
}
private int calculateBpm(File song) {
BPM2SampleProcessor processor = new BPM2SampleProcessor();
processor.setSampleSize(1024);
EnergyOutputAudioDevice output = new EnergyOutputAudioDevice(processor);
output.setAverageLength(1024);
AdvancedPlayer player;
FileInputStream fileInputStream = null;
BufferedInputStream inputStream = null;
try {
fileInputStream = new FileInputStream(song);
inputStream = new BufferedInputStream(fileInputStream, 7 * 1024);
player = new AdvancedPlayer(inputStream, output);
player.play(1000,2000);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JavaLayerException e) {
e.printStackTrace();
}
int bpm = processor.getBPM();
try {
if(fileInputStream!=null)
fileInputStream.close();
if (inputStream != null)
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return bpm;
}
public class EnergyOutputAudioDevice extends BaseOutputAudioDevice {
private int averageLength = 1024;
private Queue<Short> instantBuffer = new LinkedList<Short>();
public EnergyOutputAudioDevice(SampleProcessor processor) {
super(processor);
}
@Override
protected void outputImpl(short[] samples, int offs, int len) throws JavaLayerException {
for(int i=0; i<len; i++)
instantBuffer.offer(samples[i]);
while(instantBuffer.size()>averageLength*channels)
{
long energy = 0;
for(int i=0; i<averageLength*channels; i++)
energy += Math.pow(instantBuffer.poll(), 2);
if(processor != null)
processor.process(new long[] { energy });
}
}
public int getAverageLength() {
return averageLength;
}
public void setAverageLength(int averageLength) {
this.averageLength = averageLength;
}
}
04-28 02:30:27.443: E/AndroidRuntime(4100): FATAL EXCEPTION: AsyncTask #1
04-28 02:30:27.443: E/AndroidRuntime(4100): java.lang.RuntimeException: An error occured while executing doInBackground()
04-28 02:30:27.443: E/AndroidRuntime(4100): at android.os.AsyncTask$3.done(AsyncTask.java:299)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-28 02:30:27.443: E/AndroidRuntime(4100): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.lang.Thread.run(Thread.java:856)
04-28 02:30:27.443: E/AndroidRuntime(4100): Caused by: java.lang.NoClassDefFoundError: com.bpmprocessor.EnergyOutputAudioDevice
04-28 02:30:27.443: E/AndroidRuntime(4100): at com.beatzplayer.BPMCalculator.calculateBpm(BPMCalculator.java:89)
04-28 02:30:27.443: E/AndroidRuntime(4100): at com.beatzplayer.BPMCalculator.doInBackground(BPMCalculator.java:77)
04-28 02:30:27.443: E/AndroidRuntime(4100): at com.beatzplayer.BPMCalculator.doInBackground(BPMCalculator.java:1)
04-28 02:30:27.443: E/AndroidRuntime(4100): at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-28 02:30:27.443: E/AndroidRuntime(4100): ... 5 more
거짓말 아니고 1주일째 해결 못하고 있습니다... 도데체 뭐가 문제인건가요??
Noclassdeffounderror이 cause(원인)이라고 해서 인터넷도 찾아봐서 제시된 해결방법을 똑같이 했음에도 불구하고 진전이 없네요.. Energyoutputaudiodevice에서 super(process)부분부터 작동이 안되는 거 같은데, 아 도저히 모르겠네요. 제가 초보라서 오픈소스를 분석하고 있는데 이 오픈 소스는 뭐가 잘못 됐는지 도저히 모르겠네요. 자바 프로그래밍 잘하시는 분 한번만 제발 도와주세요. ㅜ
참고로 github.com에서 beatz-player이라고 치면 나오는 오픈소스입니다.