2012-09-07 10 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); 

AudioTrack APIのいずれか、setNotificationMarkerPosition、setLoopPoints、seなどを使用できますこれを行うには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) { 

    } 

});

関連する問題