Jak na automatické přepínání zvuku?

Bobs

Jak na automatické přepínání zvuku?
« kdy: 24. 08. 2013, 00:18:01 »
Hardware: Intel Haswell, chipset Q87, přes HDMI připojeno k monitoru s integrovanýma reproduktorkama, zadní panel zvuku nezapojen, v předním občas píchnutý sluchátka.
Software: Fedora 19 64bit, KDE 4.10.5, kernel 3.10.9 standardní, driver Mesa 9.2.0RC, nainstalováno alsa + pulseaudio + pavucontrol

O co mě jde: Chci dosáhnout toho aby defaultně šel zvuk přes HDMI do reproduktorků integrovaných v monitoru. Avšak jakmile do předního panelu píchnu sluchátka, tak aby se zvuk přepnul do nich a HDMI provedl auto-mute. Jakmile sluchátka z jacku vyndám, chci aby se zvuk automaticky zase přepnul zpět na HDMI.

Dosavadní výsledek: Aktuálně používané zvukové zařízení mohu přepínat ručně pomocí KDE Mixu, nebo pavukontrolu. Já ale chci aby se to provádělo samo automaticky. Prolezl jsem snad milion různých inetových diskuzí, zkusil jsem kde co a nic.... Bez problému se automaticky přepíná mezi zadním panelem (repráčky) a předním panelem (sluchátka). Já ale potřebuji přepínání mezi HDMI a sluchátkama píchnutýma do předního panelu. To prostě nejede. Jak nastavit alsa, pulseaudio, nebo snd_hda_intel abych kýžené funkcionality dosáhnul? Neřešil jste to náhodou někdo? Předem děkuji všem.
« Poslední změna: 25. 08. 2013, 19:51:38 od Petr Krčmář »


Bobs

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #1 kdy: 24. 08. 2013, 00:23:15 »
Ještě doplnění: mainboard je Intel DQ87PG

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: MID [HDA Intel MID], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 1: ALC662 rev3 Digital [ALC662 rev3 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

cat /proc/asound/pcm
00-03: HDMI 0 : HDMI 0 : playback 1
01-00: ALC662 rev3 Analog : ALC662 rev3 Analog : playback 1 : capture 1
01-01: ALC662 rev3 Digital : ALC662 rev3 Digital : playback 1
01-02: ALC662 rev3 Alt Analog : ALC662 rev3 Alt Analog : capture 1

dustin

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #2 kdy: 24. 08. 2013, 07:35:18 »
To, co chceš, není úplně jednoduché. Potřebuješ během přehrávání přepínat zvukovky, tedy pulseaudio, samotná alsa tohle neumí. Přepnutí lze zařídit příkazem zvenku, to je OK. Ale detekce zasunutí sluchátek je větší špek. V alse existuje infrastruktura pro jack sensing, několikrát se to měnilo, snad byla i implementace do udevu, což by ti hodně pomohlo. Tohle googli, informace jsou asi jenom v mailinglistech. Bude to chtít rozumně nové jádro.

Možná nejjednodušší by bylo si najít v /proc/asound/.... nějaký ten codec dump, který by informaci o aktuálně použitých konektorech mít měl. Na ten se můžeš třeba navěsit inotify démonem a při změně obsahu (tj. nějakému přepnutí) zjistit změnu a poslat příkaz PA. Určitě to ale není práce na kliknutí, ani na chvilku.

Bobs

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #3 kdy: 24. 08. 2013, 08:34:38 »
to dustin : Díky za odpověď, ale ta funkcionalita rozpoznání zasunutí sluchátek tam evidentně je už teď, protože pavukontrol mě u předního panelu hlásí headphones plugged/unplugged a u zadního panelu speakers plugged/unlugged podle toho co kam zrovna "píchnu" a podle toho se dokáže automaticky přepínat. Dokonce umím i stanovit priority v případě, že je aktivní zadní i přední panel (jsou zapojená jak sluchátka vepředu, tak i repráčky vzadu). Tohle všechno funguje bez problému a spolehlivě, ale HDMI je prostě nějak mimo tuhle množinu. To dokážu přepínat pouze ručně.

dustin

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #4 kdy: 24. 08. 2013, 09:47:36 »
To automatické přepínání, které nyní máš, přepíná ale jen změnou konfigurace výstupního kodeku ALC662 té druhé zvukovky PCH. To je celkem standardní funkce nabízená driverem intel hda. Ty potřebuješ při  změně konektoru přehodit zvukovku na první (MID) , což asi pulseaudio ještě nenabízí v klikátkách (ani se nedivím). Podívej se do /proc/asound/PCH, který soubor a jak se změní při zasunutí/vysunutí sluchátek. Při této změně potřebuješ přenastavit výstupní zvukovku v PA. IMO nejsnazší by byl skript napojený na inotify nad tím souborem, nebo jej klasicky pollovat (číst jednou za pár sekund).


Bobs

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #5 kdy: 24. 08. 2013, 11:57:25 »
Znova díky za reakci.Už asi začínám trochu chápat o co jde.
Asi nejlepší by bylo to "přepínání" navěsit na událost headphones plugged/unplugged, což driver intel_hda v pohodě rozeznává. Tahle událost by spustila následné otestování toho co je připojeno/odpojeno - HDMI? zadní repráčky?... a podle předem nastavených pravidel by do dotačného (dotyčných) zařízení nějaký ten mixer pustil/vypnul zvuk..... V mém případě je ale naprostá utopie, že bych něco takového dokázal vyvinout. Na to prostě nemám.
Já mám (doufám, že jen zatím) pouze schopnost změnit parametry nějakého toho conf souboru, ale to je asi tak všechno. :)
Jinak, údajně by to mělo být možné obejít pomocí jack-retasku. Ve Fedoře je to součástí balíku alsa-tools, viz. hdajackretask.
Idea, pokud jsem to pochopil správně, by měla být přibližně takováto. Pomocí retasku natvrdo přesměrovat zadní panel do HDMI a pak už přední/zadní panel se přepíná v pohodě. U mě ale i v tom retaskeru se HDMI a ALC662 ukazují zcela odděleně a nedají se jejich zvukové cesty nijak kombinovat. V rámci ALC662 mohu nakombinovat prakticky cokoliv s čímkoliv - např. na přední mikrofon přesměrovat zadní repráky, ale už nikoliv HDMI. Takže tudy taky cesta asi taky nevede.

dustin

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #6 kdy: 24. 08. 2013, 12:08:59 »
Vždyť ti celou dobu říkám, že ten HDMI výstup máš na jiné zvukovce, než analogové konektory zepředu i zezadu. Jejich přepínání zajišťuje přímo kodek, což je obvod obsahující AD/DA převodníky, většinou i SPDIF výstup a obvody právě pro přepínání/rekonfiguraci výstupů. Před kodekem je řadič Intel HDA (integrovaný v čipsetu), který se hlásí jako zvukovka. A v grafické kartě máš ještě jeden řadič Intel HDA (ten MID), za kterým je napojený HDMI výstup propojený s grafikou.

Proto nemůžeš nástrojem jack-retask přehodit jack do hdmi, protože jsou to výstupy různých zvukovek, zatímco jack-retask jenom přepíná výstupy jednoho Intel-HDA kodeku.

Bobs

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #7 kdy: 24. 08. 2013, 13:05:18 »
Jasně, tohle už chápu. Holt dlouhý vedení.... :)
Je jasné, že tohle přepínání mezi různýma zvukovkama musí dělat pulseaudio, které tohle všechno zastřešuje a je právě od toho aby zapínalo/vypínalo/mixovalo různé zdroje pocházející prakticky od čehokoliv Alsa/OSS/net/cokolivjinýho....
Jenže pulseaudio je tak trochu složitá a netransparentní záležitost (přinejmenším pro mě), ale teď se do toho snažím proniknout. Pokud nebude třeba nic programovat, ale bude stačit jen měnit configy, tak si dávám šanci přece jen o něco větší než nula, takže to nemusí být ztrátou času. :)
Co mě udivilo je, že jsem nikde nenašel nějaký pěkně popsaný howto. Přitom bych vsadil boty na to, že tahle funkcionalita bude docela žádanou věcí.

Lol Phirae

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #8 kdy: 24. 08. 2013, 13:25:08 »
Co mě udivilo je, že jsem nikde nenašel nějaký pěkně popsaný howto. Přitom bych vsadil boty na to, že tahle funkcionalita bude docela žádanou věcí.

Napiš Lennartovi  ;D ;D ;D

dustin

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #9 kdy: 24. 08. 2013, 14:50:12 »
Tady máš nějaký hotový skript http://askubuntu.com/questions/71863/how-to-change-pulseaudio-sink-with-pacmd-set-default-sink-during-playback/72076#72076 , nebo aspoň základ. Jenom musíš zajistit jeho volání. Zkusil bych to inotify.

Takových nápadů na funkčnost se dá vymyslet spoustu, chápu, že zrovna tohle v PA není zabudované (možná zatím). Na druhou stranu máš vše potřebné k jeho realizaci, stačí trochu skriptování.

Bobs

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #10 kdy: 24. 08. 2013, 18:04:50 »
Jo, tohle je evidentně cesta, která vede k cíli. Dík za nasměrování. Jinak, pokud jsem něco nepřehlédnul, tak PA nejspíš nemá nativní podporu přepínání mezi zvukovkama na základě události připojení/odpojení zvukového zařízení, takže se to musí řešit jak jsi naznačil.

dustin

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #11 kdy: 24. 08. 2013, 19:31:17 »
Držím palce a pak o tom můžeš třeba někam napsat na blog nebo tak :) Díky.

Bobs

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #12 kdy: 24. 08. 2013, 19:53:14 »
OK. Pokud uspěju, tak to rozhodně udělám. :)

Bobs

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #13 kdy: 25. 08. 2013, 11:21:46 »
Pár poznámek k tématu.
Během laborování, které díky mojí (doufám časově limitované) neznalosti dotčené tématiky není zrovna nejrychlejší, jsem našel dva zajímavé linky.
Zde je docela podrobně popisován problém + řešení přesně pomocí přístupu navrženého od "dustin":
http://askubuntu.com/questions/23508/how-to-automatically-change-volume-level-when-un-plugging-headphones

A zde je link na projekt démona mplugd, který má systémově řešit přesně požadovanou funkcionalitu. Na tohle se rozhodně mrknu.
https://github.com/anyc/mplugd


dustin

Re:Automatické přepínání zvuku. Jak na to?
« Odpověď #14 kdy: 25. 08. 2013, 15:37:36 »
Ten mplugd vypadá velice zajímavě.