Làm cách nào để chuyển đổi giữa các phần cứng đầu ra âm thanh khác nhau bằng vỏ?


34

Tôi sử dụng máy tính xách tay của tôi với một màn hình bên ngoài có loa. Khi màn hình được gắn qua HDMI, tôi có thể chuyển đổi (sử dụng GUI: Cài đặt âm thanh -> Phần cứng) giữa đầu ra âm thanh của máy tính xách tay thông thường và đầu ra màn hình.

Tôi lặp lại thủ tục này rất nhiều thời gian và tôi bắt đầu tự hỏi liệu tôi có thể tự động hóa nó hay không, dù sao, thực hiện nó theo cách nhanh hơn bằng cách sử dụng shell.

Bản phân phối của tôi là Ubuntu 12.04 với gnome 3.

CHỈNH SỬA:

Tôi đã thử sử dụng pacmd, nhưng danh sách chìm chỉ cung cấp cho tôi thiết bị tôi hiện đang sử dụng:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>

Sau khi chuyển đổi từ GUI:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

Và nếu tôi cố gắng thay đổi, tôi nhận được:

pacmd set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
Welcome to PulseAudio! Use "help" for usage information.
Sink alsa_output.pci-0000_00_1b.0.hdmi-stereo does not exist.

Câu trả lời:


28

Trong trường hợp này thẻ luôn giống nhau. Cái đang thay đổi giữa công tắc và cái khác là "hồ sơ thẻ".

Vì vậy, giải pháp thực sự hiệu quả là:

pacmd set-card-profile <cardindex> <profilename>

Trong trường hợp của tôi, tôi tìm thấy tất cả các hồ sơ thẻ với:

pacmd list-cards

Và sau khi tôi có thể chuyển đổi giữa màn hình và loa máy tính xách tay với:

pacmd set-card-profile 0 output:hdmi-stereo

Và:

pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo

Trong đó 0 là chỉ số của thẻ:

pacmd list-cards
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 card(s) available.
    index: 0
    name: <alsa_card.pci-0000_00_1b.0>

Và cuối cùng, để làm cho việc chuyển đổi nhanh hơn, tôi đã thiết lập hai bí danh trong tệp .bashrc của mình:

alias audio-hdmi='pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo'
alias audio-laptop='pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo'

Bằng cách này, tôi có thể chuyển đổi giữa âm thanh từ màn hình hoặc từ máy tính xách tay (tai nghe) gõ vào vỏ: audio-hdmi hoặc audio-laptop


Hừm. Pacmd của tôi không có tùy chọn 'danh sách thẻ ...
ka3ak


3

Tôi đã tạo một tập lệnh rất nhỏ dựa trên các tập trước, nó không chỉ chuyển đổi âm thanh mà còn cả đầu ra video. Nó sử dụng bộ phân tán để chuyển giữa các màn hình.

Đây là mã:

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo>" ]; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
        disper -s
else 
        pacmd set-card-profile 0 "output:hdmi-stereo"
        disper -S        
fi

Đối với tôi nó đặc biệt hữu ích vì tôi không muốn sao chép màn hình. Tôi hoặc sử dụng cái này hoặc cái kia. Bạn có thể cần điều chỉnh cấu hình âm thanh cho hệ thống cụ thể của mình.


2

Bạn có thể sử dụng pactl, đọc trang người dùng của nó để biết thêm thông tin.


2

Kịch bản python của Lukas ( https://github.com/lkettenb/sound-output-switcher , được đăng ở trên) để thực hiện một applet thông báo hoạt động tốt. Nó cần gói appindicator. Điều đó có thể được cài đặt với

sudo apt-get install python-appindicator

3
Vui lòng bao gồm ít nhất một vài từ trong câu trả lời của bạn để giải thích kịch bản là gì và tại sao nó lại tiện dụng.
derobert


0

Như tôi đã nói ở đây (có thể là một bản sao), một thay thế cho Chỉ báo chuyển đổi âm thanh (yêu cầu thêm PPA):

Trong một dòng

Trong trường hợp của tôi là hdmi-stereo-extra1+inputhồ sơ, vì vậy trong một dòng sẽ là : [[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo".

Bạn có thể sử dụng một phím tắt tùy chỉnh để thực thi nó bash -c(sẽ cảnh báo bạn nếu có bất kỳ xung đột nào với các phím tắt khác):

nhập mô tả hình ảnh ở đây

Ngoài ra bạn có thể thêm aliasvào của bạn .bashrc.

Trong một kịch bản

Tôi đã thực hiện một số thay đổi dựa trên câu trả lời @ user829996 (và ở đây @ user56655):

#!/bin/bash
set -euo pipefail # strict mode

activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; }
CURRENT_PROFILE="$(eval activeProfile)"

# If it doesn't work run  pacmd list-cards  and try the other outputs from profile section
ANALOG_PROFILE="output:analog-stereo+input:analog-stereo"
HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo"

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then
  pacmd set-card-profile 0 "$ANALOG_PROFILE"
else
    pacmd set-card-profile 0 "$HDMI_PROFILE"
fi

activeProfile

0

Tôi đã tạo tập lệnh python sau đây thực hiện như sau:

  1. Chuyển đổi thiết bị mặc định sang thiết bị tiếp theo trong danh sách (bao quanh) bất kể id là gì
  2. Di chuyển tất cả các ứng dụng đang chạy sang thiết bị này.
  3. Gửi thông báo đến GUI với tên thiết bị.
#!/usr/bin/env python3
import subprocess
# Toggle default device to the next device (wrap around the list)
cards_info = subprocess.run(['pacmd','list-sinks'], stdout=subprocess.PIPE)
card_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=cards_info.stdout)
indexes_list = card_indexes.stdout.decode().splitlines()
card_descriptions = subprocess.run(['grep', 'device.description'], stdout=subprocess.PIPE, input=cards_info.stdout)
indices = [i for i, s in enumerate(indexes_list) if '*' in s]
if (len(indices) != 1):
    print("Error finding default device")
    exit(1)
default_index = indices[0]
next_default = 0
if (default_index != (len(indexes_list) - 1)):
    next_default = default_index + 1
next_default_index =  (indexes_list[next_default].split("index: ",1)[1])
subprocess.run(['pacmd','set-default-sink %s' %(next_default_index)], stdout=subprocess.PIPE)

# Move all existing applications to the new default device
inputs_info = subprocess.run(['pacmd','list-sink-inputs'], stdout=subprocess.PIPE)
inputs_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=inputs_info.stdout)
inputs_indexes_list = inputs_indexes.stdout.decode().splitlines()
for line in inputs_indexes_list:
    input_index =  (line.split("index: ",1)[1])
    subprocess.run(['pacmd','move-sink-input %s %s' %(input_index, next_default_index)], stdout=subprocess.PIPE)

# Send notification to the GUI
descriptions_list = card_descriptions.stdout.decode().splitlines()
if (len(descriptions_list) == len(indexes_list)):
    description =  (descriptions_list[next_default].split("= ",1)[1])[1:-1]
    args = ["notify-send", "Default audio card changed", 'Default audio card was set to %s' %(description)]
    subprocess.run(args, stdout=subprocess.PIPE)

Đã gán một phím tắt cho kịch bản và cuộc sống của tôi hiện đang hạnh phúc

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.