2009-07-28 15 views
0

JavaのSourceDataLineでサウンドを再生しますが、音量(ゲイン)を調整しようとするたびに、アクションとスピーカーのレスポンスの間に0.2〜0.5秒の遅延があります。オーディオデータは、4k~16kチャンク(16bit mono、22kHz~44k/s)で書き込まれます。リアルタイムのJavaサウンドボリューム調整

どのようにしてこのボリューム調整をよりリアルタイムに行うことができますか?

write(byte[], int, int)はFloatControlのゲイン調整をロックアウトしますか?

サウンドバッファのデータボリュームを同時に調整するDSPの方法に戻す必要がありますか、小さいチャンクを送信する必要がありますか?

JDK7、まともなWindowsのPC

+0

私が探していた答えではありませんでしたが、DSPソリューションのJava Game Developmentの書籍に戻る必要があります。 – akarnokd

答えて

2

サウンドシステムは、数(百...)キロバイトのチャンクにはSourceDataLineからデータを取得し、それらをバッファリング。 paramsを変更すると、システム再生バッファが空になりSDLから新しいデータが読み込まれるまで有効になりません。

あなたがする必要があるのは、提供したデータを変更するのではなく、システムの再生音量を変更することです(直ちに効果があります)。

+0

システムのマスターボリュームに迷惑をかけることは、私がJNI/JNAを実行する必要があると思うので、良い方法ではないようです。そして、私は個人的にそうするアプリケーションを嫌いです。さらに、音量や音量を変えて、音楽や他のサウンドを同時に再生する必要があります。 – akarnokd

+0

残念ながら、私はそれ以上のことをお手伝いすることはできません。これは、私がJavaSoundについて知っている唯一のものです。多くの予期しない方法で壊れています。:( – Marcin

+0

残念ながら、このトピックも私の専門家を超えています - これが私が尋ねた理由です。音の生成。 – akarnokd

0

Lineのミキサーに含まれるLine.Infoクラスに何らかの影響を与えたり作成したりすることができれば、その最小値バッファと最大値バッファを変更できます。次に、あなたはあなたがそれを供給しているチャンクのサイズに設定することができますし、遅れは無くなります(おそらく)

0

あなたはSourceDataLine.openを呼び出すときにカスタム(より低い) )?

SourceDataLine.open(AudioFormat format, int bufferSize) 

これにより、待ち時間が短縮されます。マスター再生ボリュームのソリューションは、おそらくより高速になるだろう。