(gelöst) Bluealsa mit simultaner Tonausgabe auf zwei Geräten

Sound, Digitalkameras, TV+Video und Spiele.
fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

(gelöst) Bluealsa mit simultaner Tonausgabe auf zwei Geräten

Beitrag von fischig » 08.05.2020 17:49:02

Kann man/wie kann man denselben Ton einer Anwendung an zwei (Bluetooth-Kopfhörer weiterreichen)?
smutbert hat geschrieben:Wahrscheinlich hast du inzwischen schon erkannt, dass man die Alsaplugins fast beliebig aneinanderreihen kann. Es gibt mindestens zwei Plugins mit denen das möglich wäre route, das dazu dient Audiokanäle zu verteilen und zu mischen und multi, wobei es mit letzterem etwas einfacher sein sollte.
(An der Stelle wage ich nicht zu behaupten, dass ich es auf Anhieb richtig hinbekomme, aber ich versuche es.)

Sagen wird du hättest die beiden Audioausgabe-pcm-Dinger pcm.scheewittchen und pcm.rumpelstizchen, dann könntest du mit einem folgendermaßen definierten pcm.grimm beide gleichzeitig ansprechen:

Code: Alles auswählen

pcm.grimm {
	type plug
	slave.pcm {
		type multi
		slaves {
			a { channels 2 pcm "schneewittchen" }
			b { channels 2 pcm "rumpelstizchen" }
		}
		bindings {
			0 { slave a channel 0 }
			1 { slave a channel 1 }
			2 { slave b channel 0 }
			3 { slave b channel 1 }
		}
	}
	ttable [
		[ 1 0 1 0 ] # erster Kanal (links) nach links (a) und links (b)
		[ 0 1 0 1 ] # zweiter Kanal (rechts) nach rechts (a) und rechts (b)
	]
}
(Das ist eine Abfolge aus gleich zwei Plugins plug und multi – meiner Erfahrung nach erwartet multi hier aus irgendeinem mir nicht nachvollziehbaren Grund 4 Kanäle als Eingabe – ohne plug geht es also nicht.)
So, ich komme endlich wieder dazu weiterzumachen. Aber bei der Umsetzung von smutberts Umschlag bin ich noch nicht erfolgreich.
Ich habe zwar keine zwei BT-Kopfhörer zur Hand, aber einen Lautsprecher und einen Kopfhörer. Das sollte ja hier (beide gleichzeitig mit derselben Tonquelle zu betreiben) im Prinzip keinen Unterschied machen?

Beide Ausgabegeräte wurden mit bluetoothctl gepaart und verbunden Beide funktionieren einzeln laut Test mit aplay -D bluealsa:HCI=hci0,DEV=[MAC],PROFILE=a2dp xyz.wav

So und nun das Problem, beide als gleichzeitig zu benutzende in der .asondrc unterzubringen. Vorweg: es gibt zuviele „Namen“ in der bisherigen Konfiguration:

Code: Alles auswählen

pcm.BT_Laut1_regl {		# unter dem Namen „BT_Laut1_regl“ wird der Lautsprecher(!)
				# von Anwendungsprogrammen (z.B. vlc, audacious) geführt
  type softvol			# Alsa-Plugin für softwaregestützte Lautstärkeregelung
  slave.pcm "BT_Laut1"		# zuständiger Lautsprecher
  control.name "BT_Laut1_Regl"	# Name des Lautstärke-Reglers in alsamixer/qasmixer
  control.card PCH		# Name der Soundkarte für diese Konfiguration,
				# erfahrbar via aplay -l oder cat /proc/asound/cards
}

pcm.BT_Laut1 {			# Lautsprechername BT_Laut1
  type bluealsa			# Alsa-Plugin für Bluetooth
  interface "hci0"		# Name des Bluetooth-Adapters
  device "88:00:00:00:31:F0"	# MAC-Adresse des BT-Lautsprechers
  profile "a2dp"		# Bluetooth-Profil
}
und das Problem potenziert sich, wenn nun zwei Ausgabegeräte in .asoundrc konfiguriert werden sollen: Eine wesentliche Hürde erscheint mir der „Name“ in der Zeile control.name ... Der erscheint im Softwaremixer und der darf offenbar nicht identisch sein mit dem „eigentlichen“ Namen des Lautsprechers in der Zeile „pcm.BT_Laut1“.
Es erscheint möglich für control.name den gleichen Namen zu verwenden wie den in der Zeile pcm.BT_Laut1_regl. Ob das aber sinnvoll ist, darüber grüble ich noch. Über den zuletzt genannten Namen wird das Ausgabegerät in Anwendungsprogrammen wie audacious und vlc angesprochen.

Es verbleiben also für ein und dasselbe Ausgabegerät mind. zwei Namen. Dem Kopfhörer würde ich mal den vorläufigen Namen kopf1 verpassen, Nur an welcher Stelle könnte man ihn so und wo müsste man ihn abgewandelt anwenden, so dass immer (für mich/für audacious?) noch klar wäre, was gemeint ist.

Mal praktisch, diese .asoundrc funktioniert nicht:

Code: Alles auswählen

