PulseAudio vs. Jackd

beavisbee

Member of Honour
Bin nun fleißig am JukeBox bauen und habe da mal eine Frage an die Audiophilen Linuxer...

System:
  • Alix.1D-Board (AMD Geode, 500MHz)
  • Debian testing (Squeeze)


Das Board hat 2 Audio-Eingänge und 2 Ausgänge
  • Line In
  • Line Out
  • Mic In
  • Headphone Out


An den Ausgängen hängen zum einen die Stereo-Anlage im Wohnzimmer und zum anderen die PC-Lautsprecher im Schlafzimmer.
Am Line In hängt der Sat-Receiver (und an dem wiederum VHS und DVD)

und die Musik wird vom MPD gespielt.

ich möchte mir jetzt ein Web-Frontend bauen, mit welchem ich dann auswählen kann "TV --> Wohnzimmer", "MPD --> Schlafzimmer" oder "MPD --> Wohnzimmer & Schlafzimmer", usw.

da solche Dinge mit ALSA allein AFAIK nicht möglich sind, wäre jetzt die Frage, wie ich es realisiere: PulseAudio? Jack? noch 'ne andere Alternative?

Bedingung: die Zuweisung von Quellen zu senken muss über die Kommandozeile erfolgen können, da ich dann im Web-Frontend einfach shell_exec("befehl quelle=bla senke=blub") ausführen können will.

Hat jemand mit einem von beiden (oder besser noch mit beiden) Erfahrung?
Vorteile / Nachteile?
Performance / CPU-Last / Latenz-Zeiten?

Ich habe noch keine Erfahrung mit einem von beidem, tendiere momentan aber irgendwie ehr zu Jack, da ich bei "pulseaudio vs. jack"-Suchanfragen bisher des öfteren (speziell bei Threads aus dem Bereich Audio-Production) den Rat "RealTime-Kernel + Jack" gelesen habe. Und irgend 'nen Grund muss es ja auch haben, dass z.B. Ardour und co. Jackd unbedingt mitinstallieren wollen...
 

Moe

1
Und welche deiner Anforderungen passt zu "Audio-Production" (Realtime-Processing, keine Latenz, Multitrack-Recording usw.)? ;)

Im Ernst, jackd wäre ein absoluter Overkill für das, was du vor hast. Aber er ist halbwegs gut dokumentiert und ich will es nicht unter den Tisch fallen lassen. Pulseaudio ist sicherlich ebenfalls eine gute Alternative, vor allem, weil es mittlerweile mehr Plugins für Pulseaudio als für Jack gibt.

Was du möchtest lässt sich allerdings auch direkt mit ALSA lösen. Man kann jeden Ausgang einer Soundkarte mit ALSA direkt ansprechen. Du müsstest eigentlich nur drei entsprechende ALSA-Sinks kreieren (Stichwort .asoundrc bzw. /etc/asound.conf), die ihren Output jeweils an den entsprechenden Hardwareteil bzw. Hardwareteile ausgibt. Wie leicht man da mit mpd den Output (vor allem ohne Neustart) wechseln kann, weiß ich allerdings nicht.

Vielleicht wäre Pulseaudio also schon die beste Alternative.
 

beavisbee

Member of Honour
Danke für die Antwort.

Also wenn es mit Alsa irgendwie möglich wäre, mit 'nem Konsolenbefehl im Endeffekt zu sagen "Micro-Eingang jetzt nur an Line-Out" oder "Micro-Eingang jetzt wieder an beide Ausgänge", dann könnte ich es tatsächlich rein mit Alsa schaffen.

In der mpd.conf kann ich ja mehrere Ausgänge definieren (bis jetzt hatte ich eben höchstens mal einzelne Einträge für 2 verschiedene Soundkarten gemacht oder für Soundkarte + Icecast-Server - aber noch nie versucht, 2 Ausgänge einer Soundkarte einzeln anzusteuern)
Wenn ich es aber hinbekomme, eine einzelne Senke anzusprechen, könnte ich ja für jede Senke einen einzelnen Eintrag in der mpd.conf machen und schon geht's. In den gängigen MPD-Clients kann man dann die einzelnen MPD-Outputs zu und abschalten.

