LineUnavailableException nur unter Linux

Status
Nicht offen für weitere Antworten.

deathlock

Aktives Mitglied
Hallo Leute!

Ich verwende folgenden Code für einen AudioPlayer. Unter Windows funktioniert er prima, aber unter Linux bekomme ich immer eine LineUnavailableException. Kann mir jemand sagen woran das liegt? Vielen Dank.

Code:
import java.io.*;
import javax.sound.sampled.*;

class AudioPlayer
{
	private static final int	EXTERNAL_BUFFER_SIZE = 128000;
	File soundFile;
	AudioInputStream audioInputStream;
	
	public AudioPlayer()
	{
		soundFile = new File("test.wav");
		audioInputStream = null;
	}
		
	public void play()
	{
		try
		{
			audioInputStream = AudioSystem.getAudioInputStream(soundFile);
		}
		catch (Exception e)
		{
			MainClass.tfLog.setText("Error by trying to create AudioInputStream!");
		}

		AudioFormat	audioFormat = audioInputStream.getFormat();
		SourceDataLine	line = null;
		DataLine.Info	info = new DataLine.Info(SourceDataLine.class, audioFormat);
		try
		{
			line = (SourceDataLine) AudioSystem.getLine(info);
			line.open(audioFormat);
		}
		catch (LineUnavailableException e)
		{
			MainClass.tfLog.setText("Error by trying to reach SourceDataLine!");
		}
		catch (Exception e)
		{
			MainClass.tfLog.setText("Error by trying to open SourceDataLine!");
		}

		line.start();
		int	nBytesRead = 0;
		byte[]	abData = new byte[EXTERNAL_BUFFER_SIZE];
		while (nBytesRead != -1)
		{
			try
			{
				nBytesRead = audioInputStream.read(abData, 0, abData.length);
			}
			catch (IOException e)
			{
				MainClass.tfLog.setText("Error by trying to read stream size!");
			}
			if (nBytesRead >= 0)
			{
				int	nBytesWritten = line.write(abData, 0, nBytesRead);
			}
		}
		line.drain();
		line.close();
	}

}
[/code]
 
Hi,

ich denke mal, das liegt weniger an deinem Java-Code sondern an deiner Audio-Konfiguration.

Welches Sound-System benutzt du ? Benutzt du KDE ?

Ich hab mit dem Java-AudioSystem noch nichts gemacht. Das muß doch unter Linux bestimmt
konfiguriert werden, oder ?

Gruß
Mag1c
 
Nein ich benutze Gnome. Also an sich müsste es doch passen. Mein selbstprogrammierter AudioRecorder funktioniert problemlos und auch abspielen lässt sich das wav-File gut mit einem Linux-AudioPlayer, bloss mit meinem AudioPlayer gehts nicht. Soll ich vielleicht noch den Code vom AudioRecorder und von der MainClass posten, die spielen nämlich alle drei zusammen.

Ich könnte mir nur vorstellen, dass er entweder keine Rechte hat (was eigentlich nicht sein kann weil chmod 777), oder dass das File von einem anderen Prozess verwendet wird (was ich auch nicht glaube, da es im AudioRecorder nach der Aufnahme ordnungsgemäß geschlossen wird, und ausserdem unter Windows funktionierts).

Was sollte ich denn eventuell ändern an meinen Audio Konfigurationen?

LG, deathlock.
 
Hi,

wie ist denn das AudioSystem konfiguriert ? Soll die Ausgabe über /dev/dsp gehen ? Hast du
mal probiert, ob du über die Konsole dort was ausgeben kannst ?

Du könntest evtl. mit "lsof" feststellen, wer das Sound-Device geöffnet hat.

Der AudioRecorder greift ja auf ein Recording-Device zu. Das ist doch aus Sicht des Sound-Systems
ein eigenes Device. Der Zugriff darauf ist völlig unabhängig vom Ausgabe-Device.

Gruß
Mag1c
 
Hi danke für die Antwort. Ich muss leider erst noch schauen wie das AudioSystem konfiguriert ist, da ich hier in der Firma kein Linux habe. Werd dir nach Feierabend sofort zurückschreiben.

Auf alle Fälle freut es mich zu hören, dass Recording und Ausgabe gleichzeitig laufen können, aber da es ja dasselbe File ist, kann es doch trotzdem Probleme geben, oder?

