สลับระหว่างลำโพงภายในและลำโพง HDMI โดยอัตโนมัติ


18

คุณรู้ได้อย่างไรว่าเมื่อคุณเสียบหูฟังเข้ากับแจ็ค aux แล็ปท็อปของคุณลำโพงภายในจะถูกปิดเสียงโดยอัตโนมัติและเสียงที่ออกมาจากหูฟังของคุณ? ฉันต้องการสิ่งนั้นสำหรับ HDMI

ฉันเชื่อมต่อจอภาพกับลำโพงในตัวกับแล็ปท็อปของฉันเพื่อดูวิดีโอบางครั้ง มันแปลกมากเมื่อวิดีโออยู่บนจอภาพ (ซึ่งอยู่ห่างจากโต๊ะของฉัน 3 เมตร) แต่เสียงออกมาจากลำโพงภายในแล็ปท็อปของฉัน (แล็ปท็อปนั่งอยู่บนโต๊ะ)

แน่นอนฉันสามารถไปที่การตั้งค่าเสียงและเปลี่ยนช่องสัญญาณออกเป็น HDMI ได้ แต่หลังจากนั้นเมื่อฉันถอดสายเคเบิล HDMI ชั่วโมงที่แล้วและอาจอยู่ในตำแหน่งที่แตกต่างกันโดยสิ้นเชิงเสียงจะไม่เล่นเพราะเซิร์ฟเวอร์เสียงยังคงพยายามเล่นผ่าน HDMI แต่ไม่มีอะไรเชื่อมต่อกับมัน .

สลับกลับไปที่ลำโพงภายในโดยอัตโนมัติเมื่อไม่มีอุปกรณ์เชื่อมต่อผ่าน HDMI สำคัญกว่า แต่เปลี่ยนเป็นเอาต์พุตเสียงผ่าน HDMI เมื่อเชื่อมต่ออุปกรณ์จะยังคงดีมาก

เห็นได้ชัดว่าทำงานได้กับ 11.10แต่ไม่ได้ทำงานกับ 16.04


การมีปุ่มลัดเพื่อสลับเสียงอาจเป็นทางออกที่ดีสำหรับคุณ คำตอบที่สองในหัวข้อนี้ไม่ว่า: askubuntu.com/questions/41858/ …
WinEunuuchs2Unix

ฉันยังคงมองหาวิธีแก้ปัญหาด้วยเช่นกัน (ใน 16.04; ไม่มีวิธีแก้ปัญหาที่แนะนำ) ปัญหาที่เกิดขึ้นนอกจากนี้ยังมีการกล่าวถึงในฟอรั่มมิ้นท์
ตัวเอกฮิโระ

@hiroprotagonist ใช่ฉันก็เช่นกัน ดูเหมือนว่าคำตอบที่นี่ใช้งานได้ในกรณีส่วนใหญ่ แต่ไม่ได้อยู่ในทั้งหมด
UTF-8

ที่จริงแล้วการสลับอัตโนมัติทำงานใน Ubuntu 14.04 เว้นแต่ว่าสิ่งนี้ถูกปิดการใช้งานโดยการอัพเดท
BurninLeo

คำตอบ:


8

พื้นหลัง

ฉันมีปัญหาที่คล้ายกันระหว่างการหยุดชั่วคราว / ดำเนินการต่อเมื่อเสียงจะเปลี่ยนจาก HDMI TV ไปเป็นลำโพงแล็ปท็อป ตามประวัติส่วนตัวของเสียงจะอยู่ในลำโพงแล็ปท็อปและฉันจะต้องมีการตั้งค่าอุปกรณ์แสดงผลด้วยตนเองเพื่อให้ทีวี->System SettingsSound

นี่เป็นหนึ่งในประสบการณ์ที่น่ารำคาญครั้งแรกของฉันกับการอัพเกรดจากUbuntu 14.04เป็น16.04และรากได้รับการอัปเกรดเป็น PulseAudio 8 ที่มาพร้อมกับ16.04 LTS

