ปุ่มลัดเพื่อสลับระหว่างเอาต์พุตสเตอริโออะนาล็อกและเอาต์พุตเสียง HDMI


18

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

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

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


1
+1 มันจะยอดเยี่ยมถ้าฉันสามารถสลับไปยังโหมดการแสดงผล HDMI ที่ถูกต้องและโหมดเสียงในหนึ่งปุ่มกด
Kit Menke

สิ่งที่จะดีกว่านี้คือเมื่อตรวจพบช่องสัญญาณเสียง HDMI / Display Port นี้จะเปลี่ยนโดยอัตโนมัติ นี่คือสิ่งที่ใช้เชื่อมต่อ ฉันดูเหมือนจะจำรหัสการเชื่อมต่อได้สักพักแล้วซึ่งจะเปลี่ยนการกำหนดค่าตามรหัสฮาร์ดแวร์ (MAC) ใครรู้ว่าสิ่งที่เรียกว่าอีกครั้ง?
เอลียาห์ลินน์

คำตอบ:


10

ด้วยpulseaudioเราสามารถเลือกเอาท์พุทซิงค์จากบรรทัดคำสั่ง:

pacmd set-default-sink "SINKNAME"

คำสั่งนี้สามารถใช้ในตัวเรียกใช้งานสคริปต์หรือแม้กระทั่งกำหนดให้กับแป้นพิมพ์ลัดเพื่อการสลับที่รวดเร็วระหว่างอ่างล้างมือที่แตกต่างกัน โปรดแทนที่ "SINKNAME" ด้วยชื่อหรือหมายเลขของซิงก์ที่คุณต้องการ รายการของ sink ที่รู้จักที่มีหมายเลขและชื่อที่สัมพันธ์กันถูกกำหนดโดยคำสั่ง:

pacmd list-sinks

หมายเหตุ:การเปลี่ยน sink sink เอาต์พุตผ่านอินเตอร์เฟสบรรทัดรับคำสั่งสามารถมีผลได้ต่อเมื่อปิดใช้งานการอ่านอุปกรณ์สตรีมเป้าหมาย สิ่งนี้สามารถทำได้โดยการแก้ไขสายที่เกี่ยวข้องใน/etc/pulse/default.pa:

load-module module-stream-restore restore_device=false

อีกวิธีหนึ่งเราสามารถเรียกใช้ pulseaudio เพื่อส่งสัญญาณเสียงไปยังอุปกรณ์เสียงภายในและไปยังอุปกรณ์ hdmi พร้อมกันโดยใช้paprefsพร้อมตัวเลือกเพื่อเพิ่มอุปกรณ์ส่งออกเสมือน:

paprefs


2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"และใช้pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"งานได้หลังจากเลือกโปรไฟล์ที่เกี่ยวข้องในการตั้งค่าเสียง หากฉันมีชุด HDMI และฉันเรียกใช้คำสั่ง pacmd สำหรับสเตอริโออะนาล็อกฉันจะได้รับ eror Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.แต่ถ้าฉันเลือกโปรไฟล์จาก Sound Preferences GUI และเรียกใช้คำสั่งเดียวกันด้วยตนเองฉันไม่ได้รับข้อผิดพลาด ดังนั้นจึงไม่ช่วยในการสลับ
iJeeves

@iJeeves: ดูการแก้ไขเพื่ออัปเดต
Takkat

ปัญหาที่คล้ายกัน หากฉันรันคำสั่งมันจะเปลี่ยนเป็นภาพใน GUI แต่เสียงไม่เปลี่ยนเส้นทาง ฉันต้องสลับมันด้วยตนเองใน GUI เพื่อให้ทำงานได้ ความคิดใด ๆ
Elijah Lynn

1
@ElijahLynn: คุณอาจต้องย้ายกระแสข้อมูล: askubuntu.com/questions/71863/…
Takkat

@ Takkat: ฉันยังไม่ได้ลอง แต่ดูเหมือนว่าจะเป็นปัญหาที่แน่นอนที่ฉันมี ขอบคุณมาก!
Elijah Lynn

7

ฉันพบสิ่งนี้น่ารำคาญมากและเขียนสคริปต์เพื่อสลับผลลัพธ์:

#!/bin/bash

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

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

จากนั้นผูกคีย์ที่ไม่ได้ใช้บนแป้นพิมพ์ของฉันเพื่อเรียกใช้งาน (ดูวิธีผูกคำสั่งที่กำหนดเองกับแป้นพิมพ์ลัดได้อย่างไร )


