[英]How to properly use a thread/run loop and play sounds with SoundPool?
我正在構建一個以選定速度(bpm)播放音樂序列的應用程序。 我目前正在使用一個線程在每個節拍上觸發一個函數,然后使用SoundPool播放聲音。 但是,一次播放的聲音越多,速度越慢!
這是因為將播放聲音所需的時間添加到了playingThread睡眠的時間上嗎?
soundPool.play應該在后台線程而不是UI線程中嗎?
我也遇到同步問題,它會隨機加速和放慢速度,並且如果同時播放兩個聲音,它們並不總是同時播放。 對於Android 2.3.4來說還不錯,但是由於某些原因,對於Android 4.2.2來說確實很糟糕。
實現一致的速度和同步的最佳方法是什么?
這是我的主題:
public void playingThread()
{
//Time interval in ms for thread sleep
final long intervalInMs = (long) ((1 / (float) theBpm) * 60 * 250);
Thread thread = new Thread() {
@Override
public void run() {
while(playing == true) {
beat();
try {
Thread.sleep((long)(intervalInMs));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread.start();
}
然后調用此函數,該函數具有許多其他邏輯來計算播放和停止播放的聲音等:
public void beat()
{
currentBeat++;
//Play click sound every four beats
if(currentBeat % 4 == 0) {
soundPool.play(clickSoundId, 0.5f, 0.5f, 1, 0, 1f);
}
//ADDITIONAL LOGIC TO DETERMINE WHICH SOUNDS TO PLAY...
int streamId = soundPool.play(soundIds[i], 1f, 1f, 1, 0, 1f);
}
謝謝
不要使用線程,也不要休眠主應用程序線程。 使用處理程序。 處理程序使您可以安排將來發生的事情而無需休眠主線程。 在這里查看我的答案
音樂總是至關重要的。 SoundPool並非為音樂所要求的精確度而設計。 SoundPool被設計為對輸入具有反應性,當觸發發生時(有時在例如游戲中)會生成聲音。 生成音樂時,您通常會知道什么時候會發出聲音,以便更好地安排它們。
我建議使用AudioTrack並直接寫入音頻緩沖區。 這是完全控制何時播放聲音彼此相關的唯一方法。 在延遲方面,您仍然受制於Android OS 和硬件實現,但至少每個節拍都是穩定的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.