[gelöst] alsa: Stereo-Kanäle tauschen?

Sound, Digitalkameras, TV+Video und Spiele.
Antworten
Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

[gelöst] alsa: Stereo-Kanäle tauschen?

Beitrag von hikaru » 01.07.2022 11:11:41

Hallo,

ich würde gern unter Bullseye mit alsa die analogen Stereokanäle für rechts und links tauschen. Die Soundausgabe funktioniert prinzipiell. Pulseaudio ist nicht installiert.
Bei der Suche lande ich immer wieder bei Anleitungen wie dieser [1], welche ich in eine /etc/asound.conf übernommen habe. Ob die Audiokanäle dabei tatsächlich getauscht werden kann ich leider nicht sagen, denn der Ton ist danach komplett stumm ohne Fehlermeldung (Test: aplay mit Audiodatei), auch nach einem Reboot.
Meine erste Vermutung war, dass die Anleitung von 2009 möglicherweise überholt ist. Aber offenbar funktionierte das im Prinzip 2019 auch noch unter Fedora. [2]
Nach etwas Spielerei sieht meine asound.conf momentan so aus, was aber nichts am stummen Ton ändert:

Code: Alles auswählen

pcm.swapped {
    type         route
    slave.pcm    "plughw:PCH,0"
    ttable.0.1   1
    ttable.1.0   1
}

pcm.!default {    
     type        plug
     slave.pcm   "swapped"
}
Abgesehen vom Kanaltausch gibt es keine weitere Aufgabe für die asound.conf.

Momentan sitze ich nicht an dem eigentlichen Zielsystem, sondern teste hier nur. Aber das Prinzip ist das Gleiche. Ich möchte die analogen PCH-Kanäle (Karte 0, Gerät 0) tauschen:

Code: Alles auswählen

$ aplay -l
**** Liste der Hardware-Geräte (PLAYBACK) ****
Karte 0: PCH [HDA Intel PCH], Gerät 0: 92HD93BXX Analog [92HD93BXX Analog]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 3: HDMI 0 [HDMI 0]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 7: HDMI 0 [HDMI 0]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 8: HDMI 0 [HDMI 0]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 9: HDMI 0 [HDMI 0]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
Kann mir jemand auf die Sprünge helfen?


[1] https://superuser.com/questions/59481/h ... 9488#59488
[2] https://www.spinics.net/linux/fedora/al ... 15090.html

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: alsa: Stereo-Kanäle tauschen?

Beitrag von smutbert » 01.07.2022 11:39:53

Das sollte eigentlich auch funktionieren, wobei ich auch noch die Zeilen

Code: Alles auswählen

ttable.0.0 0
ttable.1.1 0
dazugenommen hätte, nur um sicherzugehen dass da nicht beide Eingangkanäle gemischt bei beiden Ausgangskanälen landen.

Stumm geschaltet ist nichts und die Wiedergabe direkt nach "plughw:PCH,0" funktioniert unauffällig?


Alternativ gibt es auch noch die bindings, mit denen die Kanäle umsortiert werden können. Das könnte zum Beispiel so aussehen

Code: Alles auswählen

pcm.!default {    
	type		plug
	slave.pcm	"hw:PCH,0"
	bindings {
		0 1
		1 0
	}
}

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: alsa: Stereo-Kanäle tauschen?

Beitrag von hikaru » 01.07.2022 12:13:40

smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 11:39:53
Stumm geschaltet ist nichts und die Wiedergabe direkt nach "plughw:PCH,0" funktioniert unauffällig?
Nein, stummgeschaltet ist nichts und ja, "plughw:PCH,0" funktioniert unauffällig (mit Ton):

Code: Alles auswählen

$ aplay -D plughw:PCH,0 /usr/share/sounds/alsa/Front_Left.wav 
Wiedergabe: WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, Rate: 48000 Hz, mono
smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 11:39:53
Alternativ gibt es auch noch die bindings, mit denen die Kanäle umsortiert werden können. Das könnte zum Beispiel so aussehen

Code: Alles auswählen

pcm.!default {    
	type		plug
	slave.pcm	"hw:PCH,0"
	bindings {
		0 1
		1 0
	}
}
Das ist die komplette asound.conf, oder?
Dabei bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

$ aplay /usr/share/sounds/alsa/Front_Left.wav 
ALSA lib pcm_plug.c:1286:(_snd_pcm_plug_open) Unknown field bindings
aplay: main:830: Fehler beim Öffnen des Gerätes: Das Argument ist ungültig
Ich sehe hier aber, dass du "hw:PCH,0" verwendest, nicht wie ich "plughw:PCH,0". Wenn ich das in meiner ursprünglichen Konfiguration übernehme, dann habe ich auch wieder Ton:

