Pulseaudio

Aus wiki.archlinux.de

Dieser Artikel oder Artikelabschnitt ist noch nicht vollständig!


Hier werde ich den Englischen Text übersetzen und teilweise mit meinen eigenen Erfahrungen anreichern. Allerdings habe ich keine Ahnung, ob das, was ich getan habe, die Sicherheit beeinträchtigt, oder in der Art auch so gemacht werden soll. Teilweise nehme ich auch Informationen aus dem Ubuntuwiki.

Anmerkungen von mir sind in [eckigen Klammern].


Einleitung

PulseAudio (vormals PolypAudio) ist ein Soundserver für POSIX und Win32 Systeme. Mit ihm können mehrere Programme gleichzeitig Sound auf einem Computer ausgeben, zudem hat er viele weitere Features. PulseAudio ist ein "drop-in"-Ersatz (ein direkter Ersatz) für den Enlightened Sound Daemon (esd oder esound). Programme, die esd verwenden, können problemlos auch PulseAudio verwenden.


Pulseaudio ist direkter Ersatz für aRts. Wenn du KDE benutzt, kannst du momentan PulseAudio nicht benutzen.

[Ist das aktuell? Kann Phonon unter KDE4 oder kdemod Pulseaudio? Das Xine Backend bietet esd Output an, aber ich habe ihn nicht zum Laufen gebracht. Im Ubuntuwiki wird für KDE3 beschrieben, dass Pulseaudio funktioniert, wenn man ESD statt aRts benutzt. Kann das jemand mal überprüfen?]


Dieser Artikel beschreibt hauptsächlich die grundlegenden Features von Pulseaudio.

PulseAudio läuft nach dieser Anleitung im system-wide Modus, das heißt, er wird beim Systemstart geladen und jeder Benutzer greit auf diese Instanz zu.

Installation

Alle Pakete sind im community Repository vorhanden, du musst dieses also aktiviert haben. Um PulseAudio zu installieren:

pacman -Sy pulseaudio 

Optional kannst du GTK Front-ends für Pulseaudio installieren (empfohlen):

pacman -Sy padevchooser paman paprefs pavucontrol

Für Anwendungen, die zwar ALSA, aber nicht PulseAudio unterstützen, ist es empfohlen, das PulseAudio Plugin für die alsalibs zu installieren. Dieses Plugin ist im alsa-plugins Paket.

pacman -Sy alsa-plugins



Konfiguration

Hier wird die Konfiguration nach der Installation beschrieben, die man auch durchführen muss, wenn du PulseAudio mit dem Commandline Interface installiert wird (CLI = Ein Terminal).

[Das habe ich jetzt nicht verstanden??]


Zuerst wird der PulseAudio Daemon in die /etc/rc.conf eintragen, damit er beim Systemstart schon gestartet wird.

[Hier wird Pulseaudio eindeutig als system-wide daemon konfiguriert, womit der gnome Teil da doch überholt ist?]

Beispiel:

DAEMONS=(syslog-ng ipw3945d network netfs crond fam hal avahi-daemon pulseaudio)

Um den PulseAudio Device Chooser (padevchooser) zu verwenden, trägt man am Besten auch "avahi-daemon" ein.

Danach wird der eigene Benutzer (und natürlich jeder Andere Benutzer, der Sound ausgeben können soll) zu der Gruppe pulse-access hinzugfügt. (auch root, wenn root sound haben soll).

[Warum root? Der darf doch immer alles lesen und schreiben?

gpasswd -a <user> pulse-access

Hier hatte ich dann auch schon ein nächstes Problem. PulseAudio legt bei mir den .pulse-cookie in /var/run/pulse mit nur User Leserechten für den User pulse an, sonst sind keinerlei Rechte gesetzt. .pulse-cookie gehört pulse:pulse ich verstehe nicht ganz, was das mit pulse-access soll? Später wird ja der Cookie übertragen und dann bekommt pulse-access als Gruppe Leserechte drauf. Warum so umständlich? Gibt es da einen Grund?]

Jetzt kommt das, was ich gemacht habe:

Da PulseAudio als system-wide Daemon konfiguriert ist und als User pulse gestartet wird und der pulse-cookie NUR mit User-Leserechten angelegt wird, muss man darauf noch Zugriff bekommen. Das Kopieren oder Symlinken des Cookies hat bei mir nicht so recht funktioniert, vielleicht habe ich auch nur etwas falsch gemacht...

