按顺序播放剪辑,可能会中断其他剪辑(使用javax.sound)

时间:2011-11-04 10:30:06

标签: java audio

我想创建一个简单的PlayClipManager类来管理音频剪辑的播放。它将有以下两种方法:

public void addAndPlay(Clip clip)
 {
  ...
 }

public void interruptAndPlay(Clip clip)
 {
  ...
 }

第一种方法应该将一个片段添加到队列中,并在队列中的其他片段完成后立即播放。第二种方法接受一个中断当前播放的剪辑,刷新队列并将其自身添加到它(它立即播放,因为它是队列中唯一的剪辑)。

如果有人可以访问Java Thread管理音频播放,这将很容易,但除非我弄错了,我认为没有错误(有一个AudioSystem类,但它没有帮助)。我看到这里有帖子显示如何使用LineListener来检查剪辑何时播放完毕,但我不确定如何在我的示例中具体使用它。另外,使用中断剪辑的方法,我想也可能存在一些并发问题。

任何帮助我如何解决这个问题非常感激。

感谢。

1 个答案:

答案 0 :(得分:0)

如果我没弄错的话,Clip会将播放行与音频数据捆绑在一起。

你打算排队实际的剪辑吗?他们多大?这可能占用大量内存。如果您正在存储声音文件的地址,并在播放时制作/加载 new 剪辑,那么最好使用SourceDataLine,因为它会更快地启动。 Clip必须先将整个文件加载到内存中才能开始播放。

以上是添加线条侦听器的tutorial。我认为它只是myClip.addLineListener(YourLineListener)。您可以对LineListener进行编码,以警告管理队列的任何内容以启动下一个Clip,并对所有剪辑使用相同的LineListener。

或者类似这样的东西会有所帮助,当你准备好播放队列时在新线程上调用它,并让LineListener成为播放Clip的runnable的一部分。

class PlayClipRunnable implements Runnable, LineListener {
    private Clip currentClip;
    private QueueManager queueManager;

    public PlayPadRunnable (Clip currentClip, 
            QueueManager myQueueManager) {
        this.currentClip = currentClip;
        this.myQueueManager = myQueueManager;
    }

    public void run() 
    {
        try 
        {
            currentClip.addLineListener(this);
            currentClip.start();
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

    @Override
    public void update(LineEvent event) {
        if (event.getType() == LineEvent.Type.STOP) {

            queueManager.clipIsStopped();
        }
    }
}

我不确定何时应该打开Clip。我也不确定如何放入一个用于中断Clip的钩子。也许如果QueueManager执行一个有效的currentClip.close()?在这种情况下使currentClip变得不稳定可能会有所帮助。但是我离开了我的深度。

我希望这些想法值得探索并引导您找到解决方案。