2013-07-31 8 views
0

나는 진자에 대해 지정된 스윙 간격이 750 밀리 초이고 최대 스윙 아크에서 단일 오디오 파일을 재생하는 메트로놈 유형의 애플리케이션을 만들었습니다 ... 진자의 스윙을 반복하고 사운드를 무기한 재생합니다. 그러나 코드 실행의 실제 타이밍이 장치마다 매우 다양하며 단일 장치에서 차이가 나는 경우도 있습니다. 저의 의도는 진자를 분당 80 비트의 속도로 흔들고 각 "비트"로 오디오 파일을 재생하는 것입니다. 오디오 파일을 재생하는 데 필요한 시간을 수용하도록 750 밀리 초 설정을 조정했습니다. 이는 밀리 초 설정을 750에서 약 680으로 약간 줄였습니다. 다양한 장치를 사용하여 테스트 한 결과, 타이밍을 정의하더라도 다양한 Android 장치로 테스트했을 때 메트로놈의 1 분 실행 결과가 크게 달라졌습니다. 밀리 초 단위의 요소.다양한 Android 기기 및 OS 버전에서 오디오 시퀀싱의 일관된 타이밍을 제공하는 방법은 무엇입니까?

Android SoundPool을 사용하여 .wav 파일에 액세스하여 사운드를 재생하고 있습니다.

Soundpool 타이밍 문제 및 우려 사항에 대한 언급이 많이 있지만, 이와 같은 응용 프로그램에 일관된 타이밍을 제공 할 수있는 실행 가능하고 안정적인 솔루션을 찾지 못했습니다.

진자의 스윙은 지정된 지연에 따라 꽤 일정한 것으로 보이므로 변이가 오디오를 재생하는 SoundPool 코드의 실행 중 가변 타이밍으로 인한 것 같습니다. Android에서 일관되고 정확한 타이밍 간격으로 사운드를 재생할 수있는 코드를 실행할 수있는 확실한 방법이 있습니까?

답변

1

이렇게하는 한 가지 방법은 핸들러입니다. 이렇게하면 클립이 실제로 재생되는 데 걸리는 시간과 관계없이 정확히 동일한 시간에 오디오 클립을 시작할 수 있습니다. SoundPool은 SoundPlayer가 필요하지 않으며 SoundPlayer 만 필요합니다.

처리기를 사용하면 나중에 메시지를 코드에 전달하도록 예약 할 수 있습니다. SoundPlayer로 사운드를 재생하는 것은 비동기식이기 때문에이 간단한 메커니즘을 사용하여 일정한 간격으로 사운드를 재생할 수 있습니다.

어떻게 작동하는지 보여주는 몇 가지 코드가 있습니다.

handler = new Handler() { 

     /* (non-Javadoc) 
     * @see android.os.Handler#handleMessage(android.os.Message) 
     */ 
     @Override 
     public void handleMessage(Message msg) { 
      if (msg.what == NEXT_SOUND_MSG) { 
       playNextSound() 
      } 
     } 
    }; 

    // Set up media player for sounds 
    player = new SoundPlayer(context); 
    player.start(); 

    private void playNextSound() { 
      if (mRunning) { 

       // Play the sound 
       int iSoundResId = item.getSoundResId(); 
       if (iSoundResId != -1) { 
         playSound(iSoundResId); 
       } 

       // schedule a message to advance to next item after duration 
       Message msg = handler.obtainMessage(NEXT_SOUND_MSG); 
       handler.sendMessageDelayed(msg, interval); 
      } 
    }