2010-04-26 93 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 &'