如果我没有弄错,剪辑会将播放行与音频数据捆绑在一起。
你打算排队实际的剪辑?他们多大?这会占用大量的记忆。如果您要存储声音文件的地址,并在播放时制作/加载新的剪辑,则最好使用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易变可能会有所帮助。但我正在走出自己的深度。
我希望这些想法值得探索,并引导您找到解决方案。