2013-08-22 2 views
0

나는 선택한 템포 (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); 
} 

감사를

+0

SoundPool을 만들 때 'maxStreams'에 대해 어떤 값을 지정하셨습니까? – fadden

답변

0

스레드를 사용하지 말고 주 응용 프로그램 스레드를 절전 모드로 전환하지 마십시오. 핸들러를 사용하십시오. 핸들러를 사용하면 메인 스레드를 잠자 지 않고 미래에 일어날 일을 스케쥴 할 수 있습니다. 내 대답보기 here

0

음악은 항상 시간이 중요합니다. SoundPool은 음악이 요구하는 정밀도 수준을 위해 설계되지 않았습니다. SoundPool은 트리거가 발생할 때 사운드를 생성하고 때로는 예를 들어 가끔씩 입력에 반응하도록 설계되었습니다. 게임. 음악을 자주 생성 할 때 어떤 사운드가 발생하는지 알기 때문에 더 잘 계획 할 수 있습니다.

AudioTrack을 사용하고 오디오 버퍼에 직접 쓰는 것이 좋습니다. 사운드가 서로 관련되어 재생되는 경우를 완전히 제어 할 수있는 유일한 방법입니다. 지연 시간과 관련하여 안드로이드 OS 하드웨어 구현의 자존심에 있지만, 적어도 각 비트는 안정적입니다!