【发布时间】:2012-09-20 20:46:09
【问题描述】:
我遇到了一个问题,我想在静态模式下反复播放半秒长的 AudioTrack,但声音断断续续。但是,我注意到TransitionDrawable 并行运行时声音非常清晰。
我的代码的简化骨架是:
thread = new Thread(new Runnable() {
public void run() {
createTransition();
try {
createAudioTrack();
while (true) {
if (audio) {
playSoundClip();
}
if (display) {
playScreenTransition();
}
Thread.sleep(getDelayBetweenBeats());
}
} catch (InterruptedException e) {
} finally {
resetScreenTransition();
stopSoundClip();
}
}
private void createAudioTrack() {
short[] samples = generateSamples();
track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, samples.length * 2, AudioTrack.MODE_STATIC);
if (track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.write(samples, 0, samples.length);
}
}
private void playSoundClip() {
if (track != null && track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.stop();
track.reloadStaticData();
track.play();
}
}
private void playScreenTransition() {
view.post(new Runnable() {
public void run() {
view.setBackgroundDrawable(transition);
transition.startTransition(DURATION);
}
});
}
});
thread.start();
如您所见,thread 未在 UI 线程上执行,因此我假设 track 面临多线程问题。我不认为播放转换的 UI 线程会消耗整个 CPU,因为我的音频是并行播放的。似乎该活动以某种方式消耗了 CPU,并且没有执行任何其他操作。
我也曾尝试在playSoundClip() 中使用view.post(new Runnable() {...});,但这没有帮助。
我曾考虑将所有内容更改为 AsyncTask,但恕我直言,这不会改变任何内容,因为它仍然是后台任务。因为我不需要用声音更新 UI 元素,而且过渡仍然必须并行播放,所以我什至没有尝试过。
一种解决方案可能是始终并行运行一些过渡(实际过渡或虚拟过渡),但这对我来说听起来很糟糕(双关语?)。
有谁知道如何让track 始终清晰播放?
编辑:
在这个问题上做了更多工作并扩展了我的程序后,我注意到我必须使用上面列出的线程方法,因为那里的逻辑需要一些时间才能完成,而且我无法在 UI 线程上完成所有操作更多的。目前,我在播放音频时播放了一个虚拟过渡,这对我来说仍然听起来很糟糕。因此,如果您仍然可以对该主题提供一些见解,欢迎您在此处发布/回答。
【问题讨论】:
标签: android multithreading audiotrack