Clip
Javaのインスタンスで奇妙な動作が見られます。
私が取り組んでいるクラスの目的はClip
、同じサウンドサンプルを含むインスタンスの数をカウントすることです(によってインデックスが付けられURI
ます)。アプリケーションがクリップの再生を要求し、同じソースからのクリップがすでに3つ以上再生されている場合、次の手順が実行されます。
PAN
現在再生中のクリップをとの加重和で並べ替えframePosition
ます。- 停止して再開するクリップとして、値が最も高いクリップを選択します。
- クリップを再開します(次の方法)。
void restart(Clip clip, float gain, float pan) {
clip.stop();
clip.flush();
pan = Math.max(-1f, Math.min(pan, 1f));
((FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN))
.setValue(gain);
((FloatControl) clip.getControl(FloatControl.Type.PAN))
.setValue(pan);
clip.setFramePosition(0);
clip.start();
}
このメソッドがすばやく連続して何度も呼び出されると(たとえば、1ミリ秒以内に20回)、奇妙な動作が発生します。
- クリップが再生されます
- クリップは、
START
再生が開始されたことを通知するイベントを発生させます - クリップが
STOP
イベントを発生させることはありません。 - 以降の呼び出しは効果が
stop
ありstart
ません(ただし、例外をスローしないでください)。 - getFramePosition
0
は、クリップが(最後に)聞こえた場合でも、常にを返します。
これを引き起こしている可能性のあるアイデアはありますか?
私はそれがスレッドの問題ではないと思います(少なくとも私のコードでは)。1つのスレッドだけが私のクラスのパブリックメソッドを呼び出しています(そしてそれらはすべてsynchronized
とにかくです)
このバグに関連している可能性があります。