Beralih antara speaker internal dan HDMI secara otomatis

18

Anda tahu bagaimana ketika Anda mencolokkan headphone ke jack aux laptop Anda, speaker internal secara otomatis dimatikan dan suara keluar dari headphone Anda? Saya ingin itu untuk HDMI.

Terkadang saya menghubungkan monitor dengan speaker internal ke laptop saya untuk menonton video. Sangat aneh ketika video ada di monitor (yang ditempatkan 3 m dari meja saya) tetapi suara keluar dari speaker internal laptop saya (laptop duduk di meja).

Tentu saja, saya bisa pergi ke pengaturan suara dan mengganti saluran output ke HDMI. Tetapi kemudian, ketika saya melepas kabel HDMI beberapa jam yang lalu dan bahkan mungkin berada di lokasi yang sama sekali berbeda, suara tidak akan diputar karena server suara masih mencoba memutarnya melalui HDMI tetapi tidak ada yang terhubung dengannya. .

Secara otomatis beralih kembali ke speaker internal ketika tidak ada perangkat yang terhubung melalui HDMI lebih penting tetapi beralih ke output suara melalui HDMI ketika perangkat terhubung masih akan sangat bagus.

Ini tampaknya bekerja dengan 11,10 tetapi tidak bekerja dengan 16,04.

UTF-8
sumber
Memiliki tombol pintas untuk beralih suara mungkin merupakan solusi yang baik untuk Anda. Jawaban kedua di utas ini adalah: askubuntu.com/questions/41858/…
WinEunuuchs2Unix
Saya masih mencari solusi untuk itu juga (pada 16,04; tidak ada solusi yang disarankan bekerja). masalahnya juga dibahas di forum mint .
hiro protagonis
@hiroprotagonist Ya, saya juga. Tampaknya jawabannya di sini berfungsi dalam banyak kasus tetapi tidak dalam semua.
UTF-8
Sebenarnya perpindahan secara otomatis berfungsi di Ubuntu 14.04, kecuali jika ini dinonaktifkan oleh pembaruan.
BurninLeo

Jawaban:

8

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 hotplugtvudev panggilan. Skrip yang sama ini dapat dipanggil di banyak tempat. Sebagai contoh, selama pengujian saya menggunakannya di lock-screen-timertempat 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 rickdengan 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.rulestidak 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 rickdengan nama pengguna Anda.

  • Baris awal exportmungkin tidak perlu tetapi saya sudah memasukkannya hanya untuk aman.
  • Jika Anda memiliki beberapa kartu suara, atau sesuatu selain hdmi-stereotweak 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 -luntuk 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 card0ke card1dan 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 card0dan card1tergantung pada boot, revisi program untuk referensi card*untuk menangkap kedua skenario .

WinEunuuchs2Unix
sumber
Saya tidak dapat menyalin 70-persistent-net.ruleskarena tidak ada. /etc/udev/rules.dhanya berisi satu file yang disebut 39-smfp_samsung.rules.
UTF-8
Oh juga salin 30-smfp_samsung.rules, kita tidak perlu isi file hanya untuk memastikan kita memiliki izin yang tepat untuk file baru kita. Menyalin file yang ada adalah cara termudah (bagi saya bagaimanapun).
WinEunuuchs2Unix
1
Itu tidak berfungsi pada sistem saya. @ Orang yang sudah memutakhirkan jawaban ini: Apakah ini berhasil pada Anda? | Saya pertama kali mencobanya tanpa me-reboot tetapi tidak berhasil. Juga tidak berfungsi setelah reboot. HDMI saya terputus dan mengatur suara ke speaker internal sebelum reboot. Setelah reboot, saya memutar musik dan menghubungkan kabel HDMI saya. Musik masih (hanya) keluar dari speaker internal. Apakah Anda harus mengubah apa pun selain 2 kemunculan nama pengguna? cat /sys/class/drm/card0-HDMI-A-1/statusmenunjukkan status yang benar (saya mencoba beberapa kali).
UTF-8
@ UTF-8 Saya telah menambahkan bagian baru di mana Anda dapat menguji beralih di baris perintah. Bisakah Anda menjalankan ini dan melihat apakah ada kesalahan?
WinEunuuchs2Unix
Tampaknya tidak ada output:analog-stereo: pastebin.com/n5bHyhCm Ini membuatnya lebih aneh karena saya berharap suara akan selalu diputar melalui HDMI. Tangkapan layar pengaturan suara saya ketika HDMI terhubung dan ketika HDMI tidak terhubung . Sunting: Saya sudah mencoba ini tetapi butuh beberapa menit lagi untuk mengirim komentar ini karena saya harus mengunggah tangkapan layar.
UTF-8