# Java Sound und gleichzeitger Zugriff auf Soundkarte



## oliver1974 (2. Mai 2007)

Hallo zusammen,

Mal folgende Frage:

Ich experimentiere hier gerade unter Linux mit Java 6 und der Sound API.

Ein Problem was ich hier habe, ist die Tatsache, dass die Soundausgabe für Java
nicht mehr erreichbar ist, wenn bereits eine Soundanwendung läuft,
obwohl die Soundkarte und deren Treiber wohl offensichtlich Multiplexing
fähig ist, so laufen mehrere Soundanwendungen unter meinem KDE hier
gleichzeitig problemlos, was die Ausgabe angeht.

Nur Java hätte es gerne offensichtlich exclusiv und meldet eine
"LineUnavailableException".

Umgekehrt haut Java auch gerne andere Applikationen weg, die den Treiber
benutzen wollen, wenn es das "Glück" hat, selbst zuerst an den Sound zu kommen.

Das ganze hört sich stark nach dem Thread hier an:

http://www.java-forum.org/de/viewtopic.php?t=22782

Ich vermute nun stark, dass die Sound API nicht korrekt über ALSA geht, sondern
sich aus unerfindlichen Gründen direkt das Device schnappt und einen Lock drauf setzt.

ALSA ist aber als aktives Soundsystem gesetzt, insofern kein Problem, Java scheint dies
zu ignorieren.

Man findet im Netz fast nichts, aber auch gar nichts zu dem Thema, nur ein ominöses Paket
was ich bei Suse gesichtet habe.

java-1_5_0-sun-alsa-1.5.0_10-0.1.i586

Das gleiche gibt es auch recht frisch für die Java 6 Version.

Auch konkret dazu findet man nicht viel Infos, der Hinweis zu dem Paket ("ALSA Support
for Java 1.5") und ähnliches deutet aber schon darauf hin, dass es da ein Problem gibt
und einige Distributoren das angehen.. aber mich würde mal interessieren, ob man 
das auch anders lösen kann? Bei anderen Distris ist nämlich nix diesbezügliches
zu finden... und das wird natürlich wieder häßlich, wenn man User erst dazu
bewegen muß sein System anzupassen/zu patchen nur damit die Anwendung läuft.

Es überrascht mich auch ein bißchen, dass da erst so wenige Leute darüber gestolpert sind,
hat sonst keiner das Problem?

Gruß,

Olli


----------



## oliver1974 (18. Mai 2007)

Ich seh schon, das Thema trifft ja auf Begeisterung hier...  :wink: 

Ich zitiere mal
http://www.jsresources.org/faq_audio.html#alsa_mixing


--------------------------------
5.5.	

How can I enable mixing with the "Direct Audio Device" mixers on Linux?


The "Direct Audio Device" implementation on Linux is based on ALSA. *Mixing is available in the Mixer instance if ALSA provides mixing. This is the case if the soundcard can do mixing in hardware and its ALSA driver supports this feature. *This is true for some common soundcards like Soundblaster LIFE! and Soundblaster Audigy and cards based on the Trident 4D Wave NX chipset. If this feature is available at all, it needs no special configuration. It is enabled by default.

*Using ALSA's dmix plug-in does not work together with Java Sound.* The reason is that the "Direct Audio Device" mixer implementation based on ALSA queries the available hardware devices. However, a dmix device in ALSA is no hardware device, so it is not recognized. Discussions about this issue led to the conclusion that there is no easy way to integrate a query for additional devices.
--------------------------------

Na, das ist ja mal ganz großes Kino.....

Im Klartext stehen damit all die Nutzer von Onboard-Soundchips ohne Hardware-Mixing unter Linux
im Regen... und das sind eine ganze Menge.

IMHO eine Katastrophe, wenn man Multi-Plattform-Entwicklung wirklich ernst nimmt... mir fällt nur keine
einfache Alternative ein??


----------



## Guest (20. Mai 2007)

Junge, Junge... Das Thema sorgt ja für richtig Aufruhr hier.. ;-)

Sooo...

Ich hab mich jetzt mal AUSGIEBIG mit dem Thema "Java und Sound" beschäftigt... Es läuft einem kalt den Rücken runter...

Also:

Das Thema "Java Sound API" ist, genau wie das "Java Media Framework" ein ungeliebtes Kind von SUN... Irgendwie
kümmern die sich nicht (mehr) um diese Geschichten, so ist mein Eindruck.

Das Java Media Framework (JMF) ist z.B. seit ca. 2004 nicht mehr verändert worden.. daran arbeitet wohl keiner
mehr dran. Katastrophal in den Augen so mancher... Zurecht, da z.B. unter Linux eine ganze Latte von Codecs nicht
unterstützt werden, in Windows aber sehr wohl... was natürlich für eine Cross-Plattform Geschichte wie Java natürlich
Irrsinn hoch drei ist....

Nun, es ging ja hier um Java und Sound... aber hier ist es ähnlich....

Ich gehe jetzt nicht in die Tiefe, was ich so in diversen anderen Programmierforen gelesen habe (...wieviel Leute
SUN abgestellt hat (oder HATTE) um die Java Sound API zu pflegen... aber es waren unglaublich wenig), nur die
Ergebnisse:

1.) Die Java Sound API kann Soundkarten OHNE Hardwaremixing NICHT so ansprechen, dass softwaremixing über ALSA möglich wäre...
dmix + Java Sound API geht nicht, PUNKT!!!!!! (Ja, alle mal mit den Kopf schütteln an der Stelle)
2.) Findet Java ein ALSA-Sounddevice, das hardwaremixing unterstützt, ist alles super, es nimmt das Device und fertig.
3.) Findet Java ein ALSA-Sounddevice, aber das Device oder dessen Treiber unterstützt kein Hardwaremixing, fällt es auf OSS zurück.
4.) Demzufolge muss man versuchen, OSS + ALSA zum (simultanen) Zusammenspiel zu überreden.. Hier kommt der gute alte "aoss"
Befehl zum Tragen.. Auf meiner Mandriva Installation hier ging das sogar auf Anhieb, ohne Rumfummeln an ".asoundrc" oder Konsorten.
Wie das auf Ubuntu aussieht, weiß ich jetzt nicht, da ich momentan keine Kubuntu-Installation habe, die ich wirklich täglich nutze...
Müsste jemand hier mal gegenchecken.. Eventuell sind ja da noch Anpassungsarbeiten an der ".asoundrc" erforderlich.

Also:
"aoss java (...hier die Optionen und die aufzurufende Klasse)"

Klappte dann bei mir wunderbar.

Voraussetzung ist allerdings, dass der Programmierer nicht versucht, den direkten Zugriff auf das ALSA Device zu ERZWINGEN,
was er durchaus machen kann.... dann gibts eigentlich keine Lösung.

Auch ist es nicht gut, eine Riesen-Java-Applikation in aoss "einzupacken", ich hab hier spaßeshalber
mal die Netbeans IDE mit aoss gewrapped, und es hat mir echt fast das ganze System zerrissen.. ich musste per
SSH von aussen rauf und alle Java-Prozesse abschiessen, sonst war gar nix mehr zu wollen, da das Teil
fast komplett eingefroren war, nicht mal mehr ein Wechsel zu den Textkonsolen war mehr möglich...

Jedenfalls weiß ich das ganze jetzt, weil ich selber gerade an einem Java-Spielchen arbeite.. und mich mit der Java Sound API herumschlagen
darf...


----------



## oliver1974 (20. Mai 2007)

Mist, war als Gast eingelogged... Die letzte Antwort war jedenfalls vom mir.


----------

