2011-11-04 54 views
0

我想创建一个简单的PlayClipManager类来管理音频剪辑的播放。这将有以下两种方法:按顺序播放剪辑,并有可能中断其他剪辑(使用javax.sound)

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

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

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

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

任何帮助我如何解决这个非常赞赏。

谢谢。

回答

0

如果我没有弄错,剪辑会将播放行与音频数据捆绑在一起。

你打算排队实际的剪辑?他们多大?这会占用大量的记忆。如果您要存储声音文件的地址,并在播放时制作/加载新的剪辑,则最好使用SourceDataLine,因为它会更快地启动。剪辑必须在开始播放之前将整个文件加载到内存中。

以上是用于添加线监听器的tutorial。我认为这只是myClip.addLineListener(YourLineListener)。您可以对LineListener进行编码,以提醒管理队列的任何事件以启动下一个剪辑,并对所有剪辑使用相同的LineListener。

或者也许像这样的东西会有帮助,当您准备好播放队列时将其称为新线程,并让LineListener成为播放剪辑的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(); 
     } 
    } 
} 

我不知道什么时候剪辑应该打开。我也不确定如何放置中断剪辑的钩子。也许,如果QueueManager执行currentClip.close(),那将起作用吗?在这种情况下使currentClip易变可能会有所帮助。但我正在走出自己的深度。

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

相关问题