Ich les mich mal in die Möglichkeiten der asound.conf /.asoundrc ein...
 

Moe

1
Dann bist du doch aus dem Schneider.

Die einzelnen Hardwareteile lassen sich über hw:X:Y, wobei Y die Nummer der Soundkarte und X die Nummer des Teils ist, ansteuern. Die kannst du dann ALSA-Sinks/-Profilen zuweisen und einfach drei verschiedene Ausgänge im mpd definieren, jedes mit seinem eigenen ALSA-Profil.

Und alles ohne Pulseaudio/JACK oder irgendwelchen anderen Hokuspokus. :)
 

beavisbee

Member of Honour
steh leider noch ganz am Anfang meiner Alsa-Recherche...

korrigiere mich, wenn ich falsch liege, aber ist das, was mit hw:x,y angesprochen wird nicht das, was man unter aplay -l findet?
Code:
root@juketux:~# aplay -l
**** Liste der Hardware-Geräte (PLAYBACK) ****
Karte 0: Audio [CS5535 Audio], Gerät 0: CS5535 Audio [CS5535 Audio]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
(dachte, sowas mal in Bezug auf Screencasts mit recordmydesktop gelesen zu haben)

demnach wäre dort alles andere außer 0,0 nicht möglich (ich probier trotzdem mal aus, was passiert, wenn ich da was anderes eintrag)

momentan - also ohne hw:x,y manuell zu setzen, wird der Regler "PCM" bewegt. Wenn ich dagegen "Master" über alsamixer runter dreh, wird's im Wohnzimmer leiser, wenn ich "Headphones" runter dreh, dann im Schlafzimmer...

Code:
┌───────────────────────────── AlsaMixer v1.0.23 ──────────────────────────────┐
│   Gerät: CS5535 Audio                              F1:  Hilfe                │
│    Chip: Realtek ALC203 rev 0                      F2:  System-Informationen │
│ Ansicht: F3:[Wiedergabe] F4: Aufnahme  F5: Alle    F6:  Soundkarte auswählen │
│ Element: PCM [dB-Änderung: -7,50; -7,50]           Esc: Beenden              │
│                                                                              │
│     ┌──┐     ┌──┐     ┌──┐              ┌──┐              ┌──┐     ┌──┐      │
│     │  │     │  │     │  │              │  │              │▒▒│     │  │      │
│     │  │     │  │     │  │              │  │              │▒▒│     │  │      │
│     │▒▒│     │▒▒│     │▒▒│              │  │              │▒▒│     │  │      >
│     │▒▒│     │▒▒│     │▒▒│              │  │              │▒▒│     │▒▒│      >
│     │▒▒│     │▒▒│     │▒▒│              │▒▒│              │▒▒│     │▒▒│      >
│     │▒▒│     │▒▒│     │▒▒│              │▒▒│              │▒▒│     │▒▒│      >
│     │▒▒│     │▒▒│     │▒▒│              │▒▒│              │▒▒│     │▒▒│      >
│     │▒▒│     │▒▒│     │▒▒│              │▒▒│              │▒▒│     │▒▒│      >
│     │▒▒│     │▒▒│     │▒▒│              │▒▒│              │▒▒│     │▒▒│      >
│     │▒▒│     │▒▒│     │▒▒│              │▒▒│              │▒▒│     │▒▒│      │
│     │▒▒│     │▒▒│     │▒▒│              │▒▒│              │▒▒│     │▒▒│      │
│     ├──┤     ├──┤     ├──┤     ┌──┐     ├──┤    pre 3D    ├──┤     ├──┤      │
│     │OO│     │OO│     │OO│     │OO│     │OO│              │OO│     │OO│      │
│     └──┘     └──┘     └──┘     └──┘     └──┘              └──┘     └──┘      │
│    81<>81     81     81<>81            58<>58            94<>94   71<>71     │
│    Master  Master M Headphon 3D Contr<  PCM   >PCM Out    Line      CD       │
└──────────────────────────────────────────────────────────────────────────────┘
ach ja - und die PCM-Device-Auflistung:
Code:
root@juketux:~# aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=Audio
    CS5535 Audio, CS5535 Audio
    Default Audio Device