In die Datei /etc/rc.d/pulseaudio habe ich vor die Zeile add_daemon pulseaudio geschrieben:

chmod a+r /var/run/pulse/.pulse-cookie
chmod a+r /var/run/pulse/.esd_auth

Jetzt darf jeder den Cookie von Pulseaudio lesen. Was mit esd_auth ist, weiß ich nicht, aber einige Programme wollen auch den lesen und starten sonst nicht richtig. Achtung: Bei der Installation einer neueren Version von PulseAudio wird auch diese Datei neu angelegt, diese Änderungen sind dann weg und müssen neu gesetzt werden.

Damit die Programme auch wissen, wo der pulse cookie ist, habe ich in /etc/pulse/client.conf eingetragen:

default-server = <meine IP>
cookie-file = /var/run/pulse/.pulse-cookie

Konfiguration des Alsa Plugins

Es wird empfohlen, das ALSA Plugin für PulseAudio zu verwenden, da die meisten Programme ALSA benutzen. Dies wird mit dem PulseAudio Plugin für alsalibs gemacht.

Um ALSA dazu zu bringen, die Ausgabe an PulseAudio zu übergeben, trägt man in die /etc/asound.conf (empfohlen) oder ~/.asoundrc Folgendes ein:

pcm.pulse {
   type pulse
}
ctl.pulse {
   type pulse
}

pulse in pcm.pulse und ctl.pulse ist nur ein Name, den du verändern kannst, dann verändern sich aber auch die nächsten Schritte entsprechend.

Wenn du willst, dass ALSA standardmäßig PulseAudio benutzt, solltest du zusätzlich in die /etc/asound.conf oder ~/.asoundrc Folgendes eintragen:

pcm.!default {
    type pulse
}
ctl.!default {
    type pulse
}

Wenn man pulse als dein Standardgerät eingestellt hat, muss man entweder das ALSA Gerät in etc/pulse/default.pa eintragen, Beispiel:

load-module module-alsa-sink device=hw:0
load-module module-alsa-source device=hw:0

Oder man benutzt die automatische Erkennung mittels hal:

load-module module-hal-detect

Diese Zeile sollte schon in /etc/pulse/default.pa stehen, versichere dich, dass sie nicht auskommentiert ist.

Wenn du pulse nicht als Standardgerät für ALSA eingestellt hast, musst du in jedem Programm als Ausgabegerät "pulse" einstellen, damit es PulseAudio benutzt.


Mehr als zwei Lautsprecher ansteuern

Um zum Beispiel bei einem 5.1 Soundsystem nicht nur auf den beiden Front Lautsprechern etwas zu hören, wenn man nur Stereo ausgibt, passt man in der Datei /etc/pulse/daemon.conf die Anzahl der Lautsprecher an:

default-sample-channels = 6

Achtung, hier wird nicht jede Anzahl angenommen, bei 5 zum Beispiel startet Pulseaudio nicht.

Direkter Ersatz für ESD (EsounD) [veraltet?]

Aktuelle GNOME Versionen unterstützen den Start von ESD schon beim Einloggen. Weil Pulseaudio als direkter Ersatz für ESD verwendet werden kann, kann man GNOME "täuschen", damit der PulseAudio Daemon statt dem traditionellen ESD Daemon gestartet wird. Um dieses Verhalten zu erreichen, benutzt man das esdcompat script, das mit PulseAudio intsalliert wird. Erstelle einen symlink von /usr/bin/esd zu diesem script:

ln -sf /usr/bin/esdcompat /usr/bin/esd

Fertig. Jetzt sollte GNOME PulseAudio automatisch bei jedem Einloggen laden und verwenden.

[Da Pulseaudio system-wide läuft und sowieso beim Systemstart geladen wird, muss man das nicht mehr machen, denke ich. Denke ich richtig?]

Pulseaudio benutzt standardmäßig einen anderen Socket (/tmp/.esd-xxxx) als das Originale ESD, um zu verhindern, dass verschiedene Benutzer auf den gleichen Socket zugreifen. Wenn GNOME ESD automatisch als Benutzer starten soll (eigentlich esdcompat), bearbeitet man die Datei /etc/pulse/default.pa. Damit PulseAudio den StandardSocket benutzt, wie es viele GNOME Programme erwarten, ändert man die Zeile "load-module module-esound-protocol-unix" wie folgt:

