Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich

Haave

Top Contributor
Hallo,

ich habe ein Problem mit einem Code aus "Head First Java". Der Code lässt sich sowohl auf meinem Netbook (Ubuntu 9.10, Java-Version 6.20) als auch auf meinem Tower (Ubuntu 9.04, Java-Version 6.20) kompilieren. Auf dem Tower kommt es jedoch beim Ausführen sofort zu einer Runtime Exception, während das Programm auf dem Netbook funktioniert. Hier mal der Stacktrace:
Code:
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 MiniMiniMusicApp.play(MiniMiniMusicApp.java:12)
	at MiniMiniMusicApp.main(MiniMiniMusicApp.java:7)

Das ist der Code (ich hoffe, ich bekomme hier jetzt keine Probleme mit dem Urheberrecht). Die Ausgabe des Programms soll ein einzelner Ton sein (nicht über die Endlosschleife wundern, der Code wird im Buch im Anschluss noch weiter umgebaut).
Java:
import javax.sound.midi.*;

public class MiniMiniMusicApp {
	
	public static void main(String[] args) {
		MiniMiniMusicApp mini = new MiniMiniMusicApp();
		mini.play();
	}
	
	public void play() {
		try {
			Sequencer player = MidiSystem.getSequencer();
			player.open();
			
			Sequence seq = new Sequence(Sequence.PPQ, 4);
			Track track = seq.createTrack();
			
			ShortMessage a = new ShortMessage();
			a.setMessage(144,1,44,100);
			MidiEvent noteOn = new MidiEvent(a,1);
			track.add(noteOn);
			
			ShortMessage b = new ShortMessage();
			b.setMessage(128,1,44,100);
			MidiEvent noteOff = new MidiEvent(b,16);
			track.add(noteOff);
			
			player.setSequence(seq);
			player.start();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

Hat jemand eine Idee, woher der Fehler kommt und wie ich ihn beheben kann? Fehlt unter Ubuntu 9.04 vielleicht etwas bestimmtes Notwendiges, was bei 9.10 vorhanden ist?


(Nebenbei: Ganz sauber läuft der Code auf dem Netbook allerdings auch nicht: Wenn ich das Programm nach dem Kompilieren das erste Mal starte, kommt gar nichts, sondern erst ab dem zweiten Mal Starten kommt der gewünschte Ton. Eigenartig ???:L)
 
Zuletzt bearbeitet von einem Moderator:

Haave

Top Contributor
Das Problem hat sich von selbst erledigt. Hab das Teil einfach aus Spaß ein paar Stunden später nochmal kompiliert und plötzlich funktionierte es. Sind mir suspekt, diese Sound-Klassen… xD
 

Haave

Top Contributor
Heute ist das Problem bei einem neuen Programm, das javax.sound benutzt, erneut aufgetreten. Aufgrund der Umstände gelang es mir diesmal, das Problem recht deutlich einzugrenzen:

Als ich es am Nachmittag testete, lief das Programm ohne Schwierigkeiten. Als ich es am Abend, während ich über Mumble mit jemandem redete, noch einmal testete, kam es wieder zu der oben gezeigten Exception "MidiUnavailableException: Audio Device Unavailable". Desweiteren stelle ich fest, dass das Java-Programm auch nicht läuft, wenn ich nebenbei eine Musikdatei abspiele nicht. Es hat also offenbar ein Problem mit anderen Prozessen, die zeitgleich ebenfalls auf die Audiogeräte zugreifen, die es benötigt.

Ist dieses Problem jemandem von euch bekannt? Kann ich das irgendwie lösen?
Über eine Rückmeldung würde ich mich freuen.
 

faetzminator

Gesperrter Benutzer
Ist mir mit ALSA bekannt, dass jeweils nur ein Programm auf den Channel schreiben kann, danach ist er besetzt. Du kannst natürlich mehrere Channels machen oder irgendwas vor ALSA setzen (ich geh mal davon aus, dass du ALSA verwendest).
 

Ark

Top Contributor
Ist mir mit ALSA bekannt, dass jeweils nur ein Programm auf den Channel schreiben kann, danach ist er besetzt. Du kannst natürlich mehrere Channels machen oder irgendwas vor ALSA setzen (ich geh mal davon aus, dass du ALSA verwendest).
Wenn dem so ist: wie sage ich der VM, wo sie sich "ranhängen" soll? Was ist z.B., wenn die VM unbedingt meint, /dev/dsp benutzen zu müssen?

Ark
 

Haave

Top Contributor
Ist mir mit ALSA bekannt, dass jeweils nur ein Programm auf den Channel schreiben kann, danach ist er besetzt. Du kannst natürlich mehrere Channels machen oder irgendwas vor ALSA setzen (ich geh mal davon aus, dass du ALSA verwendest).
Ja, ich benutze ALSA bzw. PulseAudio, aber das gibt sich wohl nicht viel. Auf dem Netbook habe ich gerade mal die gleiche Situation heraufbeschworen (Musikdatei abgespielt und Programm gestartet) und es kommt zum gleichen Fehler (ich vermute, dass ich es auf dem Netboook bisher nicht beobachtete, weil ich auf dem etwas herzschwachen Gerätchen dazu tendiere, möglichst wenig gleichzeitig laufen zu lassen). Deshalb möchte ich auch gern einen Mod bitten, den Titel des Threads zu ändern auf "Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich" (sofern das das Problem gut beschreibt) :)
 

Ähnliche Java Themen

Neue Themen


Oben