在活动之间进行切换后,TarsosDSP音调检测不起作用

时间:2019-06-05 21:00:27

标签: java android fft tarsosdsp

如果我在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();

1 个答案:

答案 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()方法。

干杯!