load-module module-esound-protocol-unix socket=/tmp/.esd/socket

Das funktioniert nur, wenn du der einzige Benutzer auf diesem Computer bist. Sobald ein zweiter Benutzer gnome auf dem gleichen Computer startet, werden Probleme auftreten. Ein Lösungsansatz für dieses Problem ist, esdcompat auf einer Serverbasis zu starten. Ich (der englische Originalautor) habe diese Zeile nicht bearbeitet, weil auf meinem Ubuntu auch so alles funktionierte, also probierte ich das Gleiche mit Arch und es funktionierte auch.

[Das Zeug ist doch alles deprecated, oder nicht? Sollte das nicht ganz rausfliegen?]


Konfiguration SDL für PulseAudio

Seit Version 1.2.12 unterstützt SDL nativen PulseAudio Support. Füge diese Zeile in deine .profile oder .bashrc ein:

export SDL_AUDIODRIVER="pulse"

Andere Umgebungsvariablen:

PASERVER ist der Computer, auf dem der PulseAudio Server läuft, PADEVICE ist das Gerät auf dem Server.

[Aus dem englischen Wiki: Der "pulse" Treiber kann bisher noch nicht deine pulseaudio Konfiguration auslesen, wie es aussieht. Keine Ahnung, ob das noch aktuell ist?]


Anmerkung: Bei mir hat SDL noch nie richtig funktioniert, der Sound hat immer furchtbar gestottert, auch ohne Pulseaudio. Ich habe gelesen, dass das an der HDA Intel Soundkarte liegt. Jedenfalls funktioniert der Ton gut, wenn man in dem SDL Programm den Buffer vergrößern kann.

Bei dem Spiel prey zum Beispiel musste ich in der Datei ~/.prey/base/preyconfig.cfg den Wert so anpassen:

seta s_sdlSamples "2048"

(Von vormals 512)

Wenn export SDL_AUDIODRIVER="pulse" nicht funktioniert oder du eine alte SDL Version benutzt, kannst du die esd Ausgabe benutzen, die auch von PulseAudio übernommen wird:

export SDL_AUDIODRIVER="esd"

Aus dem englischen Wiki: Du kannst ABS benutzen, um SDL mit PulseAudio support zu kompilieren, bis die Qualität des Treibers upstream gefixt ist. Bitte benutze den Patch hier: SDL Pulseaudio Patch [??? Ist das noch aktuell?]

Konfiguration von GStreamer für PulseAudio

Damit GStreamer PulseAudio benutzt, musst du gstreamer0.10-pulse installieren und /system/gstreamer/0.10/default/audiosink sowie /system/gstreamer/0.10/default/audiosrc für PulseAudio setzen, entweder mit dem gconf-editor oder CLI):

pacman -Sy gstreamer0.10-pulse
gconftool-2 -t string --set /system/gstreamer/0.10/default/audiosink pulsesink
gconftool-2 -t string --set /system/gstreamer/0.10/default/audiosrc pulsesrc

Alternativ kanst du gstreamer-properties benutzen, um die gconf Einträge zu setzen;

gstreamer-properties


Konfiguration von OpenAL für PulseAudio

Spiele, die OpenAL benutzen, können direkt PulseAudio verwenden. Schreibe dazu in die Datei ~/.openalrc:

