พื้นหลัง
ฉันมีปัญหาที่คล้ายกันระหว่างการหยุดชั่วคราว / ดำเนินการต่อเมื่อเสียงจะเปลี่ยนจาก HDMI TV ไปเป็นลำโพงแล็ปท็อป ตามประวัติส่วนตัวของเสียงจะอยู่ในลำโพงแล็ปท็อปและฉันจะต้องมีการตั้งค่าอุปกรณ์แสดงผลด้วยตนเองเพื่อให้ทีวี->System Settings
Sound
นี่เป็นหนึ่งในประสบการณ์ที่น่ารำคาญครั้งแรกของฉันกับการอัพเกรดจากUbuntu 14.04เป็น16.04และรากได้รับการอัปเกรดเป็น PulseAudio 8 ที่มาพร้อมกับ16.04 LTS
TV-sound
หลังจากการค้นหามากฉันสร้างสคริปต์ที่เรียกว่า แม้ว่าฉันจะไม่ได้เสียบและถอดปลั๊กทีวีเหมือนตัวคุณเอง แต่ฉันก็ค้นหาด้วย google และสร้างรูปแบบของสคริปต์ให้ทำงานในสถานการณ์ของคุณ ฉันทดสอบแล้วและใช้งานได้
ขั้นตอนที่ 1: สร้างสคริปต์เพื่อสลับเสียงระหว่างอุปกรณ์ที่เชื่อมต่อ
เราจะสร้างสคริปต์ที่เรียกว่าhotplugtv
udev โทร แม้ว่าสคริปต์เดียวกันนี้สามารถเรียกได้ในหลาย ๆ ที่ ตัวอย่างเช่นระหว่างการทดสอบฉันใช้มันในlock-screen-timer
ที่ที่เสียงเปลี่ยนกลับเป็นแล็ปท็อประหว่างการล็อกหน้าจอ
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
เมื่อตัวแก้ไขเปิดขึ้นด้วยหน้าจอว่างให้คัดลอกและวางสิ่งต่อไปนี้ลงใน:
#! /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
คุณจะต้องแทนที่สองเหตุการณ์ที่เกิดขึ้นrick
ด้วยรหัสผู้ใช้ของคุณเองเช่นUTF-8
ฯลฯ
ฉันรู้ว่านี้สามารถเป็นมืออาชีพมากขึ้นด้วยชื่อผู้ใช้ตั้งค่าโดยอัตโนมัติให้กับตัวแปรทุบตี แต่ฉันไม่ว่ามีฝีมือเลย :( gedit
อย่างไรก็ตามบันทึกไฟล์และทางออก
ขั้นตอนที่ 2: สร้างกฎ udev
udev ตรวจสอบกิจกรรม hotplug เมื่อคุณเสียบและถอดปลั๊กจอภาพ HDMI พิมพ์ต่อไปนี้เพื่อสร้างกฎใหม่
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
หมายเหตุ:หากไฟล์70-persistent-net.rules
ไม่มีอยู่ในไดเรกทอรีของคุณให้คัดลอกไฟล์อื่นที่นั่น เราไม่ต้องการเนื้อหาไฟล์เพียงแค่การอนุญาตไฟล์เพื่อให้แน่ใจว่าไฟล์ของเราเหมือนกัน
ตัวแก้ไขจะแสดงข้อความที่ไม่เกี่ยวข้องจำนวนมากเน้นที่มันแล้วลบทิ้ง จากนั้นไฮไลต์รหัสด้านล่างและวางลงในเครื่องมือแก้ไข:
# 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"
บันทึกไฟล์และออก
ในการเปิดใช้งานกฎ (โดยไม่ต้องรีบูตเครื่อง) เราจำเป็นต้องโหลด udev ใหม่:
sudo udevadm control --reload-rules
ตอนนี้คุณสามารถเสียบและถอดปลั๊กจอภาพ HDMI / ทีวีและสวิตช์เสียงได้อย่างเหมาะสม
ข้อแม้
ในระบบของฉันเสียงจะถูกแปลงกลับเป็นลำโพงแล็ปท็อปโดยอัตโนมัติเมื่อไม่ได้เสียบ HDMI ในระบบของคุณมันไม่ได้ อาจจำเป็นต้องมีการปรับปรุงเพิ่มเติมสำหรับรหัสหากเสียงไม่ไปที่ลำโพงแล็ปท็อปของคุณเมื่อถอดปลั๊ก HDMI โปรดตอบกลับผ่านความคิดเห็นด้านล่างว่าสิ่งต่าง ๆ ทำงานอย่างไร
การทดสอบอย่างรวดเร็วใน CLI
คุณสามารถทดสอบรหัสได้อย่างรวดเร็วโดยใช้:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
เปลี่ยนเป็น HDMI / TV:
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
เปลี่ยนกลับเป็นลำโพงในตัว:
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
อย่าลืมแทนที่rick
ด้วยชื่อผู้ใช้ของคุณ
export
บรรทัดแรกอาจไม่จำเป็น แต่ฉันได้รวมไว้เพื่อความปลอดภัย
- หากคุณมีการ์ดเสียงหลายตัวหรืออย่างอื่นที่ไม่ใช่
hdmi-stereo
tweaks นั้นจำเป็นต้องใช้เพื่อหาพารามิเตอร์ที่ถูกต้องก่อนที่จะเขียนสคริปต์ของคุณ
ถอดรหัสชื่ออุปกรณ์ของคุณภายใน PulseAudio
รหัสด้านล่างใช้คำสั่งเดียวกันสองครั้ง หนึ่งครั้งเมื่อตั้งค่าเสียงเป็นทีวี HDMI ภายนอก ครั้งที่สองเมื่อเสียงถูกตั้งไว้ที่ลำโพงของแล็ปท็อป ทุกครั้งที่คุณเห็นชื่อ PulseAudio ใช้:
$ 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>
เมื่อคุณมีการ์ดเสียงหลายตัว
ใช้คำสั่งaplay -l
เพื่อดูว่าคุณมีการ์ดมากกว่าหมายเลข 0 หรือไม่ถ้าใช่คุณจะต้องใช้หมายเลขบัตรที่เหมาะสมในสคริปต์ของคุณ ตัวอย่างเช่น:
$ 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
ในตัวอย่างข้างต้นหมายเลขบัตรทั้งหมดเป็น 0 พร้อมแหล่งสัญญาณที่แตกต่างกัน หากคุณมีลำโพง USB พวกเขาสามารถมีหมายเลขบัตรอื่นที่ไม่ใช่ 0
แก้ไข 2 ธันวาคม 2559
ด้วยเหตุผลที่ไม่ทราบสาเหตุสคริปต์ได้รับความเสียหายในวันนี้ รหัสข้างต้นใช้ในการอ่าน: "$ (แมว sys / / ระดับ / DRM / card0-HDMI-A-1 / สถานะ" แต่ผมต้องเปลี่ยนcard0
ไปcard1
และโค้ดข้างต้นได้รับการแก้ไขเช่นนี้ฉันไม่สามารถอธิบายสิ่งที่เปลี่ยนแปลง. บนระบบของฉันนอกเหนือจากการอัปเดต Ubuntu ทั่วไปตั้งแต่วันที่ 26 พฤศจิกายน 2559
แก้ไข 14 ธันวาคม 2559
รหัสข้างต้นจำเป็นต้องสลับกลับไปที่: "$ (cat / sys / class / drm / card0-HDMI-A-1 / สถานะ" แทนการแก้ไขรหัสระหว่างcard0
และcard1
ขึ้นอยู่กับการบูทให้แก้ไขโปรแกรมเพื่ออ้างอิงcard*
เพื่อจับภาพทั้งสองสถานการณ์ .