Code: Alles auswählen

pcm.swapped {
    type         route
    slave.pcm    "hw:PCH,0"
    ttable.0.0   0
    ttable.1.1   0
    ttable.0.1   1
    ttable.1.0   1
}

pcm.!default {
     type        plug
     slave.pcm   "swapped"
}
Allerdings wird der Ton nun immer auf beide Kanäle gemixt, egal ob ich deine zusätzlichen ttable-Zeilen hinzufüge (auch egal ob vor oder hinter den Ursprünglichen), oder ob ich sie entferne.
Ich drehe dazu testweise immer den einen PCM-Kanal in alsamixer voll auf und den anderen zu. Es kommt jedes mal Ton aus beiden Boxen. Ganz ohne asound.conf kann ich hingegen rechts und links unterscheiden.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: alsa: Stereo-Kanäle tauschen?

Beitrag von smutbert » 01.07.2022 13:44:25

Da kommen jetzt einige Dinge zusammen. Also erstens hw versus plughw:

Alles was plughw macht, ist vor der Hardware noch ein plug-Plugin einzufügen, das eventuell notwendige Formatkonversionen vornimmt. Bei deiner Konfiguration im Eröffnungspost hast du aber bereits in pcm.default ein plug eingebaut. Am Ende lief die Ausgabe also so
Anwendung → plug (pcm.default) → route (pcm.swapped) → plug (plughw) → hw (plughw)
Wieso es bei dieser Konstellation stumm bleibt, weiß ich allerdings auch nicht.

Dann mein Fehler. Ich habe die bindings zu plug hinzugefügt, das aber offensichtlich eines der wenigen Plugins ist, die die bindings nicht unterstützen. Den Fehler bügel ich natürlich gerne aus, wenn es notwendig wird, aber...
hikaru hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 12:13:40
Ich drehe dazu testweise immer den einen PCM-Kanal in alsamixer voll auf und den anderen zu. Es kommt jedes mal Ton aus beiden Boxen. Ganz ohne asound.conf kann ich hingegen rechts und links unterscheiden.
...das ist leider kein geeigneter Test.
PCM ist ein Lautstärkeregler, der bei alten ISA- und PCI-Soundkarten (bei nicht-onboard-Sounds gibt es das möglicherweise immer noch) die Lautstärke von Tönen regelt, die am Computer von Software erzeugt werden, im Gegensatz zu Signalen von Line-In, Mic-In, Wavetable-Synthese, u. s. w.
Onboardsounds verfügen eigentlich über keinen solchen Regler, der wird daher in der Standardkonfiguration von Alsa per Software (dem softvol-Plugin) nachgebildet.

Ohne asound.conf verhält sich der PCM-Regler also wie gewünscht, bei unserer Konfiguration, bei der wir pcm.default komplett überschreiben ist er dagegen wirkungslos.
Demzufolge sollte auch Ton aus den Lautsprechern kommen, wenn du beide PCM-Kanäle ganz herunterdrehst.

Zum Testen bräuchtest du ein Wiedergabeprogramm, das selbst einen Balanceregler bietet oder eine Testaudiodatei wie sie speaker-test abspielt (Debianalsa-utils), das du vermutlich eh installiert hast:

Code: Alles auswählen

speaker-test -t wav -c 2
(nicht getestet, ich kann mich an Gelegenheiten erinnern, bei denen ausgerechnet speaker-test nicht richtig funktioniert hat)
Aber ich _glaube_, dass es bei dir bereits wie gewünscht funktioniert.

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: alsa: Stereo-Kanäle tauschen?

Beitrag von hikaru » 01.07.2022 16:46:03

smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 13:44:25
Da kommen jetzt einige Dinge zusammen.
Offensichtlich! :roll:
smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 13:44:25
Alles was plughw macht, ist vor der Hardware noch ein plug-Plugin einzufügen, das eventuell notwendige Formatkonversionen vornimmt. Bei deiner Konfiguration im Eröffnungspost hast du aber bereits in pcm.default ein plug eingebaut. Am Ende lief die Ausgabe also so
Anwendung → plug (pcm.default) → route (pcm.swapped) → plug (plughw) → hw (plughw)
Danke für die Erklärung! Als ich den Thread eröffnet habe war ich schon weitgehend im Copy&Paste-Autopilot-Modus.
smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 13:44:25
Wieso es bei dieser Konstellation stumm bleibt, weiß ich allerdings auch nicht.
Das liegt offenbar an aplay. mpv, audacity und ein Spiel über wine funktionieren alle mit der asound.conf - sowohl mit der Ursprünglichen aus dem superuser-Link, als auch mit der von mir zuerst geposteten, mit und ohne deine ttable-Ergänzungen.
Der Ton beider Kanäle wird dabei jeweils sauber getauscht.
Auch speaker-test funktioniert, tauscht allerdings die Kanäle nicht. Von speaker-test hatte ich mich auf deine Empfehlung hin irgendwann mal verabschiedet und stattdessen immer aplay für Tests genommen. Ich muss wohl mein Portfolio für Soundtests erweitern.
smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 13:44:25
Dann mein Fehler. Ich habe die bindings zu plug hinzugefügt, das aber offensichtlich eines der wenigen Plugins ist, die die bindings nicht unterstützen. Den Fehler bügel ich natürlich gerne aus, wenn es notwendig wird, aber...
Nein, notwendig ist es für mich nicht mehr. Interessant fände ich es aber trotzdem.
smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 13:44:25
hikaru hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 12:13:40
Ich drehe dazu testweise immer den einen PCM-Kanal in alsamixer voll auf und den anderen zu. Es kommt jedes mal Ton aus beiden Boxen. Ganz ohne asound.conf kann ich hingegen rechts und links unterscheiden.
...das ist leider kein geeigneter Test.
PCM ist ein Lautstärkeregler, der bei alten ISA- und PCI-Soundkarten (bei nicht-onboard-Sounds gibt es das möglicherweise immer noch) die Lautstärke von Tönen regelt, die am Computer von Software erzeugt werden, im Gegensatz zu Signalen von Line-In, Mic-In, Wavetable-Synthese, u. s. w.
Onboardsounds verfügen eigentlich über keinen solchen Regler, der wird daher in der Standardkonfiguration von Alsa per Software (dem softvol-Plugin) nachgebildet.
Eigentlich drehe ich in alsamixer immer nur insgesamt die Lautstärke hoch oder runter, meist über den Master-Regler. Der hat aber keine Kanaltrennung. So nahm ich PCM, weil ich davon schon mal gehört hatte.
smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 13:44:25
Aber ich _glaube_, dass es bei dir bereits wie gewünscht funktioniert.
Jetzt ja. Das Problem war wieder mal PEBKAC. ;)
Danke!

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: alsa: Stereo-Kanäle tauschen?

Beitrag von smutbert » 03.07.2022 23:28:28

hikaru hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 16:46:03
Danke für die Erklärung! Als ich den Thread eröffnet habe war ich schon weitgehend im Copy&Paste-Autopilot-Modus.
Dass es das bei dir überhaupt gibt, hätte ich nicht gedacht :lol:
hikaru hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 16:46:03
smutbert hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 13:44:25
Dann mein Fehler. Ich habe die bindings zu plug hinzugefügt, das aber offensichtlich eines der wenigen Plugins ist, die die bindings nicht unterstützen. Den Fehler bügel ich natürlich gerne aus, wenn es notwendig wird, aber...
Nein, notwendig ist es für mich nicht mehr. Interessant fände ich es aber trotzdem.
Ein plugin, das bindings kennt, für das man leicht Dokumentation findet und das man ohnehin oft braucht ist dmix. dmix akzeptiert als nachfolgendes Plugin (slave.pcm) ausschließlich direkt die Hardware (hw:...). Dementsprechend würde ich das ungefähr so angehen:

Code: Alles auswählen

pcm.!default {    
	type		plug
	slave.pcm	"dmixer"
}

pcm.dmixer {
	type		dmix
	ipc_key		1024
	ipc_perm	0666
	slave.pcm	"hw:PCH,0"
	bindings {
		0 1
		1 0
	}
}
(getestet habe ich es allerdings wieder nicht)

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: alsa: Stereo-Kanäle tauschen?

Beitrag von hikaru » 04.07.2022 19:23:16

smutbert hat geschrieben: ↑ zum Beitrag ↑
03.07.2022 23:28:28
hikaru hat geschrieben: ↑ zum Beitrag ↑
01.07.2022 16:46:03
Danke für die Erklärung! Als ich den Thread eröffnet habe war ich schon weitgehend im Copy&Paste-Autopilot-Modus.
Dass es das bei dir überhaupt gibt, hätte ich nicht gedacht :lol:
Auf Testsystemen schon. ;)
smutbert hat geschrieben: ↑ zum Beitrag ↑
03.07.2022 23:28:28
Ein plugin, das bindings kennt, für das man leicht Dokumentation findet und das man ohnehin oft braucht ist dmix. dmix akzeptiert als nachfolgendes Plugin (slave.pcm) ausschließlich direkt die Hardware (hw:...). Dementsprechend würde ich das ungefähr so angehen:

