javax.sound.midi.Sequencer';s isRunning()返回false,即使它应该正在运行

javax.sound.midi.Sequencer';s isRunning()返回false,即使它应该正在运行,java,midi,Java,Midi,我有一个开放式MIDI音序器,它以一种特殊的播放文件方法播放序列 private void playFile (String filepath) { try { sequencer.setSequence(new FileInputStream(filepath)); sequencer.start(); } catch (Exception e) { System.out.println(e); } } 因为我想按一定的顺序播放几个文件

我有一个开放式MIDI音序器,它以一种特殊的播放文件方法播放序列

private void playFile (String filepath) {
    try {
        sequencer.setSequence(new FileInputStream(filepath));
        sequencer.start();
    }
    catch (Exception e) { System.out.println(e); }
}
因为我想按一定的顺序播放几个文件,所以我从别处调用playFile,等待Sequencer完成,然后再发送下一个文件

// ... (iterating through the files to be played)
playFile(currentFile.getPath);
currentFile.setPlaying(true);
while (sequencer.isRunning()) {
    try {
        Thread.sleep(100);
    }
    catch (Exception e) { System.out.println(e); }
}
这个很好用

现在,为了确保播放的文件之间没有声音间隙(每个文件的长度不到一秒),我尝试将睡眠时间减少到10秒,但开始遇到问题。等待的毫秒数越低,程序就越容易“跳过”文件——它们看起来根本不被播放。至少我没有听到他们的声音,而是下一个或更晚的一个

在while循环中添加System.out.println()表明,即使对于“跳过的”文件,循环实际上也至少输入了一次-在这种情况下,Sequencer必须运行。但是,在几毫秒后,没有声音输出isRunning()突然返回false,程序退出while循环,继续下一个文件。它通常看起来很像这样:


sequencer正在运行:true(当前文件:Takt22.mid)
sequencer正在运行:true(当前文件:Takt22.mid)
sequencer正在运行:true(当前文件:Takt22.mid)
sequencer正在运行:false(当前文件:Takt22.mid)
sequencer正在运行:false(当前文件:Takt128.mid)
sequencer正在运行:true(当前文件:Takt63.mid)
sequencer正在运行:true(当前文件:Takt63.mid)
...

在这种情况下,Takt128.mid不播放,Takt63.mid在Takt22.mid之后立即激活。但是,由于只输入了一次while,Sequencer必须已使用文件Takt128.mid运行了至少一小段时间(小于10毫秒,因为输出发生在该时间的Thread.sleep之后)

所有的文件都是好的,我都检查了它们,并确保这个错误不依赖于特定的文件,但可能发生在任何一个文件上。值得一提的是,看起来定序器有时会返回到不运行状态,没有明显的原因