Passa automaticamente dagli altoparlanti interni a quelli HDMI


18

Sai come quando colleghi le cuffie alla presa aux del tuo laptop, gli altoparlanti interni vengono automaticamente silenziati e il suono esce dalle tue cuffie? Voglio esattamente questo per HDMI.

Collego un monitor con altoparlanti integrati al mio laptop per guardare video, a volte. È molto strano quando il video è sul monitor (che si trova a 3 m dalla mia scrivania) ma il suono viene emesso dagli altoparlanti interni del mio laptop (il laptop si trova sulla scrivania).

Certo, posso solo andare alle impostazioni audio e cambiare il canale di uscita su HDMI. Ma poi, quando ho rimosso il cavo HDMI ore fa e potrei anche trovarmi in una posizione completamente diversa, l'audio non verrà riprodotto perché il server audio tenta ancora di riprodurlo tramite HDMI ma non c'è nulla collegato ad esso .

Tornare automaticamente agli altoparlanti interni quando nessun dispositivo è collegato tramite HDMI è più importante, ma passare all'uscita audio tramite HDMI quando un dispositivo è collegato sarebbe comunque molto bello.

Apparentemente funzionava con 11.10 ma non funziona con 16.04.


Avere un tasto di scelta rapida per attivare o disattivare il suono potrebbe essere una buona soluzione per te. La seconda risposta su questo thread è la seguente: askubuntu.com/questions/41858/…
WinEunuuchs2Unix

sto ancora cercando una soluzione anche a quella (il 16.04; nessuna delle soluzioni suggerite funziona). il problema è anche discusso nel forum di zecca .
protagonista hiro

@hiroprotagonist Sì, anch'io. Sembra che la risposta qui funzioni nella maggior parte dei casi, ma non in tutti.
UTF-8

In realtà il passaggio automatico ha funzionato in Ubuntu 14.04, a meno che questo non fosse stato disabilitato da un aggiornamento.
BurninLeo

Risposte:


8

sfondo

Ho avuto un problema simile durante la sospensione / ripresa quando l'audio passava dalla TV HDMI agli altoparlanti del laptop. Al ripristino del suono rimarrà sugli altoparlanti del laptop e dovrei ripristinare manualmente il dispositivo di uscita su TV in System Settings-> Sound.

Questa è stata una delle mie prime fastidiose esperienze con l'aggiornamento da Ubuntu 14.04 a 16.04 e il root è stato l'aggiornamento a PulseAudio 8 fornito con 16.04 LTS

Dopo molte ricerche ho creato uno script chiamato TV-sound. Anche se non collego e scollego la TV come te, ho fatto alcune ricerche su Google e creato una variante dello script per funzionare nella tua situazione. L'ho provato e funziona.

Passaggio 1: creare uno script per cambiare l'audio tra i dispositivi collegati

Creeremo uno script chiamato hotplugtvquale udev chiama. Questo stesso copione può essere chiamato in molti posti però. Ad esempio, durante i test l'ho usato in lock-screen-timercui il suono è tornato al laptop durante il blocco dello schermo.

cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv

Quando l'editor si apre con una schermata vuota, copia e incolla in essa quanto segue:

#! /bin/bash

# NAME: hotplugtv
# PATH: /usr/local/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-monitor-hotplug.rules
# DATE: Created Nov 26, 2016.
# NOTE: logs output using log-file
# UPDT: Dec 14, 2016 - Sometimes /sys/class/drm/card0 & sometimes /sys/class/drm/card1
#       so use /sys/class/dmcard* instead.

if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
#        log-file "HDMI TV connected" ~/bin/log-hotplugtv;
        /bin/sleep 2;
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
#        log-file "HDMI TV disconnected" ~/bin/log-hotplugtv;
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi

exit 0

Dovrai sostituire le due occorrenze di rickcon il tuo ID utente, cioè UTF-8ecc.

