ฉันจะสลับระหว่างฮาร์ดแวร์เอาต์พุตเสียงอื่นโดยใช้เชลล์ได้อย่างไร


33

ฉันใช้แล็ปท็อปกับจอภาพภายนอกที่มีลำโพง เมื่อเชื่อมต่อจอภาพผ่าน HDMI ฉันสามารถสลับ (โดยใช้ GUI: การตั้งค่าเสียง -> ฮาร์ดแวร์) ระหว่างสัญญาณเสียงแล็ปท็อปปกติและเอาต์พุตของจอภาพ

ฉันทำตามขั้นตอนนี้ซ้ำหลายครั้งและฉันเริ่มสงสัยว่าฉันสามารถทำให้มันเป็นแบบอัตโนมัติได้หรือไม่หรือเรียกใช้มันด้วยวิธีที่รวดเร็วกว่าโดยใช้เชลล์

distro ของฉันคือ Ubuntu 12.04 กับ gnome 3

แก้ไข:

ฉันพยายามใช้ pacmd แต่ list-sinks ให้เฉพาะอุปกรณ์ที่ฉันใช้อยู่ในปัจจุบัน:

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

หลังจากเปลี่ยนจาก GUI:

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

และถ้าฉันพยายามเปลี่ยนฉันจะได้รับ:

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.

คำตอบ:


27

ในกรณีนี้การ์ดจะเหมือนเดิมเสมอ สิ่งที่เปลี่ยนไประหว่างสวิตช์และสวิตช์อื่นคือ "โปรไฟล์การ์ด"

ดังนั้นทางออกที่ใช้งานได้จริงคือ:

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

ในกรณีของฉันฉันพบโปรไฟล์การ์ดทั้งหมดด้วย:

pacmd list-cards

และหลังจากที่ฉันสามารถสลับระหว่างลำโพงมอนิเตอร์และแล็ปท็อปด้วย:

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

และ:

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

โดยที่ 0 คือดัชนีของการ์ด:

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>

และในที่สุดเพื่อให้สวิตช์ทำงานได้เร็วขึ้นฉันได้ตั้งชื่อแทนสองไฟล์ในไฟล์. bashrc ของฉัน:

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'

วิธีนี้ฉันสามารถสลับระหว่างเสียงจากจอภาพหรือจากแล็ปท็อป (หูฟัง) ที่พิมพ์ในเชลล์: audio-hdmi หรือ audio-laptop


ฮึ่ม pacmd ของฉันไม่มีตัวเลือก 'list-cards' ...
ka3ak


3

ฉันสร้างสคริปต์ขนาดเล็กมากโดยอิงจากสคริปต์ก่อนหน้าซึ่งไม่เพียง แต่เปลี่ยนเสียง แต่รวมถึงเอาต์พุตวิดีโอ มันใช้disperเพื่อสลับระหว่างการแสดงผล

นี่คือรหัส:

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

สำหรับฉันแล้วมันมีประโยชน์เป็นพิเศษเพราะฉันไม่ชอบที่จะโคลนจอแสดงผล ฉันใช้อย่างใดอย่างหนึ่ง คุณอาจจำเป็นต้องปรับโปรไฟล์เสียงให้เข้ากับระบบเฉพาะของคุณ



2

สคริปต์ python ของ Lukas ( https://github.com/lkettenb/sound-output-switcherโพสต์ด้านบน) เพื่อใช้แอปเพล็ตตัวแจ้งเตือนทำงานได้ดี มันต้องการแพคเกจของ appindicator ที่สามารถติดตั้งได้ด้วย

sudo apt-get install python-appindicator

3
โปรดระบุอย่างน้อยสองสามคำในคำตอบของคุณเพื่ออธิบายว่าสคริปต์คืออะไรและทำไมจึงมีประโยชน์
Derobert


0

อย่างที่ฉันบอกไว้ที่นี่ (อาจจะซ้ำกัน) เป็นทางเลือกแทนSound Switcher Indicator (ซึ่งต้องการเพิ่ม PPA):

ในหนึ่งบรรทัด

ในกรณีของผมก็คือรายละเอียดดังนั้นในหนึ่งบรรทัดจะเป็น:hdmi-stereo-extra1+input[[ $(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"

คุณสามารถใช้ทางลัดที่กำหนดเองเพื่อเรียกใช้งานด้วยbash -c(จะเตือนคุณหากมีข้อขัดแย้งกับทางลัดอื่น ๆ ):

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้คุณสามารถเพิ่มที่คุณalias.bashrc

ในสคริปต์

ฉันได้ทำการเปลี่ยนแปลงตาม @ user829996 (และที่นี่ @ 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

ฉันสร้างสคริปต์ไพ ธ อนต่อไปนี้ซึ่งทำสิ่งต่อไปนี้:

  1. สลับอุปกรณ์เริ่มต้นเป็นอุปกรณ์ถัดไปในรายการ (ล้อมรอบ) โดยไม่คำนึงถึงรหัส
  2. ย้ายแอปพลิเคชันที่ทำงานอยู่ทั้งหมดไปยังอุปกรณ์นี้
  3. ส่งการแจ้งเตือนไปยัง GUI ด้วยชื่ออุปกรณ์
#!/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)

กำหนดแป้นพิมพ์ลัดให้สคริปต์และชีวิตของฉันก็มีความสุขแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.