root@juketux:~#
und falls dir das hier auch noch hilft:
Code:
root@juketux:~# ls -lR /proc/asound/
/proc/asound/:
insgesamt 0
lrwxrwxrwx 1 root root 5 26. Dez 21:16 Audio -> card0
dr-xr-xr-x 5 root root 0 26. Dez 21:16 card0
-r--r--r-- 1 root root 0 26. Dez 21:16 cards
-r--r--r-- 1 root root 0 26. Dez 21:16 devices
-r--r--r-- 1 root root 0 26. Dez 21:16 modules
dr-xr-xr-x 2 root root 0 26. Dez 21:16 oss
-r--r--r-- 1 root root 0 26. Dez 21:16 pcm
dr-xr-xr-x 2 root root 0 26. Dez 21:16 seq
-r--r--r-- 1 root root 0 26. Dez 21:16 timers
-r--r--r-- 1 root root 0 26. Dez 21:16 version

/proc/asound/card0:
insgesamt 0
dr-xr-xr-x 2 root root 0 26. Dez 21:16 codec97#0
-r--r--r-- 1 root root 0 26. Dez 21:16 id
dr-xr-xr-x 3 root root 0 26. Dez 21:16 pcm0c
dr-xr-xr-x 3 root root 0 26. Dez 21:16 pcm0p

/proc/asound/card0/codec97#0:
insgesamt 0
-r--r--r-- 1 root root 0 26. Dez 21:16 ac97#0-0
-r--r--r-- 1 root root 0 26. Dez 21:16 ac97#0-0+regs

/proc/asound/card0/pcm0c:
insgesamt 0
-r--r--r-- 1 root root 0 26. Dez 21:16 info
dr-xr-xr-x 2 root root 0 26. Dez 21:16 sub0

/proc/asound/card0/pcm0c/sub0:
insgesamt 0
-r--r--r-- 1 root root 0 26. Dez 21:16 hw_params
-r--r--r-- 1 root root 0 26. Dez 21:16 info
-rw-r--r-- 1 root root 0 26. Dez 21:16 prealloc
-r--r--r-- 1 root root 0 26. Dez 21:16 prealloc_max
-r--r--r-- 1 root root 0 26. Dez 21:16 status
-r--r--r-- 1 root root 0 26. Dez 21:16 sw_params

/proc/asound/card0/pcm0p:
insgesamt 0
-r--r--r-- 1 root root 0 26. Dez 21:16 info
dr-xr-xr-x 2 root root 0 26. Dez 21:16 sub0

/proc/asound/card0/pcm0p/sub0:
insgesamt 0
-r--r--r-- 1 root root 0 26. Dez 21:16 hw_params
-r--r--r-- 1 root root 0 26. Dez 21:16 info
-rw-r--r-- 1 root root 0 26. Dez 21:16 prealloc
-r--r--r-- 1 root root 0 26. Dez 21:16 prealloc_max
-r--r--r-- 1 root root 0 26. Dez 21:16 status
-r--r--r-- 1 root root 0 26. Dez 21:16 sw_params

/proc/asound/oss:
insgesamt 0
-r--r--r-- 1 root root 0 26. Dez 21:16 devices
-r--r--r-- 1 root root 0 26. Dez 21:16 sndstat

/proc/asound/seq:
insgesamt 0
-r--r--r-- 1 root root 0 26. Dez 21:16 clients
-r--r--r-- 1 root root 0 26. Dez 21:16 drivers
-r--r--r-- 1 root root 0 26. Dez 21:16 queues
-r--r--r-- 1 root root 0 26. Dez 21:16 timer
root@juketux:~#
Code:
root@juketux:~# cat /proc/asound/pcm 
00-00: CS5535 Audio : CS5535 Audio : playback 1 : capture 1
root@juketux:~# cat /proc/asound/devices 
  2:        : timer
  3:        : sequencer
  4: [ 0- 0]: digital audio playback
  5: [ 0- 0]: digital audio capture
  6: [ 0]   : control
