javax.sound.midi.Sequencer的isRunning()返回false,即使它应该运行

时间:2015-02-11 15:43:27

标签: java midi

我有一个打开的MIDI音序器,可以在一个特殊的playFile方法中播放序列。

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之后)。

所有文件都没问题,我都检查过它们并确保这个bug不依赖于特定文件但可能发生在任何文件中。对于所有它值得它看起来像序列器有时会返回不运行,没有明显的理由。

0 个答案:

没有答案