Code: Alles auswählen

pcm.!default {    
	type		plug
	slave.pcm	"dmixer"
}

pcm.dmixer {
	type		dmix
	ipc_key		1024
	ipc_perm	0666
	slave.pcm	"hw:PCH,0"
	bindings {
		0 1
		1 0
	}
}
(getestet habe ich es allerdings wieder nicht)
Damit funktioniert zwar der Sound (Audacity), aber die Kanäle werden nicht getauscht.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst] alsa: Stereo-Kanäle tauschen?

Beitrag von smutbert » 04.07.2022 22:25:32

Ich muss das noch selbst ausprobieren - in letzter Zeit macht Alsa viel zu selten das, was ich erwarte.

Grundsätzlich sollte es so jedenfalls funktionieren und dieselbe Methode ginge sogar kürzer. Nachdem dmix bereits in der Standardkonfiguration aktiv ist, kann man einfach einfach die dmix-Einstellungen anpassen [1]:

Code: Alles auswählen

pcm.dmix.bindings {
   0 1
   1 0
}
(ich nehme an, dass sich das aber gleich verhält wie mein voriger Vorschlag.)

Edit, eine kleine Ergänzung:
hikaru hat geschrieben: ↑ zum Beitrag ↑
04.07.2022 19:23:16
Damit funktioniert zwar der Sound (Audacity), aber die Kanäle werden nicht getauscht.
Welches Gerät war denn in audacity gewählt?
Wenn eines der selbst definierten, also dmixer oder default gewählt war, hätte es die Kanäle tauschen sollen, bei anderen Geräten ist es zu erwarten, dass nichts getauscht wird.

Mit der kürzeren Variante aus diesem Beitrag, sollten alle vordefiniereten Namen/Geräte (aplay -L), die dmix beinhalten, die Kanäle tauschen, alle, die es nicht beinhalten dagegen unverändert lassen.


[1] https://bbs.archlinux.org/viewtopic.php?id=266021

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: [gelöst] alsa: Stereo-Kanäle tauschen?

Beitrag von hikaru » 05.07.2022 00:17:39

smutbert hat geschrieben: ↑ zum Beitrag ↑
04.07.2022 22:25:32
Grundsätzlich sollte es so jedenfalls funktionieren und dieselbe Methode ginge sogar kürzer. Nachdem dmix bereits in der Standardkonfiguration aktiv ist, kann man einfach einfach die dmix-Einstellungen anpassen [1]:

Code: Alles auswählen

pcm.dmix.bindings {
   0 1
   1 0
}
(ich nehme an, dass sich das aber gleich verhält wie mein voriger Vorschlag.)
Wenn ich hier pcm.dmix.bindings verwende, dann findet Audacity keine Audiogeräte (Audacity nach jeder asound.conf-Änderung neu gestartet).
Wenn ich hingegen pcm.dmixer.bindings verwende, verhält es sich wie dein vorheriger Vorschlag, tauscht also die Kanäle nicht. (Gibt's "dmixer" vielleicht gar nicht und wird daher ignoriert?)

Ich habe in Audacity vier Audioausgabegeräte zur Auswahl, die mir relevant erscheinen*:
"HDA Intel: ALC269 Analog (hw:0,0)"
"sysdefault"
"default"
"dmix"

Alle verhalten sich gleich: Ton wird ausgegeben, aber Kanäle werden nicht getauscht.

*) Der Rest sind diverse Surround-Varianten.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst] alsa: Stereo-Kanäle tauschen?

Beitrag von smutbert » 05.07.2022 15:11:24

Endlich habe ich es bei mir getestet. Die letzte kurze Variante funktioniert bei mir auch nicht. Der Gedanke dahinter war, die Einstellungen des bereits in der Standardkonfiguration aktiven dmix-plugins zu ändern, sodass es die Kanäle tauscht. Ganz aufgegeben habe ich die Idee aber noch nicht.
hikaru hat geschrieben: ↑ zum Beitrag ↑
05.07.2022 00:17:39
Wenn ich hingegen pcm.dmixer.bindings verwende, [...]
dmixer ist der Name, den wir unserer dmix-Instanz gegeben haben. dmix können wir sie nicht nennen, weil es das schon gibt und dmixer wird auch in vielen Beispielen im Netz als Name verwendet.

Bei uns soll dmixer die Audiodaten über hw:PCH,0 ausgeben und dabei die Kanäle tauschen und genau das tut es das mit der geposteten Konfiguration bei mir unter bullseye auch einwandfrei.
Irgendetwas muss bei dir anders sein. Du schreibst das in die /etc/asound.conf und hast auch keine ~/.asoundrc, die das überschreiben würde?

Antworten