关于线程生活和Android java中的AudioTrack的困惑

时间:2014-12-18 07:23:40

标签: java android multithreading

我有以下功能:

void playSound(){
    final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            sampleRate, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
            AudioTrack.MODE_STATIC);
    audioTrack.write(generatedSnd, 0, generatedSnd.length);
    audioTrack.play();
}

按钮点击:

public void btnTx_click(View view){
    textView.setText("CLICKED1");

    int rem;

    while(dataToSend != 0){
        rem = dataToSend % 2;
        if(rem==0)
            genTone(0.0);
        else
            genTone(1.0);
        dataToSend /= 2; 
        counter++;
    }

    // Use a new tread as this can take a while
    final Thread thread = new Thread(new Runnable() {
        public void run() {
            // genTone();       // this line is left here for my recor donly
            handler.post(new Runnable() {

                public void run() {
                    playSound();
                }
            });
        }
    });
    thread.start();
}  

while函数中的btnTx_click()循环准备generatedSnd函数中使用的playSound()数组。按下按钮时,该程序将音频样本加载到generatedSnd数组中,然后使用AudioTrack播放它们。加载和播放是在一个线程中完成的。

我怎么知道这个帖子什么时候结束? AudioTrack播放结束后会结束吗?还是在public void run()退出后立即结束?是否有可能确切地检查线程何时结束,如果是,MainActivity.java中应该包括这样的检查?

我想要做的是,一旦AudioTrack完成generatedSnd的播放,我想在generatedSnd中加载一组新值并开始播放这个新音。实际上,我想播放Tone 1,然后是Tone 2,然后是Tone 3,....等等。

1 个答案:

答案 0 :(得分:2)

对audioTrack.play()的调用不会阻止。它将开始播放,并且可能在播放结束之前返回Thread的run()方法。音频的实际播放发生在内部创建的另一个线程中,而不是从它调用的线程。

当播放到达设置为AudioTrack.setPlaybackPositionUpdateListener()的点时,您可以AudioTrack.setNotificationMarkerPosition()接收回叫,这将解决您的问题。