我有以下功能:
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,....等等。
答案 0 :(得分:2)
对audioTrack.play()的调用不会阻止。它将开始播放,并且可能在播放结束之前返回Thread的run()方法。音频的实际播放发生在内部创建的另一个线程中,而不是从它调用的线程。
当播放到达设置为AudioTrack.setPlaybackPositionUpdateListener()
的点时,您可以AudioTrack.setNotificationMarkerPosition()
接收回叫,这将解决您的问题。