我看到Clip
Java 中的实例有一些奇怪的行为。
我正在处理的类的目的是计算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();
}
如果快速连续多次调用此方法(例如 1ms 内 20 次),则会出现奇怪的行为:
- 剪辑播放
- 剪辑触发一个
START
事件以表明它已开始播放 - 剪辑从不触发
STOP
事件。 - 后续调用
stop
并start
没有效果(但不要抛出异常。) - getFramePosition总是返回
0
,即使剪辑是可听的(最后一次)。
知道是什么原因造成的吗?
我认为这不是线程问题(至少在我的代码中没有。)只有一个线程在调用我的类的公共方法(synchronized
无论如何它们都是)
可能与此错误有关。