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à hotplugtv
udev 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 rick
bằ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.rules
khô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ế rick
bằng tên người dùng của bạn.
- Dòng ban đầu
export
có 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-stereo
chỉ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 card0
thành card1
và 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 card0
và card1
tù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 .