PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sound, Koexistenz mit anderen Programmen



BlueJay
17-11-2007, 07:36
Hallo Leute,

ich versetze eine Application mit Soundeffekten, das läuft auch soweit.
Nur:
Mit Qt/C++ (aRTs, NAS) gab es eine friedliche Koexistenz der Programme, unter Java nicht mehr. So ist es z.B. nicht mehr möglich, Amarok und ein Java-Programm gleichzeitig zu hören, wer zuerst kommt, darf Files abspielen.

Bisheriger Code:

// Java-Soundmodul by uja 26.10.07
// Aufruf: my_soundmodul.play_sound(nr);

package grube;
import java.io.*;
import javax.sound.sampled.*;

public class soundmodul
{
String pfad="/grube/sounds/";
String[] wavfile= { "mausklick.wav","treffer.wav","zusammenfallen.wav","abfall.wav","levelup.wav","over.wav","explo.wav" };
Clip[] saund=new Clip[wavfile.length]; // Sound-Effekt-Puffer

// alle Sounds vorladen:
soundmodul()
{ for (int i=0; i<wavfile.length; i++)
{ try
{ // aus Jar laden:
AudioInputStream ais=AudioSystem.getAudioInputStream(this.getClass( ).getResourceAsStream(pfad+wavfile[i]));
AudioFormat af = ais.getFormat();
// Clip erzeugen und oeffnen, dabei in Frames umrechnen
DataLine.Info info = new DataLine.Info(Clip.class,af,((int) ais.getFrameLength()*af.getFrameSize()) );
saund[i] = (Clip)AudioSystem.getLine(info);
// ready for use:
saund[i].open(ais);
}
catch (Exception e) { System.out.println("Sound-Problem bei: "+pfad+wavfile[i]); }
}
}

void play_sound(int nr) { saund[nr].setFramePosition(0); saund[nr].start(); }
void stop_sound(int nr) { saund[nr].stop(); }

void close_soundall()
{ for (int i=0; i<wavfile.length; i++)
saund[i].close();
}

}


Wenn Amarok schneller ist, rennt's in die Exception rein.
Ist Java schneller, meldet mir Amarok: "Xine-Treiber nicht initialisiert."

Abhilfe?

so long,
Bluejay

mehlvogel
17-11-2007, 08:01
Abhilfe kann ich dir so direkt nicht anbieten, es liegt aber daran das Softwaremixing unter Linux standardmäßig von Alsa nicht aktiviert ist - bei meiner Soundkarte/Distribution zumindest. Für solche Gründe wurde annodazumal arts und Konsorten erstellt. Ich vermute dass Java einfach direkt auf Alsa zugreift und somit das Gerät blockiert.

Lösungansätze könnten demnach also sein, die Java Soundausgabe an arts zu übergeben oder in alsa das Software Mixing zu aktivieren. Für ersteres weiß ich keine Lösung, da ich arts nicht kenne, für zweiteres müsstest du je nach Distribution nach entsprechenden Anleitungen suchen, allerdings habe ich das bei mir auch noch nicht zufriedenstellend lösen können.

BlueJay
17-11-2007, 11:00
Software-Mixing muss aktiviert sein, denn Amarok und einige (ältere) C++-Programme, die aRts benutzen, dudeln fröhlich durcheinander.

Ich denke auch, dass sich diese Java-Version (Sun 1.6.0_03) das ganze Sound-System unter den Nagel reißt, so wie es mit gutem Grund Audacity tut.

Meine Hoffnung auf Classes, die nur einen Soundserver anschubsen, muss ich wohl begraben.

anda_skoa
17-11-2007, 14:19
Eventuell lässt sich über Properties steuern, wie die javax.sound Implementierung arbeitet, z.B. ein soundserverfähiges Backend benutzt.

Alternativ könntest du versuchen, die JVM mit einem der Soundserver Wrapper zu starten, z.B. für aRts

artsdsp java "argumente von java"

Ciao,
_

BlueJay
29-11-2007, 12:20
Nice try, aber Satz mit x: "artsdsp works only for binaries".

Wobei ich eigentlich nichts dagegen hätte, das Java-Zeuchs durch einen nativen Compiler zu jagen, wenn ich denn mal einen hätte.

anda_skoa
29-11-2007, 15:43
Ist "java" bei dir am System kein Binary?

Ciao,
_

BlueJay
29-11-2007, 16:52
So sieht es zwar aus, aber Sun Java 1.6 wird von artsdsp nicht als binary anerkannt, Die Meldung kommt auch ohne irgendwelche zusätzlichen java-Parameter. (Linux gentoo x-86_64 2.6.22-rc8)
Und Einpacken in Gänsefüßchen hilft da auch nix.

Spuckt da ein ClassLoader in die Suppe?

anda_skoa
29-11-2007, 19:18
Was sagt


file $(which java)

bei dir?

Bzw. falls das ein Link ist, worauf er zeigt?

Sonst

Ciao,
_

BlueJay
29-11-2007, 20:56
... auf usr/bin/java
artsdsp mag dieses Java trotzdem nicht.

anda_skoa
01-12-2007, 17:11
Es scheint da eine Möglichkeit zu geben, in einem Java Properties File Angaben zum Soundsystem zu machen:
http://ohioloco.ubuntuforums.org/showthread.php?t=497589

Ciao,
_