2012-09-07 3 views
7

오디오 트랙을 사용하여 스트림 모드에서 다른 소리를 재생하고 있습니다. 각 사운드가 언제 재생되는지를 알 수있는 방법이 있는지 알고 싶습니다.AudioTrack - 사운드 시작/종료시기를 아는 방법?

AudioTrack tmpAudioTrack = new AudioTrack(
     STREAM_TYPE, 
     SAMPLE_RATE, 
     CHANNEL_CONFIG_TYPE, 
      AUDIO_FORMAT_TYPE, 
     getOptimalBufferSize(), 
     AUDIO_TRACK_MODE);' 

을 그리고 백그라운드 스레드를 시작 :

나는 같은 오디오 트랙을 만들

backround_thread = new Thread(new MyRunnable(aTrack)); 
    backround_thread.start(); 

내가 실행 가능한 내부에 다음과 같이 각각의 사운드를 쓰기 :

byte generatedSnd[] = new byte[2 * beepSamples]; 
<code for filling the buffer with sound here> 
int bytesWritten = track.write(generatedSnd, 0, generatedSnd.length); 

setNotificationMarkerPosition, setLoopPoints 또는 se와 같은 AudioTrack API를 사용할 수 있습니다 이것을 달성하기위한 tPositionNotificationPeriod? 어떻게 작동합니까?

각 사운드는 서로 다른 지속 시간을 가질 수 있습니다. 나는 이것이 열쇠라고 생각한다.

이 API에 대한 설명서를 완전히 이해하지 못했습니다. 각 프레임은 샘플과 같은가요? 각 사운드의 시작/끝 위치에 마커를 어떻게 지정합니까?

감사합니다.

+0

적어도 누구나 setNotificationMarkerPosition과 setPositionNotificationPeriod의 차이점을 알고 있습니까? – mikemeli

답변

12

이것은 내가 알아 낸 것입니다.

나에게 프레임은 샘플입니다. 사운드의 지속 시간과 샘플 속도의 곱입니다.

AudioTrack setPositionNotificationPeriod를 사용하려면 샘플 양을 전달해야합니다. 200 개의 샘플을 전달하면 200 개의 샘플마다 콜백이 호출됩니다.

tmpAudioTrack.setPositionNotificationPeriod(duration * sampleRate); 

setNotificationMarkerPosition을 사용하려면 일정량의 샘플도 전달해야합니다. 그러나 이는 기간 API와 마찬가지로 절대적이며 상대적이 아닙니다. 따라서 사운드가 끝나는 시점을 결정하려면 샘플 양 (전체 사운드 트랙 지속 시간 * sampleRate)을 전달하십시오.

tmpAudioTrack.setNotificationMarkerPosition(duration * sampleRate); 

하지만, 이미 재생하는 경우, 사운드 트랙의 중간에와의 지금부터 3 초 가정 해 봅시다 그래서 당신이 다시 전화를 얻을 것이다 마커를 추가하려면, 다음 전류를 추가해야 오디오 트랙의 재생 헤드 (예 : 재생 시간은 3 초)

tmpAudioTrack.setNotificationMarkerPosition(tmpAudioTrack.getPlaybackHeadPosition() + (duration * sampleRate)); 

다음은 마침표 및 마커 알림을 등록한 방법입니다.

tmpAudioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener(){ 

    @Override 
    public void onMarkerReached(AudioTrack arg0) { 

    } 

    @Override 
    public void onPeriodicNotification(AudioTrack arg0) { 

    } 

});