Parallele Soundwiedergabe wirft Exception

fastjack

Top Contributor
Ich möchte per Threads mehrere AU-Files mit dem AudioClip abspielen. Das Threadsystem dazu steht bereits und funktioniert auch. Aber: Falls ein Sound gerade abgespielt wird und ein anderer starten will, bekomme ich sofort eine LineUnavailableException. Alles Standard, keine 3rd Party Libs wie jlayer oder so im Classpath, auch kein JMF.

Gleiche Misserfolge auch mit jLayer und JMF.

Das parallele Abspielen war doch mal möglich oder? Hat jemand eine Idee?

Code:
dmesg | grep sound
[    9.420580] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1b.0/sound/card0/input5
[    9.420729] input: HDA Intel PCH Line as /devices/pci0000:00/0000:00:1b.0/sound/card0/input6
[    9.420873] input: HDA Intel PCH Front Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input7
[    9.420998] input: HDA Intel PCH Rear Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input8
[    9.421111] input: HDA Intel PCH Front Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input9
[    9.421217] input: HDA Intel PCH Line-Out as /devices/pci0000:00/0000:00:1b.0/sound/card0/input10

java "1.6.0_38", Ubuntu 12.04
 
S

Spacerat

Gast
Oh ja, die hab' ich.
Mal unabhängig von der jeweiligen Hardware... kann die Ubuntu-JRE ein Audio-Device mehrfach öffnen? Ich bin zwar weder auf Windows noch auf Linux in den nativen Part der "javax.sound"-API vorgedrungen, aber zumindest wird schon vorher gefragt, ob eine Line zur Verfügung steht oder nicht. Auf nativer Seite könnte es passieren, dass das System "Device in already in use" meldet und die JVM deswegen diese Exception wirft, weil sie nicht mal an das bereits geöffnete Device kommt. In diesem Fall kämst du um Softwaremixing nicht rum.
Um festzustellen, wieviele Lines von einer Sorte parrallel laufen können, müsstet du dir zumindest den Standardmixer von AudioSystem besorgen und dort nachfragen:
Java:
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.SourceDataLine;

public final class PlaybackLinesAvailabe {
	public static void main(String[] args) {
		Mixer.Info[] infos = AudioSystem.getMixerInfo();
		Mixer.Info primary = null;
		for(Mixer.Info i : infos) {
			if(i.getName().contains("Prim")) {
				primary = i;
				break;
			}
		}
		if(primary == null) {
			System.err.println("no primary sound driver");
		}
		Mixer m = AudioSystem.getMixer(primary);
		DataLine.Info info = new DataLine.Info(SourceDataLine.class, new AudioFormat(44100, 16, 2, true, false));
		System.out.println(m.getMaxLines(info));
	}
}
Gibt es dort 'ne "-1", sollte die Parallelausgabe unbegrenzt funktionieren.
Im Übrigen unterstützt die Standard-JVM unabhängig von deiner Hardware nur bis zu 2 Kanäle, versuch' also keine Formate, die mehr haben.
 
Zuletzt bearbeitet von einem Moderator:

fastjack

Top Contributor
Code:
maxLines 1
mixerInfo: name=PCH [plughw:0,0], desc=Direct Audio Device: HDA Intel PCH, ALC888 Analog, ALC888 Analog,vendor=ALSA (http://www.alsa-project.org),version=1.0.24
mixerInfo: name=PCH [plughw:0,1], desc=Direct Audio Device: HDA Intel PCH, ALC888 Digital, ALC888 Digital,vendor=ALSA (http://www.alsa-project.org),version=1.0.24
mixerInfo: name=PCH [plughw:0,2], desc=Direct Audio Device: HDA Intel PCH, ALC888 Analog, ALC888 Analog,vendor=ALSA (http://www.alsa-project.org),version=1.0.24
mixerInfo: name=PCH [plughw:0,3], desc=Direct Audio Device: HDA Intel PCH, HDMI 0, HDMI 0,vendor=ALSA (http://www.alsa-project.org),version=1.0.24
mixerInfo: name=Port PCH [hw:0], desc=HDA Intel PCH, Intel CougarPoint HDMI,vendor=ALSA (http://www.alsa-project.org),version=1.0.24
no primary sound driver

ich habe noch die mixer infos ausgegeben. Weis leider immer noch nicht weiter...
 
S

Spacerat

Gast
MaxLines = 1 genügt völlig, um zu erkennen, dass man nur mit Softwaremixing klar kommt. Was zeigt er denn bei folgendem an?
Java:
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.SourceDataLine;
 
public final class PlaybackLinesAvailabe {
    public static void main(String[] args) {
        Mixer.Info[] infos = AudioSystem.getMixerInfo();
        for(Mixer.Info i : infos) {
          Mixer m = AudioSystem.getMixer(i);
          DataLine.Info info = new DataLine.Info(SourceDataLine.class, new AudioFormat(44100, 16, 2, true, false));
          System.out.println(m.getMaxLines(info));
        }
    }
}
Wenn die alle nur eine Line unterstützen... prost Mahlzeit.
 

fastjack

Top Contributor
Code:
0
1
0
1
0

... äh Prost Mahlzeit?

Unterstützen alle 0 oder 1. Mist. Vielleicht nen Ubuntu Bug oder so...
 
S

Spacerat

Gast
Tja... Mit 'nem Edding ein Minuszeichen vor die 1 (unendlich viele Lines) bringt's wohl nicht.
Hab's nur kurz angelesen, aber es scheint, als würde Java auf Linux noch OSS statt ALSA verwenden (wie auch immer das gehen soll ???:L)
Development Log - Reality's End
 

Oben