ここで私はアンドロイドスタジオで連続した正弦波を生成するために使用しているコードです。すべてがスレッド内で実行されます。私の質問は:私がaudio.write()を呼び出すと、バッファに残っている可能性のあるデータはどうなりますか?古いサンプルをダンプして新しいセットを書き込むのですか、それとも新しいサンプル配列を残りのサンプルに追加しますか?AudioTrack.write()のバッファ内のデータはどうなりますか
int buffSize = AudioTrack.getMinBufferSize(sr, AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT);
//create the AudioTrack object
AudioTrack audio = new AudioTrack( AudioManager.STREAM_MUSIC,
sr,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffSize,
AudioTrack.MODE_STREAM);
//initialise values for synthesis
short samples[]= new short[buffSize]; //array the same size as buffer
int amp=10000; //amplitude of the waveform
double twopi = 8.*Math.tan(1.); //2*pi
double fr = 440; //the frequency to create
double ph = 0; //phase shift
//start audio
audio.play();
//synthesis loop
while (isRunning)
{
fr=440+4.4*sliderVal;
for (int i=0;i<buffSize;i++)
{
samples[i]=(short)(amp*Math.sin(ph));
ph+=twopi*fr/sr;
}
audio.write(samples,0,buffSize);
}
//stop the audio track
audio.stop();
audio.release();
おかげで(私は実用的なプロジェクトの私の本のAndroidソフトウェア開発 - コレクションにオーディオに大きな章を書いた)右のトラックに私を得ました。次のxサンプルを書き込む前にデバイスがxサンプルを再生したことを確実にするために同期が必要な場合はありますか? – Johan
それを聞いてうれしい!さて、あなたは同期する必要はありませんが、あなたは "続ける"必要があります。バッファー・サイズのブロックをすばやく埋めることができない場合は、スキップまたはドロップアウトが発生します。あなたはそれが聞こえるので、これが起こることを知っています。これは、オーディオ待ち時間の問題のためにAndroidで大きな問題になります。これまで製作されたすべてのAndroid搭載端末は、iOS搭載端末よりも待ち時間が長くなります。信じがたいですが、本当です。 AudioBuffersSizeと呼ばれるGoogleのオープンソースのアプリは、バッファサイズやサンプレートなどのデバイスの機能を示しています。その後、オーディオアプリで正しく設定することができます。 –
ありがとうございました!私はまだその問題に遭遇していません。別々の軽量なwriteToBufferスレッドを書くのは良い考えですか? – Johan