Latar Belakang
Saya memiliki masalah yang sama selama penangguhan / melanjutkan ketika suara akan beralih dari TV HDMI ke speaker laptop. Setelah melanjutkan suara akan tetap pada speaker Laptop dan saya harus secara manual mengatur ulang perangkat output ke TV di System Settings
-> Sound
.
Ini adalah salah satu pengalaman menjengkelkan pertama saya dengan upgrade dari Ubuntu 14.04 ke 16.04 dan root di-upgrade ke PulseAudio 8 yang hadir dengan 16,04 LTS
Setelah banyak pencarian saya membuat skrip bernama TV-sound
. Meskipun saya tidak mencolokkan dan mencabut TV seperti Anda, saya melakukan beberapa pencarian google dan membuat variasi skrip untuk bekerja dalam situasi Anda. Saya sudah mengujinya dan berhasil.
Langkah 1: Buat skrip untuk beralih audio antara perangkat yang terhubung
Kami akan membuat skrip yang disebut hotplugtv
udev panggilan. Skrip yang sama ini dapat dipanggil di banyak tempat. Sebagai contoh, selama pengujian saya menggunakannya di lock-screen-timer
tempat suara dikembalikan ke Laptop selama kunci layar.
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
Ketika editor membuka dengan layar kosong, salin dan tempel yang berikut ke dalamnya:
#! /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
Anda harus mengganti dua kemunculan rick
dengan id pengguna Anda sendiri, yaitu UTF-8
, dll.
Saya tahu ini bisa lebih profesional dengan nama pengguna secara otomatis diatur ke variabel bash tapi saya belum mahir :( Lagi pula, simpan file dan keluar gedit
.
Langkah 2: Buat aturan udev
udev memonitor kejadian hotplug saat Anda mencolokkan dan mencabut monitor HDMI Anda. Ketik yang berikut untuk membuat aturan baru.
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
CATATAN: Jika file 70-persistent-net.rules
tidak ada di direktori Anda salin file lain di sana. Kami tidak membutuhkan konten file, hanya izin file untuk memastikan konten kami sama.
Editor akan menampilkan banyak teks yang tidak relevan, sorot dan hapus. Kemudian sorot kode di bawah ini dan rekatkan ke 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"
Simpan file dan keluar.
Untuk mengaktifkan aturan (tanpa me-reboot) kita perlu memuat ulang udev:
sudo udevadm control --reload-rules
Sekarang Anda dapat mencolokkan dan mencabut monitor HDMI / TV Anda dan suaranya beralih dengan tepat.
Peringatan
Pada sistem saya, suara secara otomatis kembali ke speaker Laptop ketika HDMI dicabut. Pada sistem Anda tidak. Peningkatan lebih lanjut pada kode mungkin diperlukan jika suara tidak masuk ke speaker Laptop Anda ketika HDMI dicabut. Silakan balas melalui komentar di bawah ini bagaimana hal-hal bekerja / tidak berhasil.
Pengujian cepat di CLI
Anda dapat dengan cepat menguji kode di terminal dengan menggunakan:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
Beralih ke HDMI / TV:
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
Beralih kembali ke speaker bawaan:
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
Ingatlah untuk mengganti rick
dengan nama pengguna Anda.
- Baris awal
export
mungkin tidak perlu tetapi saya sudah memasukkannya hanya untuk aman.
- Jika Anda memiliki beberapa kartu suara, atau sesuatu selain
hdmi-stereo
tweak jelas diperlukan untuk mengetahui parameter yang benar sebelum menulis skrip Anda.
Menguraikan nama perangkat Anda dalam PulseAudio
Kode di bawah ini menggunakan perintah yang sama dua kali. Suatu ketika ketika suara diatur ke TV HDMI eksternal. Kedua kalinya ketika suara diatur ke speaker bawaan Laptop. Setiap kali Anda melihat nama PulseAudio menggunakan:
$ 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>
Ketika Anda memiliki beberapa kartu suara
Gunakan perintah aplay -l
untuk melihat apakah Anda memiliki kartu lebih besar dari angka 0. Jika demikian, Anda perlu menggunakan nomor kartu yang sesuai dalam skrip Anda. Sebagai contoh:
$ 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
Dalam contoh di atas semua nomor kartu adalah 0 dengan sumber output yang berbeda. Jika Anda memiliki speaker USB, mereka dapat memiliki nomor kartu yang berbeda dari 0.
Edit 2 Desember 2016
Untuk beberapa alasan yang tidak diketahui naskahnya rusak hari ini. Di atas kode yang digunakan untuk membaca: "$ (cat / sys / class / drm / card0-HDMI-A-1 / Status" tapi saya harus mengubah card0
ke card1
dan kode di atas telah direvisi seperti saya tidak bisa menjelaskan apa yang berubah. di sistem saya selain dari pembaruan Ubuntu biasa sejak 26 November 2016.
Edit 14 Desember 2016
Kode di atas perlu diganti lagi ke: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status". Alih-alih merevisi kode antara card0
dan card1
tergantung pada boot, revisi program untuk referensi card*
untuk menangkap kedua skenario .