TV-soundหลังจากการค้นหามากฉันสร้างสคริปต์ที่เรียกว่า แม้ว่าฉันจะไม่ได้เสียบและถอดปลั๊กทีวีเหมือนตัวคุณเอง แต่ฉันก็ค้นหาด้วย google และสร้างรูปแบบของสคริปต์ให้ทำงานในสถานการณ์ของคุณ ฉันทดสอบแล้วและใช้งานได้

ขั้นตอนที่ 1: สร้างสคริปต์เพื่อสลับเสียงระหว่างอุปกรณ์ที่เชื่อมต่อ

เราจะสร้างสคริปต์ที่เรียกว่าhotplugtvudev โทร แม้ว่าสคริปต์เดียวกันนี้สามารถเรียกได้ในหลาย ๆ ที่ ตัวอย่างเช่นระหว่างการทดสอบฉันใช้มันใน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-stereotweaks นั้นจำเป็นต้องใช้เพื่อหาพารามิเตอร์ที่ถูกต้องก่อนที่จะเขียนสคริปต์ของคุณ

ถอดรหัสชื่ออุปกรณ์ของคุณภายใน 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*เพื่อจับภาพทั้งสองสถานการณ์ .


ฉันไม่สามารถคัดลอกได้70-persistent-net.rulesเพราะไม่มีอยู่ มีเพียงไฟล์เดียวที่เรียกว่า/etc/udev/rules.d 39-smfp_samsung.rules
UTF-8

โอ้คัดลอก 30 smfp_samsung.rules อย่างดีเราไม่ต้องการเนื้อหาไฟล์เท่านั้นเพื่อให้แน่ใจว่าเรามีสิทธิ์ที่เหมาะสมสำหรับไฟล์ใหม่ของเรา การคัดลอกไฟล์ที่มีอยู่เป็นวิธีที่ง่ายที่สุด (สำหรับฉันแล้ว)
WinEunuuchs2Unix

1
มันไม่ทำงานในระบบของฉัน @ คนที่ตอบโต้คำตอบนี้แล้ว: มันใช้ได้กับคุณหรือไม่ | ฉันลองครั้งแรกโดยไม่ต้องรีบูตเครื่อง แต่มันไม่ทำงาน มันไม่ทำงานหลังจากรีบูตเครื่องเช่นกัน ฉันตัดการเชื่อมต่อ HDMI และตั้งค่าเสียงเป็นลำโพงภายในก่อนทำการรีบูต หลังจากรีบูตเครื่องฉันเล่นเพลงและเชื่อมต่อสาย HDMI เพลงยังคง (เท่านั้น) ออกมาจากลำโพงในตัว คุณต้องเปลี่ยนสิ่งอื่นนอกจากชื่อผู้ใช้ 2 ครั้งหรือไม่ cat /sys/class/drm/card0-HDMI-A-1/statusแสดงสถานะที่ถูกต้อง (ฉันลองหลายครั้ง)
UTF-8

@ UTF-8 ฉันได้เพิ่มส่วนใหม่ที่คุณสามารถทดสอบการสลับที่บรรทัดคำสั่ง คุณสามารถเรียกใช้สิ่งนี้และดูว่ามีข้อผิดพลาดเกิดขึ้นได้ไหม?
WinEunuuchs2Unix

ดูเหมือนจะไม่มีoutput:analog-stereo: pastebin.com/n5bHyhCmสิ่งนี้ทำให้มันยิ่งแปลกเพราะฉันคาดหวังว่าเสียงจะเล่นผ่าน HDMI เสมอ ภาพหน้าจอของการตั้งค่าเสียงของฉันเมื่อมีการเชื่อมต่อ HDMIและเมื่อ HDMI ไม่ได้เชื่อมต่อ แก้ไข: ฉันได้ลองแล้ว แต่ฉันใช้เวลาไม่กี่นาทีในการโพสต์ความคิดเห็นนี้เพราะฉันต้องอัปโหลดภาพหน้าจอ
UTF-8
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.