(define devices '(esd))

oder alternativ

(define devices '(alsa))
(define alsa-device "pulse")


Konfiguration von libao für PulseAudio

pacman -Sy libao-pulse

Füge in /etc/libao.conf ein:

default_driver=pulse


Mehrere PulseAudio ALSA Geräte

PulseAudio kann mehrere verschiedene Soundkarten oder mehrere virtuelle PCMs einer Soundkarte (zum Beispiel, getrennte Front und Surround Ausgabekanäle) verwenden. Dazu muss man PulseAudio für mehrere ALSA sinks konfigurieren. In /etc/pulse/default.pa:

load-module module-alsa-sink device=front
load-module module-alsa-sink device=rear

Wenn der Client verschiedene Pulse/ALSA Ausgabegeräte haben soll, bearbeitet man die /etc/asound.conf oder ~/.asoundrc:

pcm.pulsefront {
    type pulse
    device front
}
pcm.pulserear {
    type pulse
    device rear
}

Und richtet die entsprechenden ctl Elemente ein:

ctl.pulsefront {
    type pulse
    device front
}
ctl.pulserear {
    type pulse
    device rear
}


Den OSS Wrapper für PulseAudio verwenden

Wenn man ein Programm benutzen willt, das OSS benutzt, kann man es mit padsp mit Pulseaudio starten.

padsp OSSprogram

Beispiele:

padsp aumix
padsp sox foo.wav -t ossdsp /dev/dsp

Bei mir arbeitet wine mit der alsa Ausgabe nicht besonders gut mit PulseAudio zusammen, mit OSS und padsp habe ich dagegen keine Probleme. So stellt man ein, dass wine die OSS Ausgabe verwendet: Zuerst winecfg starten

padsp winecfg

Dann auf die Audio Registerkarte wechseln, den Haken bei Alsa wegmachen und bei OSS setzen.

Jetzt müssen alle wine Programme, statt mit "wine" mit "padsp wine" gestartet werden. Evtl kann man ein Script schreiben, das diese Aufgabe übernimmt.

Momentan funktioniert padsp allerdings nicht gut. Sporadisch friert Pulseaudio ein. Läuft zwar noch, aber nimmt keine Befehle oder Verbindungen mehr an.

PulseAudio übers Netzwerk

Eine der großen Stärken von PulseAudio ist die Möglichkeit, Audio über TCP beliebig zu streamen. Dazu braucht man das Modul module-native-protocol-tcp. Zusätzlich muss der pulse-cookie auf die Clients kopiert werden. Um das TCP Modul zu aktivieren, füge Folgendes in /etc/pulse/default.pa ein (oder entferne das Kommentarzeichen):

load-module  module-native-protocol-tcp

Wenn PulseAudio als systemweiten Daemon läuft, was für Netzwerksound Sinn macht, befindet sich der Cookie in /var/run/pulse/.pulse-cookie. Dieser Cookie muss an den Client gesendet werden und irgendwo platziert werden, wo die pulse-access Gruppe Leserechte hat (und mit Berechtigungen, dass nur sie ihn lesen können).

[Hä?]

Um den Cookie per SSH von dem Server, auf dem der Sound ausgegeben werden soll, auf die Clients nach /etc/pulse-cookie zu kopieren (auf den Clients muss ein SSH Server laufen und man muss root-Rechte haben):

scp /var/run/pulse/.pulse-cookie client:/etc/pulse-cookie

Auf den Clients müssen dann die Rechte richtig gesetzt werden. Als root:

chown pulse:pulse-access /etc/pulse-cookie
chmod 640 /etc/pulse-cookie

Immer noch auf dem Client: Der Pulse Client muss wissen, wo er nach dem Cookie suchen muss. In /etc/pulse/client.conf wird deshalb eingetragen:

### Cookie file
cookie-file = /etc/pulse-cookie

Dann muss der Client konfiguert werden, um auf den entsprechenden Server zuzugreifen. Wieder in der /etc/pulse/client.conf:

## The default server to connect to
default-server = <die IP Adresse des Servers>

Fertig.


Problembehebung

module-x11-publish

Wenn Folgendes in den PulseAudio Logs auftaucht:

x11wrap.c: XOpenDisplay() failed
module.c: Failed to load  module "module-x11-publish" (argument: ""): initialization failed.
main.c: Module load failed.
main.c: failed to initialize daemon.

Dann muss man das module-x11-publish in /etc/pulse/default.pa deaktivieren (auskommentieren):

#load-module module-x11-publish

"daemon startup failed"

Wenn PulseAudio nicht als Daemon startet und Folgendes ausgibt:

E: main.c: daemon startup failed.

Muss man vielleicht die Zeile in /etc/pulse/default.pa deaktivieren, in der .fail steht.

Kommentiere diese Zeile einfach aus, indem du ein # davor schreibst.

[Was soll das denn sein?]

module-hal-detect

Wenn eine Fehlermeldung wegen HAL, module-hal oder Ähnliches ausgegeben wird, wirst du module-hal-detect aus /etc/pulse/default.pa entfernen müssen und explizit die ALSA Hardware angeben, zum Beispiel:

load-module module-alsa-sink device=hw:0
load-module module-alsa-source device=hw:0


Links

http://www.pulseaudio.org/wiki/PerfectSetup http://www.alsa-project.org/main/index.php/Asoundrc http://www.pulseaudio.org/ http://mpd.wikia.com/wiki/PulseAudio#Version_0.12.0_and_later