Tự động chuyển đổi giữa loa trong và loa HDMI


18

Bạn biết làm thế nào khi bạn cắm tai nghe vào giắc cắm máy tính xách tay của bạn, loa bên trong sẽ tự động tắt và âm thanh phát ra từ tai nghe của bạn? Tôi muốn chính xác điều đó cho HDMI.

Đôi khi, tôi kết nối màn hình với loa tích hợp với máy tính xách tay của mình để xem video. Thật kỳ lạ khi video nằm trên màn hình (được đặt cách bàn của tôi 3 m) nhưng âm thanh phát ra từ loa trong của máy tính xách tay của tôi (máy tính xách tay nằm trên bàn).

Tất nhiên, tôi chỉ có thể vào cài đặt âm thanh và chuyển kênh đầu ra sang HDMI. Nhưng sau đó, khi tôi tháo cáp HDMI cách đây nhiều giờ và thậm chí có thể ở một vị trí hoàn toàn khác, âm thanh sẽ không phát vì máy chủ âm thanh vẫn cố phát qua HDMI nhưng không có gì được kết nối với nó .

Tự động chuyển trở lại loa bên trong khi không có thiết bị nào được kết nối qua HDMI là quan trọng hơn nhưng chuyển sang đầu ra âm thanh qua HDMI khi thiết bị được kết nối vẫn sẽ rất tốt.

Điều này rõ ràng đã làm việc với 11.10 nhưng nó không hoạt động với 16.04.


Có một phím tắt để chuyển âm thanh có thể là một giải pháp tốt cho bạn. Câu trả lời thứ hai cho chủ đề này thực hiện điều đó: askubfox.com/questions/41858/ trên
WinEunuuchs2Unix

Tôi vẫn đang tìm kiếm một giải pháp cho điều đó (vào ngày 16.04; không có giải pháp nào được đề xuất). vấn đề cũng được thảo luận trong diễn đàn đúc tiền .
nhân vật chính hiro

@hiroprotagonist Vâng, tôi cũng vậy. Có vẻ như câu trả lời ở đây hoạt động trong hầu hết các trường hợp nhưng không phải trong tất cả.
UTF-8 ngày

Trên thực tế, tự động chuyển đổi hoạt động trong Ubuntu 14.04, trừ khi điều này đã bị vô hiệu hóa bởi một bản cập nhật.
BurninLeo

1
Bản sao có thể tự động
Tom Brossman

Câu trả lời:


8

Lý lịch

Tôi gặp vấn đề tương tự trong quá trình tạm dừng / tiếp tục khi âm thanh sẽ chuyển từ TV HDMI sang loa máy tính xách tay. Khi âm thanh tiếp tục sẽ ở lại trên loa Laptop và tôi sẽ phải tự đặt lại thiết bị đầu ra thành TV trong System Settings-> Sound.

Đây là một trong những trải nghiệm khó chịu đầu tiên của tôi khi nâng cấp từ Ubuntu 14.04 lên 16.04 và root đã được nâng cấp lên PulseAudio 8 đi kèm với 16.04 LTS

Sau nhiều tìm kiếm, tôi đã tạo ra một kịch bản gọi là TV-sound. Mặc dù tôi không cắm và rút phích cắm TV như mình, tôi đã thực hiện một số tìm kiếm trên google và tạo một biến thể của tập lệnh để hoạt động trong tình huống của bạn. Tôi đã thử nó và nó hoạt động.

Bước 1: Tạo tập lệnh để chuyển đổi âm thanh giữa các thiết bị được kết nối

Chúng tôi sẽ tạo một kịch bản gọi là hotplugtvudev gọi. Kịch bản tương tự này có thể được gọi ở nhiều nơi mặc dù. Ví dụ, trong quá trình thử nghiệm, tôi đã sử dụng nó trong lock-screen-timerđó âm thanh được hoàn nguyên về Laptop trong khi khóa màn hình.

cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv

Khi trình chỉnh sửa mở ra với một màn hình trống, sao chép và dán phần sau vào đó:

#! /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

Bạn sẽ cần phải thay thế hai lần xuất hiện rickbằng id người dùng của riêng bạn UTF-8, v.v.