root@juketux:~# cat /proc/asound/cards
 0 [Audio          ]: cs5535audio - CS5535 Audio
                      CS5535 Audio cs5535audio at 0xfe00, irq 11
root@juketux:~# cat /proc/asound/Audio/pcm0p/info 
card: 0
device: 0
subdevice: 0
stream: PLAYBACK
id: CS5535 Audio
name: CS5535 Audio
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 1
root@juketux:~# cat /proc/asound/Audio/pcm0p/sub0/info 
card: 0
device: 0
subdevice: 0
stream: PLAYBACK
id: CS5535 Audio
name: CS5535 Audio
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 1
root@juketux:~#
 

Moe

1
Das ist ja dann sogar noch einfacher, als ich dachte. Alles, was du haben willst, macht amixer bzw. aumix: amixer kann Mixer-Kanäle kontrollieren, d.h. z.B. mit Hilfe eines Scripts individuelle Kanäle hoch oder runter fahren usw. .. Im Endeffekt musst du ja eigentlich nur Kanäle muten, also noch einfacher.

Sorry, bis eben hatte ich einen kleinen Denkfehler. Wir arbeiten ja mit ALSA Kanälen auf der gleichen Soundkarte.
 

beavisbee

Member of Honour
muten bringt jedoch nur was, solange ich nur EINE Soundquelle in einem oder beiden Räumen spielen will.

Mein Wunsch wäre jedoch, dass z.B. der TV/DVD-Ton, der zum Mic rein kommt, im Wohnzimmer spielt und gleichzeitig der mpd im Schlafzimmer Musik spielen kann. Oder dass man 2 mpd-Instanzen laufen lässt und festlegen kann, dass eben mpd1 im Wohnzimmer andere Musik als mpd2 im Schlafzimmer spielt.

Und das hoffe ich, mit Jack oder PulseAudio hinzubekommen, da mir eben mit Alsa keine Möglichkeit einfällt...
Wenn es doch irgendwie mit Alsa so umzubiegen geht, dass die Ausgänge einzeln ansprechbar sind, wäre das optimal. Ansonsten wäre es toll, wenn du auch Tipps für PulseAudio oder Jack hättest.

wie gesagt: es sollte A) über die Konsole steuerbar sein, um es per Web-Interface (PHP-Script) steuern zu können B) möglichst performance-schonend sein, da nur 500MHz und C) sollten in Zukunft auch mal noch Bluetooth-Dongles damit gesteuert werden können (sowohl als Bluetooth-Headset als auch als Bluetooth-Audio-Sender)
wobei (wie ich mit Google überflogen habe) C) möglicherweise wieder irgendwie über Alsa machbar ist und PulseAudio / Jack dann wiederum nur auf ein Alsa-Device zugreifen müssten (wenn du andere Erfahrungen auf dem Gebiet Bluetooth A2DP hast, wäre es natürlich toll, wenn du sie mit mir teilst ;) )
 

Moe

1
Also quasi zwei Quellen mit zwei verschiedenen Ausgangsrouten wäre das meiste, was die Soundkarte verarbeiten muss, oder?

ALSA hat eine Menge PCM Plugins, mit denen man die tollsten Geschichten machen kann. Ich hab' jetzt leider kein System zum Testen hier, ansonsten bin ich mir sicher, dass man einzelne Kanäle mit dem route-Plugin von einem PCM-Device abtrennen kann, und z.B. direkt auf ein andere PCM-Device routen kann.

So kann man z.B. auch aus einem 5.1 ein 2.0 System machen.

Ich verfluche gerade mal wieder die Tatsache, dass ALSA so schlecht dokumentiert ist. Kein Wunder, dass es solche Lösungen wie Pulseaudio gibt .. vielleicht gibt es auch eine bessere Lösung mit Pulseaudio/Jack. Im Endeffekt kommuniziert alles mit/über ALSA. Eine resourcenschonendere Lösung wirst du also nicht bekommen.

A2DP ist mir nicht fremd, aber ich habe damit bis jetzt noch nicht viel gemacht. Im Endeffekt verhält sich das mit Sicherheit nur wie ein weiteres Gerät, was über ALSA Sound ausgibt oder aufnimmt.
 
Oben