生成された1秒より短い音を再生したい。ただし、AudioTrack
のminBufferSizeは常に1秒以上と思われます。いくつかのデバイスでは、bufferSizeをAudioTrack.getMinBufferSize
と評価された値より小さく設定できますが、これはすべてのデバイスで可能ではありません。 AudioTrackのサウンドを短くすることが可能かどうかを知りたい。私は現在、(私は常に新しいfrequencesを取得していますので、それは、いくつかの平滑化が含まれています)、このコードを使用しています:実際に短く生成された音を再生する
int buffSize = AudioTrack.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, buffSize,
AudioTrack.MODE_STREAM);
short samples[] = new short[buffSize];
int amp = 10000;
double twopi = 8. * Math.atan(1.);
double phase = 0.0;
audioTrack.play();
double currentFrequency = getFrequency();
double smoothing = 300;
double deltaTime = buffSize/500;
while (playing && PreferenceManager.getDefaultSharedPreferences(
MainActivity.this).getBoolean("effect_switch", true))
{
double newFrequency = getFrequency();
for (int i = 0; i < buffSize; i++)
{
currentFrequency += deltaTime * (newFrequency - currentFrequency)/smoothing;
samples[i] = (short) (amp * Math.sin(phase));
phase += twopi * currentFrequency/sampleRate;
}
audioTrack.write(samples, 0, buffSize);
}
audioTrack.stop();
audioTrack.release();
、私は音がより頻繁に更新することにしたい、私が必要とする理由でありますより短いサンプル。
むしろより短いサウンドクリップに焦点を当ててから呼び出さ
newSamples()
方法は、あなただけの複数の同時audiotracksを実行することはできませんか? –私はこのいくつかを試してきました。私は約80msの 'minBufferSize'を得ています(私は信じています)。 8kHzサンプリング(一般的なテレコムオーディオサンプルレート)の場合は1280バイト、44.1kHzサンプリングの場合は7056バイト(最大)です。私は1つのデバイスを試してみました。あなたはいくつかのデバイスのための大きな最小値を得ますか? 'minBufferSize'、' CHANNEL_OUT_MONO'、 'ENCODING_PCM_16BIT'を得るために同じパラメータを使用しています。 – Gary99
@ Gary99私は2つのデバイスでそれをテストしました – MetaColon