我在Java中看到一些奇怪的行爲與Clip
實例。音頻片段卡住
我正在處理的課程的目的是保持包含相同聲音樣本的Clip
個實例的數量的計數(索引爲URI
)。當應用程序請求播放一個片段並且已經有三個或更多片段通過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();
}
發生
奇怪的行爲,如果這種方法被稱爲快速連續多次(如20 1ms內次):
- 剪輯播放
- 剪輯觸發
START
事件以表示它已開始播放 - 剪輯永遠不會觸發
STOP
事件。 - 到
stop
和start
後續調用沒有任何效果(但不要拋出異常。) - getFramePosition總是返回
0
,即使當夾子聽得見(最後一次)
任何想法可能造成這種情況?
我不認爲這是一個線程問題(至少在我的代碼。)只有一個線程調用我的類的公共方法(和他們都是反正)
可能與this bug有關。
作爲一個快速測試,您可以嘗試在整個重新啓動方法的剪輯實例上同步,以排除任何線程問題。 – mdma 2010-06-25 20:22:09
@mdma,我會嘗試,但如果它有所作爲,我會感到驚訝。 'restart'只能從另一個'synchronized'方法調用。 – finnw 2010-06-25 20:54:07