如果我在MainActivity和KonfigActivity之间切换,则TarsosDSP停止工作。
我试图弄清楚TarsosDSP是如何工作的,并使用了一些我在这里找到的代码:https://medium.com/@juniorbump/pitch-detection-in-android-using-tarsosdsp-a2dd4a3f04e9
函数showResultsForPitch(..)仅在TextView中显示检测到的频率。如果我启动该应用程序,则效果很好。但是,如果我切换到KonfigActivity并返回,则TextViews中什么也不会显示。
AudioDispatcher dispatcher =
AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0);
PitchDetectionHandler pdh = new PitchDetectionHandler() {
@Override
public void handlePitch(PitchDetectionResult res, AudioEvent e){
final float pitchInHz = res.getPitch();
runOnUiThread(new Runnable() {
@Override
public void run() {
showResultsForPitch(pitchInHz);
}
});
}
AudioProcessor pitchProcessor = new
PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 22050,
1024, pdh);
dispatcher.addAudioProcessor(pitchProcessor);
Thread audioThread = new Thread(dispatcher, "Audio Thread");
audioThread.start();
答案 0 :(得分:0)
每次执行代码时,都会创建带有新调度程序的新线程。切换活动时,您必须调用调度程序上的 stop()来释放线程,否则音频线程将继续运行。
public void startOtherActivity(View view) {
// This will terminate the audiothread.
dispatcher.stop()
Intent intent = new Intent(this, OtherActivity.class);
startActivity(intent);
以获得进一步的说明...
AudioDispatcher接收输入流(在这种情况下,是来自麦克风的录音)并将其切成小段(大约20ms〜),称为AudioEvents。然后使用PitchProcessor处理这些事件并将其转换为音高。作者在the manual(尤其是第10页的结帐页面)中有很好的解释。
AudioDispatcher是可运行的,并且您创建的音频线程将一直运行,直到您明确告诉它停止为止。因此,当您开始另一个活动然后返回到该活动时,现在有两个调度程序正在运行并将事情阻塞。看看AudioDispatcher文件中的 run()和 stop()方法。
干杯!