나는 선택한 템포 (bpm)로 음악 시퀀스를 재생하는 앱을 만들고 있습니다. 현재 SoundPool을 사용하여 사운드를 재생할 때마다 비트마다 기능을 실행하는 스레드를 사용하고 있습니다. 그러나 한 번에 더 많은 소리가 들리면 템포가 느려집니다!SoundPool에서 스레드/실행 루프를 올바르게 사용하고 사운드를 재생하는 방법은 무엇입니까?
playingThread가 잠자기 시간에 소리를 재생하는 데 걸리는 시간이 추가 되었기 때문에 이것이 가능합니까?
soundPool.play는 UI 스레드가 아닌 백그라운드 스레드에 있어야합니까?
무작위로 속도를 높이고 속도가 느려지는 동시에 두 개의 사운드가 동시에 재생되는 경우 정확히 같은 시간에 재생되지 않는 경우 동기화 문제가 발생합니다. 안드로이드 2.3.4에서 그렇게 나쁘지는 않았지만, 안드로이드 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을 만들 때 'maxStreams'에 대해 어떤 값을 지정하셨습니까? – fadden