pcm.doppelt {
	type plug
	slave.pcm {
		type multi
		slaves {
			a { channels 2 pcm "BT_Laut1_regl"
			b { channels 2 pcm "kopf1_regl"
		}
		bindings {
			0 { slave a channel 0 }
			1 { slave a channel 1 }
			2 { slave b channel 0 }
			3 { slave b channel 1 }
		}
	}
	ttable [
		[ 1 0 1 0 ] # erster Kanal (links) nach links (a) und links (b)
		[ 0 1 0 1 ] # zweiter Kanal (rechts) nach rechts (a) und rechts (b)
	]
}

pcm.BT_Laut1_regl {		# unter dem Namen „BT_Laut1_regl“ wird der Lautsprecher(!)
				# von Anwendungsprogrammen (z.B. vlc, audacious) geführt
  type softvol			# Alsa-Plugin
  slave.pcm "BT_Laut1"		# zuständiger Lautsprecher
  control.name "BT_Laut1_Regl"	# Name des Reglers für BT_Laut_Beck in alsamixer/qasmixer
  control.card PCH		# Name der Soundkarte für diese Konfiguration,
				# erfahrbar via aplay -l oder cat /proc/asound/cards
}

pcm.kopf1_regl {		# unter dem Namen „kopf1_regl“ wird der Lautsprecher
				# von Anwendungsprogrammen (z.B. vlc, audacious) geführt
  type softvol			# Alsa-Plugin
  slave.pcm "kopf1"		# zuständiger Lautsprecher
  control.name "kopf1_Regl"	# Name des Reglers für BT_Laut_Beck in alsamixer/qasmixer
  control.card PCH		# Name der Soundkarte für diese Konfiguration,
				# erfahrbar via aplay -l oder cat /proc/asound/cards
}


pcm.BT_Laut1 {			# Lautsprechername BT_Laut1
  type bluealsa			# Alsa-Plugin für Bluetooth
  interface "hci0"		# Name des Bluetooth-Adapters
  device "88:00:00:00:31:F0"	# MAC-Adresse des BT-Lautsprechers
  profile "a2dp"		# Bluetooth-Profil
}

pcm.kopf1
  type bluealsa
  interface "hci0"
  device "12:51:02:20:0F:E8"
  profile "a2dp"
}
Nebenbei: /var/lib/alsa/asound-state ist menschenlesbar und die Syntax ist offenbar die gleiche wie bei .asoundrc. Wenn ich fertig bin, pass' ich das mal an. :wink:
Zuletzt geändert von fischig am 06.07.2020 11:44:53, insgesamt 4-mal geändert.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 10.05.2020 08:39:30

Kann es sein, dass wir hier auf einem „Holzweg“ sind? Das wäre ziemlich schade, denn ich verfolgte das gerne weiter, wenn ich wüsste wie/was ich falsch mache.
Ich habe hier aufgeschnappt, dass Bluetooth-„Transmitter“ in der Lage sein könnten, das Gewünschte (Ton auf zwei BT-Lautsprecher gleichzeitig) zu leisten. Ich meine auch, zwei Geräte recherchiert zu haben, die explizit mit dieser Funktionalität beworben werden, aber der Begriff an sich ist mir noch höchst unklar. Ist das eher so'n Marketing-Begriff? Teilweise habe ich den Eindruck, dass die Teile im Prinzip erstmal nichts anderes sind als jeder popelige Bluetooth-Controller.

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 12.05.2020 17:46:40

So, entschuldige, dass ich mich erst jetzt wieder melde.

Die Einschränkung mit den Namen war mir nicht bewusst, überrascht mich aber auch nicht allzu sehr. Es wäre ohnehin logischer Den Regler gleich wie das softvol-Plugin selbst und nicht wie das pcm-Ding zu nennen, an das der Ton weitergeleitet wird – nur als Beispiel was ich meine anhand eines der Geräte

Code: Alles auswählen

pcm.lautsprecher {

  type softvol			# Alsa-Plugin
  slave.pcm "lautsprecher_hardware" # zuständiger Lautsprecher
  control.name "lautsprecher"
  control.card PCH		# Name der Soundkarte für diese Konfiguration,
				# erfahrbar via aplay -l oder cat /proc/asound/cards
}

pcm.lautsprecher_hardware {
  type bluealsa			# Alsa-Plugin für Bluetooth
  interface "hci0"		# Name des Bluetooth-Adapters
  device "88:00:00:00:31:F0"	# MAC-Adresse des BT-Lautsprechers
  profile "a2dp"		# Bluetooth-Profil
}
(Da würde es mich wiederum überraschen, wenn es an den Namen scheiterte)

Die Bluetooth-Transmitter, die du verlinkt hast, dürften das in Hardware machen, was du gerade mit Alsa versuchst. Die verfügen aber nicht etwa über einen USB-Anschluss um sie am Computer als Bluetooth-Controller verwenden zu können sondern viel mehr haben sie einen Audioeingang.
(Damit würdest du dich also mit einem Schlag nicht mehr mit den Bluetooth-Eigenheiten herumschlagen müssen, weil dein Computer dann von Bluetooth-Lautsprechern und Kopfhörern gar nichts mehr wissen bräuchte.)

Edit:
Ok der Transmitter verfügt doch über einen USB-Anschluss mit dem man ihn offensichtlich auch als BT-Controller verwenden kann, aber wenn das so ist und du ihn so nutzen wolltest, stündest du konfigurationsmäßig vor exakt demselben Problem wie jetzt auch.

Edit Nummer 2:
Lässt sich laut Beschreibung doch nicht als BT-Controller verwenden, Der USB-Anschluß dient nur dem Laden und der Stromversorgung. Es bleibt also dabei, dass du den Transmitter nur an den Audioausgang anschließen könntest, um so den Schwächen der BT-Unterstützung von GNU/Linux aus dem Weg zu gehen.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 12.05.2020 19:54:20

Hmmm,

ich sehe da auf den ersten Blick keinen Unterschied zu dem was wir schon hatten, und was auch funktioniert. Tonausgabe auf einem BT-Lautsprecher einschließlich Lautstärkeregelung via alsamixer. Hilf mir auf die Srüngen, wenn ich was überehen habe. Mein gegenwärtiges Problem ist die parallele/synchrone Tonausgabe auf zwei Lautsprecher/Kopfhörer. Dazu hattest du einen anderen Vorschlag gemacht, mit dem ich bisher nicht zurecht komme.

Davon unabhängig:
Es wäre ohnehin logischer Den Regler gleich wie das softvol-Plugin selbst und nicht wie das pcm-Ding zu nennen
Das hat auch einen Haken, da zumindest ein Anwendungsprogramm (vlc) das Ausgabegerät anders benennt als alsamixer den Regler. Ist aber erstmal nicht so wichtig, sollte man aber im Hinterkopf haben, denk' ich.
Die Bluetooth-Transmitter, [...] haben [...] einen Audioeingang.
Man könnte sie also sozusagen mit der Klinkendose für kabelgebundene Tonausgabe am Rechner verbinden - richtig?

Dass, wenn man sie als BT-Controller benutzt, man bezüglich der zwei Lautsprecher nichts gewonnen hätte, hatte ich mir auch schon gedacht. Und wie gesagt. der Begriff „Transmitter“ ist wohl nicht standardisiert und wird nach meinem Eindruck von den Markt-Anbietern auch so verwendet: Synonym für BT-Controller. Man muss also genau aufpassen, über welche Funktionalität ein solches Gerät konkret verfügt.

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 12.05.2020 22:41:50

Mir ging es nur um die Benennung des Reglers. Ich weiß nicht woran es bei der gleichzeitigen Wiedergabe über zwei Geräte (sonst noch) scheitert. Vielleicht würde es sich ja lohnen, es einmal ohne softvol-Plugins mit einer minimaleren Variante zu probieren, um Fehlerquellen auszuschließen. Ich denke an die gleichzeitige Wiedergabe über ein Bluetoothgerät und die internen Lautsprecher:

Code: Alles auswählen

pcm.doppelt {
	type plug
	slave.pcm {
		type multi
		slaves {
			a { channels 2 pcm "hw:PCH" }
			b { channels 2 pcm "kopf1" }
		}
		bindings {
			0 { slave a channel 0 }
			1 { slave a channel 1 }
			2 { slave b channel 0 }
			3 { slave b channel 1 }
		}
	}
	ttable [
		[ 1 0 1 0 ] # erster Kanal (links) nach links (a) und links (b)
		[ 0 1 0 1 ] # zweiter Kanal (rechts) nach rechts (a) und rechts (b)
	]
}

pcm.kopf1 {
  type bluealsa
  interface "hci0"
  device "12:51:02:20:0F:E8"
  profile "a2dp"
}
Wenn das funktioniert, könnten wir das Schritt für Schritt auf die Wiedergabe über beide Bluetoothgeräte umbauen.


fischic hat geschrieben: ↑ zum Beitrag ↑
12.05.2020 19:54:20
Die Bluetooth-Transmitter, [...] haben [...] einen Audioeingang.
Man könnte sie also sozusagen mit der Klinkendose für kabelgebundene Tonausgabe am Rechner verbinden - richtig?
Ganz genau.
fischic hat geschrieben: ↑ zum Beitrag ↑
12.05.2020 19:54:20
Dass, wenn man sie als BT-Controller benutzt, man bezüglich der zwei Lautsprecher nichts gewonnen hätte, hatte ich mir auch schon gedacht. Und wie gesagt. der Begriff „Transmitter“ ist wohl nicht standardisiert und wird nach meinem Eindruck von den Markt-Anbietern auch so verwendet: Synonym für BT-Controller. Man muss also genau aufpassen, über welche Funktionalität ein solches Gerät konkret verfügt.
Ja, wobei dieses Exemplar aus Sicht des Computers kein Bluetooth-Controller ist und wahrscheinlich gilt das auch für andere Geräte dieser Art, die eher auf Unterhaltungselektronik ausgerichtet sind.
Zuletzt geändert von smutbert am 13.05.2020 14:25:37, insgesamt 1-mal geändert.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 13.05.2020 14:10:34

Ich habe die asoundrc nach deinem Vorschlag kopiert.

Und was sagen wir jetzt aplay, was es tun soll, um bruce-usa.wav abzuspielen?

Code: Alles auswählen

aplay bruce-usa.wav
bringt genauso wie

Code: Alles auswählen

aplay -D doppelt bruce-usa.wav
Diese Fehlermeldung:

Code: Alles auswählen

ALSA lib conf.c:1852:(snd_config_load1) _toplevel_:27:1:Unexpected char
ALSA lib conf.c:3615:(config_file_open) /home/thekla/.asoundrc may be old or corrupted: consider to remove or fix it
ALSA lib conf.c:3537:(snd_config_hooks_call) function snd_config_hook_load returned error: Das Argument ist ungültig
ALSA lib conf.c:3986:(snd_config_update_r) hooks failed, removing configuration
aplay: main:788: Fehler beim Öffnen des Gerätes: Das Argument ist ungültig
thekla@t430:~$ 
Was ist 27:1 in der ersten Zeile der Meldung? Wenn das Zeile:Spalte in asoundrc meinen sollte: Das ist die letzte leere Zeile in dieser Datei.

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 13.05.2020 14:32:05

So habe ich es gemeint

Code: Alles auswählen

aplay -D doppelt bruce-usa.wav
und diese Fehlermeldung sagt uns, dass ich mindestens ein paar Klammern vergessen habe. Ich korrigiere es gleich in meinem vorigen Beitrag, es geht um die Zeilen 6, 7 und 23 wenn ich mich nicht verzählt hab.
[...]
a { channels 2 pcm "hw:PCH" }
b { channels 2 pcm "kopf1" }

[...]

pcm.kopf1 {
[...]
Was 27:1 für eine Angabe ist weiß ich nicht – möglicherweise Zeilen:Spalten im Quellcode der Alsabibliothek, die dazu führen oder die Stelle der globalen Konfiguration (ev. »/usr/share/alsa/alsa.conf«), die für das Einbinden der »~/.asoundrc« verantwortlich ist.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 13.05.2020 18:17:45

Code: Alles auswählen

$ aplay -D doppelt bruce-usa.wav
Wiedergabe: WAVE 'bruce-usa.wav' : Unsigned 8 bit, Rate: 44100 Hz, stereo
aplay: pcm_write:2011: Schreibfehler: Das Argument ist ungültig
vlc spielt die Datei - nur auf dem internen Lautsprecher

Nebenbei: Hatte ich schon darauf hingewiesen, dass dein Tipp, /var/lib/alsa/asound.state zu bereinigen, funktioniert.

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 13.05.2020 23:21:30

Das Problem kann ich auf meinem Raspberry Pi nachvollziehen. Ursache könnten Eigenheiten von bluealsa sein, das werde ich noch versuchen herauszufinden. Lösung habe ich jedenfalls noch keine.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 14.05.2020 08:26:35

Ich teile mal diese Beobachtung mit, vielleicht hilft sie uns weiter:
Ich habe hier noch eine Datei namens audiodump.wav im home, von der ich weder weiß, wann ich die auf das System geholt habe noch woher, aber: Wenn ich die asoundrc auf den Kopfhörer reduziere wird diese Datei von aplay klaglos abgespielt.

versuche ich's mit „doppelt“ kommt diese Fehlermeldung:

Code: Alles auswählen

$ aplay -D doppelt audiodump.wav
Wiedergabe: WAVE 'audiodump.wav' : Signed 16 bit Little Endian, Rate: 48000 Hz, stereo
aplay: pcm_write:2011: Schreibfehler: Das Argument ist ungültig
Keiner der beiden Lautsprecher hat Ton.
vlc zeigt mit „doppelt“ das gleiche wie mit Springsteen (burce-usa.wav)

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 14.05.2020 12:05:15

Der Fehler kommt bei mir aber wirklich nur im Zusammenspiel mit bluealsa. Mit anderen Geräten wie USB-Soundkarten, Onboardsound oder virtellen Soundkarten funktioniert es. Es sieht also so aus als läge es tatsächlich an den Eigenheiten von bluealsa. Tricks wie das Zwischenschalten zusätzlicher Alsa-Plugins haben bei meinen Versuchen leider auch nichts gebracht.

Jetzt habe ich zwei mögliche Workarounds in petto:
  1. wir versuchen die Fehler/Störungen aus der Idee mit dem Umschalten im laufenden Betrieb über die Loopbacksoundkarte auszubügeln. Dann müssen wir die beiden Audiogeräte nicht in der der ~/.asoundrc zu einem zusammenfassen.
  2. du verzichtest auf mplayer und schwenkst auf mpd um – mit etwas Glück können wir dann sogar komplett auf die ~/.asoundrc verzichten.
Ich würde Variante 2 bevorzugen, aber bevor wir uns darauf festlegen wäre es interessant ob du auch noch andere Anwendungen als Radio/Musik hören im Sinn hast.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 15.05.2020 08:43:37

smutbert hat geschrieben:Ich würde Variante 2 bevorzugen, aber bevor wir uns darauf festlegen wäre es interessant ob du auch noch andere Anwendungen als Radio/Musik hören im Sinn hast.
Nein, habe ich nicht. Ich benötige die gleichzeitige Tonwiedergabe auch nur auf einem Rechner, auf dem ich zusammen mit meiner Frau Videos anschaue, und der Ton weitere Menschen stören könnte (ich höre nicht so gut, meint meine Frau :wink: ). Ansonsten habe ich noch kein mir für mich interessantes Anwendungsszenario entdeckt.
mpd scheint mir kein Problem, nachdem ich mit smplayer als Video-Programm eh nicht mehr besonders zufrieden bin. (mplayer wird lediglich auf dem "Küchenradio" und nur zum Radio hören benutzt. Ist kein Thema, bluealsa funktioniert dort bestens, zumindest komme ich damit eindeutig besser zurecht als mit BT über pulse). Variante 2 wäre für mich also testtauglich.
smutbert hat geschrieben:wir versuchen die Fehler/Störungen aus der Idee mit dem Umschalten im laufenden Betrieb über die Loopbacksoundkarte auszubügeln.
Da verstehe ich dich nicht recht. Die Umschaltidee ist für mich nicht besonders relevant und die habe ich zurückgestellt. Bei unseren letzten Bemühungen war die doch auch gar nicht mehr involviert - oder? Ergo, welche Fehler hinsichtlich Simultanbetrieb zweier BT-Kopfhörer willst du da ausbügeln? Wenn du mit Variante 1 dennoch einen Weg siehst, den zu verfolgen lohnen könnte, wäre der mir eigentlich sympathischer (weil unabhängig von Anwendungsprogrammen wie mpd, vlc, etc.?)

Die Wahl der Waffen überlasse ich dir. Allein kriege ich das eh nicht hin und würde schauen, ob ich mit einem „Transmitter“ weiter käme.

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 15.05.2020 23:48:51

Mit einem Transmitter wärst du zwar den Fähigkeiten bzw. der Zuverlässigkeiten des Transmitters auf Gedeih und Verderb ausgeliefert (kann ja aber nicht viel schlimmer sein als die Bluetooth-Unterstützung von GNU/Linux :mrgreen: ) aber von der Computerseite her wärst du alle Probleme, insbesondere Software-/Alsa-Schwierigkeiten los.
Bei Variante 1 liegt der Trick im Verwenden der Loopback-Soundkarte. So verhindert man, dass störrische Alsa-Plugins bzw. -Plugin-Kombinationen direkt miteinander umgehen müssen. Das Umschalten im laufenden Betrieb bekommt man als Nebenprodukt fast aufgezwängt und die Fehler, die du bei unserem ersten Versuchen beschrieben hast (viewtopic.php?f=25&t=177012&start=45#p1236589) klangen für mich lösbar.
Tatsächlich habe ich eine Konfiguration gefunden, die bei mir zuverlässig funktioniert.
Schuld an den Problemen war übrigens auch mplayer. Das ganze war eine schwere Geburt, daher beschreib ich das jetzt ganz von vorne und in zwei Teilen:


Teil 1
Einrichten der Loopback-Soundkarte und die Wiedergabe mit mplayer

Wie gehabt muss zuerst das Kernelmodul für die Loopback-Soundkarte geladen werden

Code: Alles auswählen

# modprobe snd-aloop
und mit ein paar Zeilen in der »/etc/asound.conf« (es wird auch die »~/.asoundrc« funktionieren, aber weil ich bei meinen Tests auch mit mpd und mit unterschiedlichen Benutzern gearbeitet habe, habe ich die systemweite Konfigurationsdatei verwendet und ich beschreibe es hier genau so wie es funktioniert hat) konfigurieren wir die Loopback-Soundkarte in eigenen pcms

Code: Alles auswählen

# pcm für die Wiedergabe mit festgelegtem, bewährtem Format
pcm.loopsink {
	type plug
	slave {
		# Wiedergabe an die virtuelle Soundkarte
		pcm "hw:Loopback,0"

		# Format
		rate 48000
		format "S16_LE"
		channels 2
	}
}

pcm.dsnooper {
	# dsnoop erlaubt gleichzeitige Aufnahmen mit mehreren Programmen
	type dsnoop

	# beliebiger Wert (in der Konfiguration nicht zwei Mal denselben Wert verwenden!)
	ipc_key 1536

	# hier landen die Audiodaten der Wiedergabe an Loopback,0, also vom oben definierten
	# pcm.loopsink und in Folge auch die Audiodaten, die am unten definierten pcm.schleife
	# wiedergegeben werden
	slave.pcm "hw:Loopback,1"
}

pcm.schleife {
	# Plugin zum Zusammensetzen zweier unterschiedlicher Geräte zur Wiedergabe und Aufnahme
	type asym

	# weiterleiten von/zu den oben definierten pcms
	playback.pcm "loopsink"
	capture.pcm "plug:dsnooper"
}
Fehlt im ersten Teil nur noch die Wiedergabe an die Loopback-Soundkarte eines Internetradionsenders (ich hab zum Testen Irish Pub Radio gewählt)

Code: Alles auswählen

$ mplayer -ao alsa:device=schleife http://178.32.219.72:8326

Teil 2
Aufnahme von der Loopback-Soundkarte und die Wiedergabe an die echten Lautsprecher/Kopfhörer

Mit den eingebauten Lautsprechern sollte es auf Anhieb mit dem Befehl (man beachte die zur asoundrc/conf identischen Formatangabenin beiden Befehlen: -r 48000 -f S16_LE -c 2)

Code: Alles auswählen

$ arecord -r 48000 -f S16_LE -c 2 -D schleife | aplay -r 48000 -f S16_LE -c 2 -D plughw:PCH
klappen.
Für die Bluetoothgeräte fügst du noch die gewohnten Abschnitte zur »/etc/asound.conf« (wieder: es wird auch die »~/.asoundrc« funktionieren) hinzu

Code: Alles auswählen

# Lautstärkeregelung für den Bluetooth-Lautsprecher
pcm.bt_ls {
	# Plugin zur Lautstärkeregelung
	type softvol
	
	# Weiterleitung an...
	slave.pcm "bt_ls_hw"
	
	# Name des Reglers und Soundkarte (aplay -l) in der er erscheinen soll
	control.name "PCM Bluetooth-LS"
	control.card PCH
}

# Dasselbe noch einmal für den Bluetooth-Kopfhörer
pcm.bt_kh {
	type softvol
	slave.pcm "bt_kh_hw"
	control.name "PCM Bluetooth-KH"
	control.card PCH
}

# Bluetooth-Lautsprecher
pcm.bt_ls_hw {
	# Plugin bluealsa ist für Bluetooth zuständig
	type bluealsa

	# Name des Bluetooth-Adapters
	# (nicht notwendig, wenn nur ein Adapter vorhanden ist)	
	interface "hci0"

	# MAC-Adresse des Bluetooth-Lautsprechers
	device "88:00:00:00:31:F0"
	
	# zu verwendendes Protokoll zur Audiodatenübertragung (Bluetooth-Profil)
	profile "a2dp"
}

# Dasselbe noch einmal für den Bluetooth-Kopfhörer
pcm.bt_kh_hw {
	type bluealsa
	interface "hci0"
	device "12:51:02:20:0F:E8"
	profile "a2dp"
}
Die Wiedergabe an den beiden Geräten sollte dann mit

Code: Alles auswählen

$ arecord -r 48000 -f S16_LE -c 2 -D schleife | aplay -r 48000 -f S16_LE -c 2 -D plug:bt_ls
und

Code: Alles auswählen

$ arecord -r 48000 -f S16_LE -c 2 -D schleife | aplay -r 48000 -f S16_LE -c 2 -D plug:bt_kh
Es tut mir leid, dass ich andere Namen verwendet habe, aber mit deinen bin ich ständig durcheinander gekommen und darüber hinaus hoffe ich sehr, dass ich beim Kopieren ins Forum keinen Fehler eingebaut habe.
Zuletzt geändert von smutbert am 17.05.2020 11:17:04, insgesamt 1-mal geändert.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 17.05.2020 08:44:58

Mann, Mann, das sieht nach viel Hirnschmalz aus! :THX: :THX: :THX:

Bevor ich an die Umsetzung gehe:

Code: Alles auswählen

$ mplayer -ao alsa:device=schleife http://178.32.219.72:8326
ist nur insofern nötig, weil zum vollständigen Testen (Teil1+Teil2) ja irgend eine Tonquelle benötigt wird?
Man könnte ebenso gut nach Fertigstellen der config eine Musikdatei via

Code: Alles auswählen

 aplay -D [schleife] [musik].wav
abzuspielen versuchen
Falls „nein“, habe ich's wohl noch nicht richtig verstanden.

Noch 'ne Nachfrage:
Du verfügst über mind. drei Tonausgabe-Geräte: Rechner-Lautsprecher, BT-Lautsprecher und BT-Kopfhörer. Ein Rechner-Lautsprecher wird in deinem Code nicht behandelt, so dass sich die Konfiguration ausschließlich mit BT-Lautsprecher und BT-Kopfhörer befasst - richtig?
Falls „ja“: weitere Kommentierung deinerseits unnötig, bei der Frage geht's mir nur drum, Denkfehler zu minimieren.

Weiter, falls „ja“: dann ist die Kommentierung in diesen beiden Zeilen inkorrekt:

Code: Alles auswählen

	# MAC-Adresse des Bluetooth-Kopfhörers
	device "88:00:00:00:31:F0"
Der Kopfhörer taucht nämlich weiter unten noch mal auf - mit anderer MAC. Ich denke mir, eine der beiden MACs gilt für den BT-Kopfhörer, die andere für den BT-Lautsprecher?

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 17.05.2020 15:39:02

fischic hat geschrieben: ↑ zum Beitrag ↑
17.05.2020 08:44:58

Code: Alles auswählen

$ mplayer -ao alsa:device=schleife http://178.32.219.72:8326
ist nur insofern nötig, weil zum vollständigen Testen (Teil1+Teil2) ja irgend eine Tonquelle benötigt wird?
Ja, wobei ich gar nicht ausprobiert habe, ob es funktioniert, wenn man versucht mit arecord | aplay von der Loopback-Soundkarte aufzunehmen, bevor überhaupt irgendetwas darüber wiedergegeben wird.
fischic hat geschrieben: ↑ zum Beitrag ↑
17.05.2020 08:44:58
Du verfügst über mind. drei Tonausgabe-Geräte: Rechner-Lautsprecher, BT-Lautsprecher und BT-Kopfhörer. Ein Rechner-Lautsprecher wird in deinem Code nicht behandelt, so dass sich die Konfiguration ausschließlich mit BT-Lautsprecher und BT-Kopfhörer befasst - richtig?
In der asoundrc/asound.conf kommt der eingebeaute Lautsprecher nicht vor. Die Wiedergabe darüber sollte mit dem ersten arecord | aplay-Befehl trotzdem funktionieren.

fischic hat geschrieben: ↑ zum Beitrag ↑
17.05.2020 08:44:58
Weiter, falls „ja“: dann ist die Kommentierung in diesen beiden Zeilen inkorrekt:
Ja, ich habe zuerst gedacht es wären zwei BT-Kopfhörer, hab meinen Fehler beim posten erkannt, aber nicht überall korrigiert. (Jetzt sollte es aber stimmen.)

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 17.05.2020 15:46:49

Danke sehr! Leider komme ich jetzt wohl erst wieder am Donnerstag dazu. Fahre ein paar Tage mit der Liebsten zum Wandern!

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 21.05.2020 12:12:22

So, da bin ich wieder.
Ich habe deinen Code so kopiert: Teil1 und Teil 2 in eine .asoundrc.

Die Kopie funktioniert. Bis ich sie verdaut habe, werde ich wohl noch einiges erfragen müssen, aber das kommt später. Einstweilen sieht es so aus, dass ich die beiden abschließenden Kommandos nicht gleichzeitig laufen lassen kann. Ton entweder nur über plug:bt_ls oder nur über plug:bt_kh.

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 21.05.2020 23:22:58

Eigentlich war es schon so gedacht, dass die beiden gleichzeitig laufen können. Bluealsa kann das jedenfalls und so wie ich es beschrieben habe sollte es eigentlich auch klappen.

Allerdings bin ich nach deiner Schilderung auf eine mögliche Ursache gestossen. Viele (billige?) Bluetooth-Controller unterstützen so wie es aussieht (gleichzeitig) nur eine a2dp-Verbindung. Hier [1] hat das jemand offensichtlich mit zwei Bluetooth-Controllern (einer pro Bluetooth-Lautsprecher) gelöst.

[1] https://github.com/Arkq/bluez-alsa/issues/79

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 22.05.2020 00:03:58

Kann es sein, dass ein sogenannter „SBC“ „codec“, was immer das sein mag, bei der simultanen Tonwiedergabe eine wichtige Rolle spielen mag? Dieser „codec“ spielt in deinem Link eine Rolle, und auch bei einem der von mir gefundenen Transmitter https://www.ebay.de/itm/TROND-Bluetooth ... 3356949317 ist die Rede davon, dass bei Simultanbetrieb der Transmitter auf diesen „codec“ zurückfällt. Hast du eine Idee, ob man bei dem aktuell von mir verwendeten Controller versuchen könnte, ihn auf diesen codec festzunageln?

Ich bin etwas ratlos, einen Controller zu finden, der Simultanwiedergabe sicher beherrscht - China und Preis hin oder her. Ich habe das noch in keiner Beschreibung gefunden.

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 22.05.2020 21:51:39

Ich kenne leider keine Möglichkeit den Codec festzulegen und weiß auch nicht ob/welche Bluetooth-Controller mehrere a2dp-Verbindungen unterstützen. Ich habe (mit unterschiedlichen Begründungen) die Behauptung gefunden, dass generell nur eine a2dp-Verbindung pro Bluetooth-Controller funktioniert (und auch gegenteilige Behauptungen).

Ausprobieren kann ich es mangels zweitem Bluetoothgerät mit meinem Bluetooth-Controller (einer von Intel) leider nicht.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 22.05.2020 23:11:40

Ich werde das morgen mal mit einem weiteren (Billig-)USB-Controller probieren. Wenn ich recht sehe, muss ich via bluetoothctl den einen Lautsprecher an hci0 löschen und mit dem zusätzlichen hci1 neu verbinden und natürlich so in den Code einfügen. Lieber wär's mir schon gewesen, das mit einem Controller hinzukriegen. so dicke ist die Anzahl der USB-Buchsen ja selbst bei nicht ganz alter Hardware nicht. Immerhin scheint der Nebeneffekt deiner Mühen (einfaches Umschalten zwischen den Lautsprechern) zwar noch mit etwas scripten, aber prinzipiell machbar.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 23.05.2020 09:45:09

So, erstmal: Wir bleiben am besten bei deinen Bezeichnungen. Es ist ohne individuelle Namensgebung kompliziert genug! :wink:

Hier meine .asoundrc:

Code: Alles auswählen

# pcm für die Wiedergabe mit festgelegtem, bewährtem Format
pcm.loopsink {
	type plug
	slave {
		# Wiedergabe an die virtuelle Soundkarte
		pcm "hw:Loopback,0"

		# Format
		rate 48000
		format "S16_LE"
		channels 2
	}
}

pcm.dsnooper {
	# dsnoop erlaubt gleichzeitige Aufnahmen mit mehreren Programmen
	type dsnoop

	# beliebiger Wert (in der Konfiguration nicht zwei Mal denselben Wert verwenden!)
	ipc_key 1536

	# hier landen die Audiodaten der Wiedergabe an Loopback,0, also vom oben definierten
	# pcm.loopsink und in Folge auch die Audiodaten, die am unten definierten pcm.schleife
	# wiedergegeben werden
	slave.pcm "hw:Loopback,1"
}

pcm.schleife {
	# Plugin zum Zusammensetzen zweier unterschiedlicher Geräte zur Wiedergabe und Aufnahme
	type asym

	# weiterleiten von/zu den oben definierten pcms
	playback.pcm "loopsink"
	capture.pcm "plug:dsnooper"
}

# Lautstärkeregelung für den Bluetooth-Lautsprecher
pcm.bt_ls {
	# Plugin zur Lautstärkeregelung
	type softvol
	
	# Weiterleitung an...
	slave.pcm "bt_ls_hw"
	
	# Name des Reglers und Soundkarte (aplay -l) in der er erscheinen soll
	control.name "PCM Bluetooth-LS"
	control.card PCH
}

# Dasselbe noch einmal für den Bluetooth-Kopfhörer
pcm.bt_kh {
	type softvol
	slave.pcm "bt_kh_hw"
	control.name "PCM Bluetooth-KH"
	control.card PCH
}

# Bluetooth-Lautsprecher
pcm.bt_ls_hw {
	# Plugin bluealsa ist für Bluetooth zuständig
	type bluealsa
	# Name des Bluetooth-Adapters
	# (nicht notwendig, wenn nur ein Adapter vorhanden ist)	
	interface "hci0"
	# MAC-Adresse des Bluetooth-Lautsprechers
	device "88:00:00:00:31:F0"
	# zu verwendendes Protokoll zur Audiodatenübertragung (Bluetooth-Profil)
	profile "a2dp"
}

# Dasselbe noch einmal für den Bluetooth-Kopfhörer
pcm.bt_kh_hw {
	type bluealsa
	interface "hci1"
	device "12:51:02:20:0F:E8"
	profile "a2dp"
}
Die Zuordnung der jeweiligen Controller-MACs zu hci* habe ich via

Code: Alles auswählen

hcitool dev
rausbekommen.

Beim Testen funktioniert die Irish-Pub-Ausgabe via bt_ls. bt_kh funktioniert nicht, auch nicht, wenn ich die Ausgabe via bt_ls abbreche. Ich vermute, irgendwie kommt er an hci1 nicht heran.
Meldung ist:

Code: Alles auswählen

ALSA lib pcm_dsnoop.c:673:(snd_pcm_dsnoop_open) unable to open slave
arecord: main:788: ALSA lib bluealsa-pcm.c:667:(_snd_pcm_bluealsa_open) BlueALSA connection failed: Datei oder Verzeichnis nicht gefunden
aplay: main:788: Fehler beim Öffnen des Gerätes: Das Argument ist ungültig
Fehler beim Öffnen des Gerätes: Datei oder Verzeichnis nicht gefunden

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

Re: bluealsa, ~/.asoundrc

Beitrag von smutbert » 23.05.2020 20:57:49

Mit welchem Befehl startest du bluealsa (den Daemon) doch gleich? Legst du bluealsa auf hci0 fest?

Möglicherweise oder sogar vermutlich brauchst du zwei bluealsa-Instanzen, eine pro Bluetooth-Controller. Ich glaube du startest das in der rc.local? Dort könntest du zwei Befehle eintragen

Code: Alles auswählen

bluealsa -i hci0 ... &
bluealsa -i hci1 ... &
... steht für die anderen Optionen, die du wohl am besten beibehältst (--disable-hsp oä) und das & am Ende ist vor allem beim ersten Daemon wichtig, damit er im Hintergrund gestartet wird und nicht die weitere Ausführung von rc.local, also insbesondere das Starten des zweiten bluealsa-Daemons blockiert.
Zuletzt geändert von smutbert am 24.05.2020 11:52:28, insgesamt 1-mal geändert.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 24.05.2020 09:54:28

Funktioniert nicht mit zwei Instanzen. Näheres habe ich noch nicht rausgefunden.
Geht das überhaupt:
It is not possible to run more than one instance of the BlueALSA server per D-Bus interface.
?(1)
(1) https://github.com/Arkq/bluez-alsa Keine Ahnung, ob ich eine „D-Bus-Schnittselle“ benutze.

Was bedeutet/welche Konsequenzen hat, wenn bluetoothctl einen der beiden Controller zum default erklärt?

Nebenbei: Ich benutzte bisher (schon ziemlich am Anfang erwähnt [vor S. 4]) keinerlei Optionen mehr im bluealsa-Kommando in rc.local. Die Option --disable-hsp erschien mir bestenfalls überflüssig.
Gibt's irgendwo Zusammenstellungen der Optionen von bluealsa? Eine Manpage habe ich nicht.

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: bluealsa, ~/.asoundrc

Beitrag von fischig » 26.05.2020 12:01:02

smutbert hat geschrieben:Viele (billige?) Bluetooth-Controller unterstützen so wie es aussieht (gleichzeitig) nur eine a2dp-Verbindung.
Ich habe begründete Hoffnung, dass das nicht zutrifft. MIt dieser simplen asoundrc

Code: Alles auswählen

pcm.btL1 {			# Lautsprecher-pcm (für BT-Speaker in bluetoothctl)
  type bluealsa			# Alsa-Plugin für Bluetooth
  interface "hci0"		# vom Kernel eingerichtete BT-Schnittstelle
  device "88:00:00:00:31:F0"	# MAC-Adresse des Lautsprechers (= „BT-Speaker“ in bluetoothctl,
				# Lautsprecher mit Werbeaufdruck für Becks Bier)
  profile "a2dp"		# Bluetooth-Profil
}

pcm.btL2 {			# Lautsprecher-pcm (für „L1“ in bluetoothctl)				
  type bluealsa			# Alsa-Plugin
  interface "hci0"		# vom Kernel eingerichtete BT-Schnittstelle
  device "12:51:02:20:0F:E8"	# MAC-Adresse des Kopfhörers (= „L1“ in bluetoothctl,
				# Kopfhörer)
  profile "a2dp"		# Bluetooth-Profil
}
kriege ich via aplay (gestartet in zwei Terminals) den Ton derselben Datei gleichzeitig auf beide BT-Lautsprecher. Synchron ist der natürlich nicht. (Bei den Namen und auch den Begriffen Lautsprecher/Kopfhörer mach ich keine Klimmzüge mehr und nummeriere die einfach durch. Die Reglerplugins lass' ich auch weg, die stören nur und es sollte reichen, wenn man dieses andauernde und umständliche Bereinigen der asound.state einmal macht, wenn man glaubt fertig zu sein.)
Die Synchronität der Ausgbe lässt sich wohl nur über deine „schleife“ erreichen.

Antworten