Tôi biết điều này có thể chuyên nghiệp hơn với tên người dùng tự động được đặt thành biến bash nhưng tôi chưa thành thạo :( Dù sao, hãy lưu tệp và thoát gedit.

Bước 2: Tạo quy tắc udev

udev theo dõi các sự kiện cắm nóng khi bạn cắm và rút phích cắm màn hình HDMI. Nhập nội dung sau để tạo quy tắc mới.

cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules

LƯU Ý: Nếu tệp 70-persistent-net.ruleskhông tồn tại trong thư mục của bạn sao chép bất kỳ tệp nào khác ở đó. Chúng tôi không cần nội dung tệp, chỉ cần quyền của tệp để đảm bảo chúng tôi giống nhau.

Trình chỉnh sửa sẽ hiển thị một loạt các văn bản không liên quan, làm nổi bật nó và xóa nó. Sau đó đánh dấu mã bên dưới và dán nó vào trình chỉnh sửa:

# 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"

Lưu file và thoát.

Để kích hoạt quy tắc (không cần khởi động lại), chúng ta cần tải lại udev:

sudo udevadm control --reload-rules

Bây giờ bạn có thể cắm và rút phích cắm màn hình HDMI / TV và các công tắc âm thanh phù hợp.

Hãy cẩn thận

Trên hệ thống của tôi, âm thanh sẽ tự động trở lại loa Laptop khi rút phích cắm HDMI. Trên hệ thống của bạn thì không. Có thể cần cải tiến thêm cho mã nếu âm thanh không đi đến loa Laptop của bạn khi rút phích cắm HDMI. Vui lòng trả lời qua nhận xét bên dưới cách mọi thứ hoạt động / không giải quyết.

Kiểm tra nhanh trong CLI

Bạn có thể nhanh chóng kiểm tra mã tại thiết bị đầu cuối bằng cách sử dụng:

    export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
  • Chuyển sang HDMI / TV:

        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
  • Chuyển về loa tích hợp:

        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
  • Hãy nhớ thay thế rickbằng tên người dùng của bạn.

  • Dòng ban đầu exportcó thể không cần thiết nhưng tôi đã đưa nó vào để an toàn.
  • Nếu bạn có nhiều card âm thanh, hoặc một cái gì đó không phải là hdmi-stereochỉnh sửa rõ ràng là cần thiết để tìm ra các tham số chính xác trước khi viết tập lệnh của bạn.

Giải mã tên thiết bị của bạn trong PulseAudio

Mã dưới đây sử dụng cùng một lệnh hai lần. Một lần khi âm thanh được đặt thành TV HDMI bên ngoài. Lần thứ hai khi âm thanh được đặt thành loa tích hợp của Laptop. Mỗi khi bạn thấy tên PulseAudio sử dụng:

$ 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>

Khi bạn có nhiều card âm thanh

Sử dụng lệnh aplay -lđể xem bạn có thẻ lớn hơn số 0. Nếu vậy bạn sẽ cần sử dụng số thẻ thích hợp trong tập lệnh của mình. Ví dụ:

$ 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

Trong ví dụ trên, tất cả các số thẻ là 0 với các nguồn đầu ra khác nhau. Nếu bạn có loa USB, họ có thể có số thẻ khác 0.

Chỉnh sửa ngày 2 tháng 12 năm 2016

Đối với một số lý do chưa biết kịch bản đã bị phá vỡ ngày hôm nay. Mã ở trên được sử dụng để đọc: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status" nhưng tôi phải đổi card0thành card1và mã ở trên đã được sửa đổi như vậy. Tôi không thể giải thích điều gì đã thay đổi trên hệ thống của tôi ngoài các bản cập nhật Ubuntu thông thường kể từ ngày 26 tháng 11 năm 2016.

Chỉnh sửa ngày 14 tháng 12 năm 2016

Mã ở trên cần được chuyển lại thành: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status". Thay vì sửa đổi mã giữa card0card1tùy thuộc vào khởi động, hãy sửa lại chương trình để tham khảo card*để nắm bắt cả hai kịch bản .


Tôi không thể sao chép 70-persistent-net.rulesvì nó không tồn tại. /etc/udev/rules.dchỉ chứa một tập tin duy nhất được gọi là 39-smfp_samsung.rules.
UTF-8

Oh cũng sao chép 30-smfp_samsung.rules, chúng tôi không cần nội dung tệp chỉ để đảm bảo chúng tôi có quyền phù hợp cho tệp mới của chúng tôi. Sao chép một tập tin hiện có là cách dễ nhất (đối với tôi dù sao).
WinEunuuchs2Unix

1
Nó không hoạt động trên hệ thống của tôi. @ Người đã nâng cao câu trả lời này: Nó có hoạt động trên của bạn không? | Lần đầu tiên tôi đã thử nó mà không khởi động lại nhưng nó không hoạt động. Nó cũng không hoạt động sau khi khởi động lại. Tôi đã ngắt kết nối HDMI và đặt âm thanh cho loa bên trong trước khi khởi động lại. Sau khi khởi động lại, tôi đã phát một số nhạc và kết nối cáp HDMI của mình. Âm nhạc vẫn (chỉ) phát ra từ loa tích hợp. Bạn có phải thay đổi bất cứ điều gì ngoài 2 lần xuất hiện của tên người dùng không? cat /sys/class/drm/card0-HDMI-A-1/statushiển thị trạng thái chính xác (tôi đã thử nhiều lần).
UTF-8

@ UTF-8 Tôi đã thêm một phần mới nơi bạn có thể kiểm tra chuyển đổi tại dòng lệnh. Bạn có thể chạy cái này và xem nếu có lỗi xảy ra không?
WinEunuuchs2Unix

Dường như không có output:analog-stereo: pastebin.com/n5bHyhCm Điều này làm cho nó thậm chí còn lạ hơn bởi vì sau đó tôi mong muốn âm thanh sẽ luôn được phát qua HDMI. Ảnh chụp màn hình cài đặt âm thanh của tôi khi HDMI được kết nốikhi HDMI không được kết nối . Chỉnh sửa: Tôi đã thử điều này nhưng tôi phải mất thêm vài phút để đăng bình luận này vì tôi phải tải lên ảnh chụp màn hình.
UTF-8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.