Danke nochmals, deathlock.
 
Hi,

ja, die gleichzeitige Ein- und Ausgabe sollten moderne Soundkarten eigentlich alle beherrschen.
Leider gibt es immernoch Karten/Treiber, die das nicht oder nur fehlerhaft unterstützen.
Evtl. mußt du das erst noch am Treiber aktivieren.

Gruß
Mag1c
 
Guten Morgen,
Also ich hab mich jetzt mal in meinem Ubuntu umgesehn und die einzige Einstellung, die ich vornehmen kann ist, die Auswahl des Audiooutputs. Da gibt es vier Möglichkeiten und mit keiner von denen hat es funktioniert. Die Datei /dev/dsp gibts bei mir leider nicht und ich hätte auch keine Ahnung wie ich die Ausgabe darauf lenken könnte, bzw. wie ich zu dieser Datei kommen kann. Ich weiss leider auch nicht wie ich über die Konsole Sound ausgeben kann. Wie gesagt, die Ausgabe von wav-Files via Totem funktioniert, jedoch nicht mit meinem Programm.

Kannst du mir noch ein bisschen weiterhelfen?

Thx, LG, deathlock.
 
Moin,

hmm, das wird jetzt schwierig, da ich, wie schon geschrieben, das Java-AudioSystem noch nicht benutzt habe. Und Gnome nutze ich auch nicht :roll:
Wie genau sehen denn die Möglichkeiten für den AudioOutput aus ? Du müsstest mal herausbekommen,
welches Sound-System du benutzt und wie es konfiguriert ist.

Wenn du nicht weiterkommst, wäre mal der Output folgender Befehle interessant:

ps ax | grep sound
find /etc -name "*sound*"
ls -la /dev/sound
dpkg -l "*sound*"
dpkg -l "*alsa*"

Gruß
Mag1c
 
Also die vier Möglichkeiten, die ich auswählen kann sind:
- ALSA
- ESD
- OSS
- Custom
leider funktionierts mit keiner der besagten. Beim automatischen Ubuntu-Soundtest funktioniert nur ESD.

Der output der Befehle ist:

Code:
bojan@ubuntu:~$ ps ax | grep sound
 9935 pts/0    R+     0:00 grep sound
bojan@ubuntu:~$ find /etc -name "*sound*"
find: /etc/lvm/archive: Permission denied
find: /etc/lvm/backup: Permission denied
/etc/gconf/schemas/gnome-sound-recorder.schemas
/etc/gconf/gconf.xml.defaults/schemas/desktop/gnome/sound
/etc/gconf/gconf.xml.defaults/schemas/apps/gnome-sound-recorder
/etc/gconf/gconf.xml.defaults/schemas/apps/gnomemeeting/general/sound_events
/etc/gconf/gconf.xml.defaults/schemas/apps/sound-juicer
/etc/gconf/gconf.xml.defaults/schemas/apps/gossip/sound
/etc/gconf/gconf.xml.defaults/desktop/gnome/sound
/etc/gconf/gconf.xml.defaults/apps/gnome-sound-recorder
/etc/gconf/gconf.xml.defaults/apps/gnomemeeting/general/sound_events
/etc/gconf/gconf.xml.defaults/apps/sound-juicer
/etc/gconf/gconf.xml.defaults/apps/gossip/sound
/etc/esound
/etc/sound
/etc/sound/events/gtk-events-2.soundlist
/etc/sound/events/battstat_applet.soundlist
/etc/sound/events/iagno.soundlist
/etc/sound/events/gnobots2.soundlist
/etc/sound/events/gnibbles.soundlist
/etc/sound/events/gtk-events.soundlist
/etc/sound/events/gnome-2.soundlist
/etc/sound/events/gnome.soundlist
find: /etc/icecast2: Permission denied
bojan@ubuntu:~$ ls -la /dev/sound
ls: /dev/sound: No such file or directory
bojan@ubuntu:~$ dpkg -l "*sound*"
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
ii  esound         0.2.35-2ubuntu Enlightened Sound Daemon - Support binaries
un  esound-alsa    <none>         (no description available)
un  esound-clients <none>         (no description available)
ii  esound-common  0.2.35-2ubuntu Enlightened Sound Daemon - Common files
ii  libasound2     1.0.8-1        ALSA library
ii  sound-juicer   2.10.1-0ubuntu GNOME 2 CD Ripper
un  sound-monitor  <none>         (no description available)
ii  ubuntu-sounds  0.3            Ubuntu's GNOME audio theme
un  zinf-plugin-es <none>         (no description available)
bojan@ubuntu:~$ dpkg -l "*alsa*"
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
un  alsa           <none>         (no description available)
ii  alsa-base      1.0.8-4ubuntu4 ALSA driver configuration files
un  alsa-base-0.4  <none>         (no description available)
un  alsa-modules   <none>         (no description available)
un  alsa-oss       <none>         (no description available)
ii  alsa-utils     1.0.8-1ubuntu1 ALSA utilities
un  alsa-utils-0.5 <none>         (no description available)
un  alsa-xmms      <none>         (no description available)
un  alsaconf       <none>         (no description available)
un  alsaconf-0.4   <none>         (no description available)
un  alsalib        <none>         (no description available)
un  alsalib0.1.3   <none>         (no description available)
un  alsalib0.3.0   <none>         (no description available)
un  alsalib0.3.2   <none>         (no description available)
un  alsautils      <none>         (no description available)
un  esound-alsa    <none>         (no description available)
ii  gstreamer0.8-a 0.8.8-1ubuntu4 ALSA plugin for GStreamer
un  libarts-alsa   <none>         (no description available)
un  libesd-alsa0   <none>         (no description available)
un  libesd-alsa0-d <none>         (no description available)
un  libkmid-alsa   <none>         (no description available)
ii  libpt-plugins- 1.8.4-1        Portable Windows Library Audio Plugin for th
un  libsdl1.2debia <none>         (no description available)
un  zinf-plugin-al <none>         (no description available)

