重新启动Clip对象 - flush()方法

时间:2015-04-24 01:44:32

标签: java flush javasound clip javax.sound.sampled

Javadoc for DataLine.flush()

  

刷新该行的排队数据。刷新的数据被丢弃。在某些情况下,并非所有排队的数据都可以被丢弃。例如,混音器可以从缓冲区刷新特定输入行的数据,但仍然会播放输出缓冲区中已经存在的任何未播放数据(混合的结果)。如果你想跳过" stale"你可以在暂停一行(正常情况)之后调用这个方法。重新开始播放或捕获时的数据。 (冲洗未停止的线是合法的,但在活动线上这样做可能会导致数据不连续,从而导致可察觉的点击。)

这究竟是什么意思?

此外,为了重新启动Clip对象,此网站上的许多人建议使用此功能:

clip.stop();
clip.setFramePosition(0);
clip.start();

当使用上面的代码时,我注意到一个样本片段(如果重要的话,大约15秒)不会在开始时重新开始,并且在其重新开始的位置不一致。"但是,当我尝试

clip.stop();
clip.flush();
clip.setFramePosition(0);
clip.start();

剪辑完美无缺,并在声音开始时重新启动。我的问题是,flush()方法为修复我之前的问题做了什么?另外,为什么我首先遇到这个问题?

1 个答案:

答案 0 :(得分:4)

Clip这样的数据行有一个内部数据缓冲区,可能是byte[]。缓冲区通常在播放位置之前填充块。

假设在某个瞬间我们有:

            playback position
                   v
buffer:         [..|.....]
  file: [..........|.....................]

因此,如果我们停止该行,缓冲区仍然有数据 - 数据位于播放位置之前。

如果我们所做的只是设置播放位置,数据仍然存在,并在下次启动时播放。刷新该行会丢弃此数据。

我们也可以致电drain等待播放这些数据。