So che questo può essere più professionale con il nome utente impostato automaticamente su una variabile bash ma non sono ancora così esperto :( Ad ogni modo, salva il file ed esci gedit.

Passaggio 2: creare le regole udev

udev monitora gli eventi hotplug quando si collega e si scollega il monitor HDMI. Digitare quanto segue per creare una nuova regola.

cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules

NOTA: se il file 70-persistent-net.rulesnon esiste nella directory, copiare qualsiasi altro file lì. Non abbiamo bisogno del contenuto del file, ma solo delle autorizzazioni per garantire che i nostri siano gli stessi.

L'editor mostrerà un mucchio di testo irrilevante, lo evidenzierà e lo eliminerà. Quindi evidenzia il codice qui sotto e incollalo nell'editor:

# NAME: 99-hotplugtv.rules
# PATH: /etc/udev/rules.d
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: automatically called on system events
# DATE: Created Nov 26, 2016.
# NOTE: in future may requre systemd service hooks

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/local/bin/hotplugtv"

Salva il file ed esci.

Per abilitare la regola (senza riavviare) è necessario ricaricare udev:

sudo udevadm control --reload-rules

Ora puoi collegare e scollegare il tuo monitor HDMI / TV e il suono cambia in modo appropriato.

Avvertimento

Sul mio sistema il suono ritorna automaticamente agli altoparlanti del laptop quando HDMI è scollegato. Sul tuo sistema no. Potrebbero essere necessari ulteriori miglioramenti al codice se il suono non arriva agli altoparlanti del laptop quando HDMI è scollegato. Si prega di rispondere tramite commento qui sotto come le cose funzionano / non funzionano.

Test rapidi nella CLI

Puoi testare rapidamente il codice sul terminale usando:

    export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
  • Passa a HDMI / TV:

        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
  • Torna agli altoparlanti integrati:

        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
  • Ricorda di sostituire rickcon il tuo nome utente.

  • La exportlinea iniziale probabilmente non è necessaria ma l'ho inclusa solo per sicurezza.
  • Se hai più schede audio o qualcosa di diverso dalle hdmi-stereomodifiche sono ovviamente necessari per scoprire i parametri corretti prima di scrivere la tua sceneggiatura.

Decifrare il nome del dispositivo in PulseAudio

Il codice seguente utilizza lo stesso comando due volte. Una volta quando l'audio è impostato su una TV HDMI esterna. Una seconda volta quando l'audio è impostato sugli altoparlanti integrati del laptop. Ogni volta che vedi il nome PulseAudio usa:

$ pacmd list-sinks | grep -e 'name:' -e 'index'
  * index: 28
    name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>
───────────────────────────────────────────────────────────────────────────────
$ pacmd list-sinks | grep -e 'name:' -e 'index'
  * index: 30
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

Quando hai più schede audio

Usa il comando aplay -lper vedere se hai carte più grandi del numero 0. In tal caso dovrai usare il numero di carta appropriato nei tuoi script. Per esempio:

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

Nell'esempio sopra tutti i numeri delle carte sono 0 con diverse fonti di output. Se si dispone di altoparlanti USB, possono avere un numero di carta diverso da 0.

Modifica 2 dicembre 2016

Per qualche ragione sconosciuta la sceneggiatura è stata interrotta oggi. Sopra il codice usato per leggere: "$ (cat / sys / class / drm / card0-HDMI-A-1 / stato", ma ho dovuto cambiare card0per card1e il codice di cui sopra è stato rivisto in quanto tale, non riesco a spiegare che cosa è cambiato. sul mio sistema diverso dai regolari aggiornamenti di Ubuntu dal 26 novembre 2016.

Modifica 14 dicembre 2016

Il codice precedente doveva essere riportato di nuovo a: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status". Invece di rivedere il codice tra card0e in card1base all'avvio, rivedere il programma per fare riferimento card*per acquisire entrambi gli scenari .


Non riesco a copiare 70-persistent-net.rulesperché non esiste. /etc/udev/rules.dcontiene solo un singolo file chiamato 39-smfp_samsung.rules.
UTF-8

Oh bene, copia 30-smfp_samsung.rules, non abbiamo bisogno del contenuto del file solo per assicurarci di avere le giuste autorizzazioni per il nostro nuovo file. La copia di un file esistente è il modo più semplice (per me comunque).
WinEunuuchs2Unix,

1
Non funziona sul mio sistema. @ Persona che ha già votato a favore di questa risposta: funziona sul tuo? | L'ho provato prima senza riavviare ma non ha funzionato. Non funziona neanche dopo il riavvio. Avevo scollegato HDMI e impostato l'audio sugli altoparlanti interni prima di riavviare. Dopo il riavvio, ho riprodotto un po 'di musica e ho collegato il mio cavo HDMI. La musica esce (solo) dagli altoparlanti integrati. Devi cambiare qualcosa di diverso dalle 2 occorrenze del nome utente? cat /sys/class/drm/card0-HDMI-A-1/statusmostra lo stato corretto (ho provato più volte).
UTF-8

@ UTF-8 Ho aggiunto una nuova sezione in cui è possibile testare il passaggio dalla riga di comando. Puoi eseguirlo e vedere se vengono fuori errori per favore?
WinEunuuchs2Unix,

Sembra che non ci sia output:analog-stereo: pastebin.com/n5bHyhCm Questo lo rende ancora più strano perché poi mi aspetto che l'audio venga sempre riprodotto tramite HDMI. Schermate delle mie impostazioni audio quando HDMI è collegato e quando HDMI non è collegato . Modifica: ho già provato questo, ma mi ci sono voluti ancora alcuni minuti per pubblicare questo commento perché ho dovuto caricare gli screenshot.
UTF-8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.