แม้ว่าคุณจะไม่ได้ลงชื่อเข้าใช้ใน 18 เดือน แต่ต้องการแจ้งให้คุณทราบว่านี่เป็นคำตอบที่ดีที่สุด IMO +1
WinEunuuchs2Unix

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

2

อีกหนึ่งสคริปต์ Sinker Switcher

ทดสอบบน Ubuntu 16.04


แต่อันนี้ให้คุณสลับเฉพาะเสียงของแอพพลิเคชั่นที่คุณต้องการ

การใช้:โฟกัสแอปพลิเคชันที่คุณต้องการเปลี่ยน sink และรันสคริปต์นี้ แค่นั้นแหละ!!!

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

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

อธิบายสคริปต์

เราจำเป็นต้องค้นหา PID ของแอปพลิเคชันที่โฟกัส

แต่ก่อนอื่นเราต้องการ xid

xprop -root _NET_ACTIVE_WINDOW 

จากนั้นใส่ที่นี่$xidเพื่อรับ pid ของแอปพลิเคชัน

xprop -id $xid _NET_WM_PID

ตอนนี้เราต้องการค้นหา sink-inputs ที่เกี่ยวข้องกับ PID นั้น

ก่อนอื่นเรามาทำให้เป็นเชิงเส้นเอาต์พุตของคำสั่ง pacmd list-sink-inputsเพื่อแสดง sink-input หนึ่งรายการต่อบรรทัดโดยแสดงดัชนี sink และ pid ในบรรทัดเดียวกัน

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

เรามาวิเคราะห์กันทีละขั้นตอน:

grep -E 'index:|sink:|process.idเพียง แต่ให้เส้นที่มีindex:, sink:หรือprocess.id

tr '\n' ' ' เข้าร่วมทุกบรรทัด

tr -d '"'ลบ"ตัวละครทั้งหมด จำเป็นต้องรับ pid โดยไม่มีเครื่องหมายอัญประกาศ

sed -e 's/index:/\n/g'แทนที่index:เหตุการณ์ทั้งหมดด้วยอักขระบรรทัดใหม่\n

tail -n +2 ลบบรรทัดแรกเนื่องจากว่างเปล่า

และผลลัพธ์ก็คือ:

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

ลองวิเคราะห์หนึ่งบรรทัดเพื่อทำความเข้าใจความหมาย:

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182คือดัชนี sink-input 0เป็นดัชนี sink และ13752ท้ายที่สุดคือ pid ของแอ็พพลิเคชันที่เป็นของ

จากนั้นเราวนซ้ำแต่ละบรรทัด

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

และสุดท้ายกรองเฉพาะ pid ของ sink-input ที่ตรงกับ pid ของแอพที่โฟกัส

  if [ $sink_input_pid = $app_pid ]; then

แยกข้อมูล

ด้วยawkเราสามารถได้รับองค์ประกอบที่เราต้องการ

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

รับจำนวน sinks เพื่อทราบเมื่อการหมุน sinks ควรเริ่มต้นใหม่จาก 0

sink_list_size=${#sink_list_array[@]}

การค้นหา sink ถัดไปเราต้องทำซ้ำผ่านรายการ sink เพื่อรู้ว่าอันไหนที่ตรงกับcurrent_sink_indexและเพื่อทราบดัชนีของ sink ถัดไป

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

และสุดท้ายเราย้าย sink-input เพื่อเล่นในnext_sink_index

pacmd move-sink-input $sink_input_index $next_sink_index

หมายเหตุเกี่ยวกับ Ubuntu 16.04:

เมื่อกำหนดค่าปุ่มทางลัดฉันไม่สามารถใช้งานได้กับตัวจัดการทางลัดของ Ubuntu ดังนั้นฉันต้องติดตั้งcompizconfig-settings-manager

sudo apt-get install compizconfig-settings-manager

+1 สำหรับคำตอบแรกที่ยอดเยี่ยมในฐานะผู้ใช้ใหม่ เนื่องจากคำถามดั้งเดิมสำหรับ Ubuntu 11.04 คุณควรชี้ให้เห็นว่าเวอร์ชันใดที่ทดสอบด้วย
WinEunuuchs2Unix

@ WinEunuuchs2Unix ว้าว! ขอขอบคุณ :). ฉันเพิ่มเวอร์ชันอูบุนตูด้านล่างชื่อ
Madacol


1

