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 hotplugtv
quale udev chiama. Questo stesso copione può essere chiamato in molti posti però. Ad esempio, durante i test l'ho usato in lock-screen-timer
cui 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 rick
con il tuo ID utente, cioè UTF-8
ecc.
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.rules
non 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 rick
con il tuo nome utente.
- La
export
linea iniziale probabilmente non è necessaria ma l'ho inclusa solo per sicurezza.
- Se hai più schede audio o qualcosa di diverso dalle
hdmi-stereo
modifiche 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 -l
per 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 card0
per card1
e 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 card0
e in card1
base all'avvio, rivedere il programma per fare riferimento card*
per acquisire entrambi gli scenari .