2010-04-26 98 views
2

我一直在抛出一个异常。 当我尝试制作一个新的Sequencer对象时,我不断收到javax.sound.midi.MidiUnavailableException:Audio Device Unavailable异常。 所以,这里是代码:MidiSystem.getSequencer()返回音频设备不可用

import javax.sound.midi.*; 

public class MiniMusicPlayer1 
{ 
    public static void main(String[] args) 
    { 
    try 
    { 
     Sequencer sequencer = MidiSystem.getSequencer(); 
     sequencer.open(); 
     Sequence seq = new Sequence(Sequence.PPQ, 4); 
     Track track = seq.createTrack(); 
     for (int i = 5; i < 61; i += 4) 
     { 
     track.add(makeEvent(144, 1, i, 100, i)); 
     track.add(makeEvent(128, 1, i, 100, (i+2))); 
     } 
     sequencer.setSequence(seq); 
     sequencer.setTempoInBPM(220); 
     sequencer.start();    
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 

    public static MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) 
    { 
    MidiEvent event = null; 
    try 
    { 
     ShortMessage a = new ShortMessage(); 
     a.setMessage(comd, chan, one, two); 
     event = new MidiEvent(a, tick); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return event; 
    } 
} 

下面是完整的错误(编译):

javax.sound.midi.MidiUnavailableException: Audio Device Unavailable 
    at com.sun.media.sound.MixerSynth.implOpen(MixerSynth.java:165) 
    at com.sun.media.sound.AbstractMidiDevice.doOpen(AbstractMidiDevice.java:144) 
    at com.sun.media.sound.AbstractMidiDevice.openInternal(AbstractMidiDevice.java:134) 
    at com.sun.media.sound.AbstractMidiDevice.getReceiverReferenceCounting(AbstractMidiDevice.java:339) 
    at javax.sound.midi.MidiSystem.getReceiver(MidiSystem.java:243) 
    at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:442) 
    at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:348) 
    at MiniMusicPlayer1.main(MiniMusicPlayer1.java:9) 

首先我无法打在我的电脑MIDI文件,但后来我得到它的工作,所以现在我可以播放MIDI文件,没关系。 我甚至尝试关闭使用我的声卡的每个进程,但错误仍然存​​在。 任何人都可以帮助我?

+0

“首先,我无法打在我的电脑MIDI文件,但后来我得到它的工作,所以现在我可以播放MIDI文件,没关系”听起来像是你有它工作?你什么意思? 您应该删除“编译器错误”标签。这是一个典型的运行时错误。 – aioobe 2010-04-26 18:46:54

+0

我现在可以用另一个程序播放MIDI文件,比如胆怯,但我无法让这段代码正常工作。它总是告诉我,'音频设计是不可能的'。 我试图以root身份运行它,同样的错误。试图杀死所有使用我的声卡的进程,仍然有这个错误。 – ksemeks 2010-04-26 19:06:15

回答

1

检查您的进程列表以查看是否有程序正在运行的任何副本。如果它曾经的工作,赔率是好的,行:

sequencer.open(); 

失败,因为序已经打开另一个程序独占访问。可能地,“其他程序”只是您正在运行的程序的副本,仍然以任何原因运行。如果是这样,那么关闭的程序可能是“java”程序之一。这听起来像你已经尝试关闭其他midi程序。

另外,您可能会打开“错误”的MIDI设备。

Sequencer sequencer = MidiSystem.getSequencer(); 

只会打开“默认”设备。此默认设备可能是错误配置或不可用的,而您的工作程序正在使用的设备可能不同。这是一个渺茫的机会,这样的事情正在发生的事情,但你可能想通过返回的设备在此摘录

// Obtain information about all the installed synthesizers. 
Vector synthInfos; 
MidiDevice device; 
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); 
for (int i = 0; i < infos.length; i++) { 
    try { 
     device = MidiSystem.getMidiDevice(infos[i]); 
    } catch (MidiUnavailableException e) { 
      // Handle or throw exception... 
    } 
    if (device instanceof Synthesizer) { 
     synthInfos.add(infos[i]); 
    } 
} 
// Now, display strings from synthInfos list in GUI. 

中有更解释证明编写了类似

MidiSystem.getMidiDeviceInfo() 

和浏览详细地http://java.sun.com/docs/books/tutorial/sound/accessing-MIDI.html

+0

我从这个代码得到的输出是: 实时序列发生器 Java声音合成器 我试图strace程序,但我看不到在/ dev/..声音设备附近编程。 – ksemeks 2010-04-26 20:07:39

0

我的猜测是:

  1. 你的系统有N个O硬件合成器(或者它可是你的声卡驱动程序不能识别它。)
  2. Java的声音合成器无法打开,因为你没有安装音库
  3. 你仍然可以得到无关序与MidiSystem.getSequencer(false)尽管这不会很有用。因为他们执行自己的软件合成

应用,如胆怯不会受到影响。

它可能会使用virtual MIDI port通过胆怯从Java玩。

1

我不是要去尝试解释错误,但我做了以下解决我的问题,这是类似于你。

1。安装胆怯的球员

$ sudo apt-get install timidity

安装后执行球员

$ aplaymidi -l

1 Port Client name      Port name 
2 14:0 Midi Through      Midi Through Port-0 
在命令的情况下

上述方法无效,则可能需要重新启动机器

2.完成与instalat ALSA和OSS ALSA的离子(高级Linux声音架构)

$ sudo apt-get install alsa-oss

3.如果你使用Eclipse或执行文件

$ aoss java MidiClassTest

您可能需要使用另一个IDE ,例如

$ aoss eclipse

或使用别名

alias eclipse='aoss eclipse-indigo &'