เนื่องจากมีการ์ดเสียงเดียวปรากฏในภาพหน้าจอฉันคิดว่าควรเปลี่ยนสลับเอาต์พุตของการ์ดเสียงนี้

ตัวอย่างเช่น: ฉันมีโน้ตบุ๊กที่มีการ์ดเสียงในตัว แต่มีเอาต์พุตดิจิตอล (SPDIF) เมื่อเชื่อมต่อ

ดังนั้นสิ่งที่ฉันต้องการทำคือสลับเอาต์พุตที่ใช้งานอยู่หรือ "โปรไฟล์" ใน pulseaudio

ฉันพบคำสั่งที่ทำอย่างนั้น:

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

สิ่งที่ฉันทำเพื่อให้ได้ชื่อที่ถูกต้องสำหรับการตั้งค่าเอาต์พุตที่ต้องการ - ที่นี่เอาต์พุตดิจิตอล แต่อินพุตอะนาล็อก (ไมโคร) - คือ:

pacmd list | grep output

1

ฉันพยายามหาวิธีแก้ปัญหานี้เช่นกัน ในขณะที่ Ubuntu 11.04 ไม่สามารถทำได้โดยตรงฉันพบคู่มือนี้เพื่อเพิ่มทั้ง HDMI และอนาล็อกเป็นเอาต์พุตแยกต่างหากดังนั้น pacmd จึงแสดง 3 sinks ในขณะนี้ จากนั้นเป็นไปได้ที่จะสลับระหว่าง sinks โดยใช้คำสั่งด้านบน ( ดูเพิ่มเติมที่ )

แต่เห็นได้ชัดว่า Ubuntu 11.11 จะได้รับ PulseAudio พร้อมระบบตรวจจับแจ็ค ตามเว็บไซต์ด้านล่าง David Henningsson ได้ทำการตรวจจับรหัสผ่าน udev ดังนั้นชีพจรเสียงจะถูกสลับไปยังเอาต์พุตที่เพิ่มล่าสุดโดยอัตโนมัติรวมถึงการสลับระหว่างโปรไฟล์ต่าง ๆ ของการ์ดเสียงเดียวกัน (เช่นกรณีของคุณและการตั้งค่าของฉัน) (ดูที่นี่ )

ดังนั้นฉันจึงหวังว่าจะใช้งานได้เมื่อฉันลองรุ่นสุดท้ายในวันศุกร์หน้า


1

จากคำตอบก่อนหน้านี้หลายคำฉันเขียนสคริปต์ที่ตั้งค่าซิงค์การเล่นสลับระหว่างคำที่มีอยู่

วิธีที่ดีที่สุดในการใช้งานคือการสร้างแป้นพิมพ์ลัดเพื่อเรียกใช้ดังนั้นทุกครั้งที่คุณกดปุ่มชุดนั้นเสียงจะถูกเปลี่ยนเส้นทางไปยังอ่างล้างจานที่มีอยู่ถัดไป

รหัสมีอยู่ที่นี่: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

ในกรณีของฉันตัวเลือกแบบอะนาล็อกที่ไม่ได้อยู่ในรายการ ติดตั้ง pavucontrol: sudo apt install pavucontrol

ไม่สามารถแก้ไขปัญหาได้โดยเริ่มต้นแอปพลิเคชัน:

  1. เริ่มแอปผ่านเทอร์มินัลโดยป้อน: pavucontrol(Enter)
  2. ไปที่แท็บ 'การกำหนดค่า'
  3. เลือกโปรไฟล์เอาต์พุตสเตอริโออะนาล็อกที่ Intern Sound

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

ตอนนี้ฉันสามารถฟังและเลือกโปรไฟล์ที่แตกต่างกัน (ภายใต้ Linux Mint):

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


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"

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

ภาพหน้าจอ

ภาพหน้าจอ

ฉันใช้:

  • Super + Alt + o: สลับสัญญาณออกระหว่างหูฟังและ HDMI
  • Super + Alt + Up: Vol Up
  • Super + Alt + Down: เล่มลง

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

ทดสอบบน Ubuntu 16.04 และ 18.04


หากคุณไม่ได้ทำงานกับสคริปต์ฉันได้ทำการเปลี่ยนแปลงตาม @ user829996 คำตอบ:

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

มีวิธีใดบ้างที่ฉันสามารถสร้างปุ่มสลับในแผงควบคุม

ฉันเขียนแอปเพล็ตตัวบ่งชี้ที่ให้คุณสลับเอาต์พุตเสียง


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