2010-04-26 6 views
2

У меня есть исключение, которое можно включить и выключить. Когда я пытаюсь создать новый объект Sequencer, я продолжаю получать исключение javax.sound.midi.MidiUnavailableException: Audio Device Unavailable. Итак, вот код:MidiSystem.getSequencer() возвращает Audio Device Unavailable

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

+0

Теперь я могу играть в MIDI-файлы с другой программой, скажем, робость, но я не могу заставить этот код работать. Он всегда говорит мне, что «Audio Devise не может быть». Я попытался запустить его как root, такую ​​же ошибку. Пытался убить все процессы, которые используют мою звуковую карту, все еще получил эту ошибку. – ksemeks

ответ

1

Проверьте список процессов, чтобы узнать, есть ли какие-либо копии программы. Если он когда-то работал, хорошие шансы, что линии:

sequencer.open(); 

терпит неудачу, потому что секвенсор уже открыт для монопольного доступа другой программой. Возможно, что «другая программа» - это всего лишь копия программы, которую вы все еще работаете по какой-либо причине. Если это так, то программа для закрытия может быть одной из программ «java». Похоже, вы уже экспериментировали с выключением других миди-программ.

Кроме того, вы можете открыть «неправильное» MIDI-устройство.

Sequencer sequencer = MidiSystem.getSequencer(); 

Открывает только устройство по умолчанию. Это устройство по умолчанию может быть неправильно настроено или недоступно, в то время как устройство, которое ваши рабочие программы используют, может быть другим. Это небольшой шанс, что такая вещь происходит, но вы можете закодировать что-то вроде

MidiSystem.getMidiDeviceInfo() 

и просматривать возвращенные устройства, как показано в этой выдержке

// 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. 

что объясняется более подробно на http://java.sun.com/docs/books/tutorial/sound/accessing-MIDI.html

+0

Выход из этого кода: В режиме реального времени Sequencer Java Sound Synthesizer Я попытался спрятать программу, но я не вижу прогонов в любом месте рядом с звуковым устройством в/dev/... – ksemeks

0

Мое предположение:

  1. Ваша система имеет п о аппаратный синтезатор (или, возможно, это делает, но драйвер звуковой карты не распознает его.)
  2. Java-синтезатор звука не удается открыть, потому что у вас нет soundbank не установлен
  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-ОСС ALSA (Advanced Linux Sound Architecture)

$ sudo apt-get install alsa-oss

3. Запустите файл

$ aoss java MidiClassTest

Если вы используете Eclipse, или другой IDE вы можете использовать , так как, например

$ aoss eclipse

или использовать псевдоним

alias eclipse='aoss eclipse-indigo &'