Das Ganze sagt mir leider nicht viel. Weisst du da was?

Vielen Dank, lg, deathlock.
 
Übrigens habe ich festgestellt, dass es auch unter Windows, bzw. anderen Linuxsystemen zu Problemen kommt (konkrät: der AudioRecorder funktioniert nicht - wenn ich recorde, wird einfach ein leeres Audiofile erstellt.

Hier nochmal der SourceCode vom AudioRecorder:

Code:
import javax.sound.sampled.*;
import java.io.*;

class AudioRecorder extends Thread
{
	private TargetDataLine m_line;
	private AudioFileFormat.Type m_targetType;
	private File m_outputFile;
	private AudioInputStream m_audioInputStream;
	
	public AudioRecorder()
	{
		File outputFile;
		AudioFormat	audioFormat;
		DataLine.Info	info;
		TargetDataLine	targetDataLine = null;
		AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
		
		outputFile =  new File("test.wav");
		audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100.0F, 16, 2, 4, 44100.0F, false);
		info = new DataLine.Info(TargetDataLine.class, audioFormat);
		
		try
		{
			targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
			targetDataLine.open(audioFormat);
		}
		catch(LineUnavailableException e)
		{
			MainClass.tfLog.setText("Errory by creating DataLine!");
		}

		m_line = targetDataLine;
		m_targetType = targetType;
		m_audioInputStream = new AudioInputStream(targetDataLine);
		m_outputFile = outputFile;	
		targetDataLine.close();
	}
	
	public void startRecording()
	{
		m_line.start();
		super.start();
	}
	
	public void stopRecording()
	{
		m_line.stop();
		m_line.close();
		try
		{
			m_audioInputStream.close();
		}
		catch(IOException e)
		{
			MainClass.tfLog.setText("Error by closing audioInputStream!");
		}
	}
	
	public void run()
	{
			try
			{
				AudioSystem.write(
					m_audioInputStream,
					m_targetType,
					m_outputFile);
			}
			catch (IOException e)
			{
				MainClass.tfLog.setText("Error by writing of AudioStream!");
			}
	}
}
 
Moin,

also ich würde dir ja gerne weiterhelfen. Aber ich habe den ganzen Kram noch nie benutzt und im Moment keine Zeit, das auszuprobieren. Wäre gut, wenn sich mal jemand findet, der mit dem AudioSystem schon programmiert hat.

Gruß
Mag1c
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben