gpt4 book ai didi

java - android java中关于Thread life和AudioTrack的困惑

转载 作者:行者123 更新时间:2023-12-02 05:08:43 25 4
gpt4 key购买 nike

我有以下功能:

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();
}

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

我如何知道该线程何时结束? AudioTrack播放结束后就结束了吗?或者是在 public void run() 之后立即结束退出?是否可以准确检查线程何时结束,如果是,则应在 MainActivity.java 中的何处包含这样的检查?

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

最佳答案

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

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

关于java - android java中关于Thread life和AudioTrack的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27541201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com