2016-03-26 12 views
0

次の定義でAudioTrackを作成しています。audioTrack.stopはオーディオの再生を停止しません

audioTrack = new AudioTrack(
          AudioManager.STREAM_MUSIC, 
          44100, 
          AudioFormat.CHANNEL_OUT_MONO, 
          AudioFormat.ENCODING_PCM_16BIT, 
          buffer.length * 2, 
          AudioTrack.MODE_STATIC); 

audioTrack.write(buffer, 0, buffer.length); 
        audioTrack.setPositionNotificationPeriod(500); 
        audioTrack.setNotificationMarkerPosition(buffer.length); 
        progressListener = new PlaybackProgress(buffer.length); 
        audioTrack.setPlaybackPositionUpdateListener(progressListener); 

audioTrackが終了すると、オーディオを停止してヘッドの位置をリセットするために、以下が呼び出されます。

上記のコードは、Android 5.1で完全に正常に動作します。しかし、私は4.4.4で問題があります。 audioTrack.stop()は呼び出されますが、オーディオは停止しません。これは、reloadStaticDataがオーディオを開始位置に巻き戻し、オーディオを再生するためです。 5.1を使用すると、正しく停止してバッファを再生の開始に戻し、再生ボタンを押すと最初から再生されます。

Android 4.4.4でこの問題をどのように解決できますか?

答えて

0

問題が解決するかどうかは確かではありませんが、stop()の代わりにpause()を使用することを検討してください。ドキュメントによって、MODE_STREAMのstop()は実際に書き込まれた最後のバッファの残りの部分を再生し続けます。 MODE_STATICを使用していますが、試してみる価値があります。

も(おそらく無関係)、その書き込みを考える()書き込まれたバイト数を返しますので、あなたはAudioTrackのバッファ全体たびに埋める単一の書き込みに依存すべきではありません。 write()は、指定されたバッファの内容全体を書き込むことができないので、OutputStream書き込みと同様に扱われるべきです。したがって、ループを記述し、write()の呼び出しごとに書き込まれた量を確認してから、すべての書き込みの合計がバッファの長さに等しくなるまで、バッファ配列の新しいインデックスから書き込みます。

+0

実は、私はすでに、audioTrack.pauseを試してみましたが、フラッシュ、事は私達がトラックを巻き戻し、次のプレイの準備ができて、それを維持するためにreloadStaticDataを呼び出しています。ここで、pauseとflushを呼び出すと、reloadStaticDataはオーディオを巻き戻しません。 – User

関連する問題