เปลี่ยน PulseAudio อินพุต / เอาต์พุตจาก Shell หรือไม่


38

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

ฉันต้องการเขียนสคริปต์เพื่อสลับไปมาระหว่างแหล่งอินพุตและแหล่งข้อมูลหนึ่งและอีกแหล่งหนึ่งโดยพื้นฐานแล้วจะสลับระหว่างหูฟังของฉันกับลำโพง + ไมโครโฟน

ฉันต้องการเปลี่ยนระหว่างนี้:

...และนี่:

มีวิธีสำหรับฉันสคริปต์การถ่ายโอนระหว่างสองอินพุตและเอาต์พุตหรือไม่ โดยพื้นฐานฉันกำลังมองหาสิ่งนี้:

CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"

if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
    set-current-input "HD Pro Webcam C920"
else 
    set-current-input "Vengeance 2000"
fi

if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
    set-current-output "Built-in Audio"
else
    set-current-output "Vengeance 2000"
fi

มีวิธีสคริปต์นี้หรือไม่


3
คุณอาจดูman pactlตัวเลือกบรรทัดคำสั่งของ PulseAudio
Teresa e Junior

หัวข้อ: แอปพลิเคชัน GUI ใดที่อยู่บนหน้าจอเหล่านั้น
WhyNotHugo

มันคือการตั้งค่าระบบของโรงเรียนประถม
Naftuli Kay

คำตอบ:


52

ดังที่ @ Teresa-e-Junior ชี้ให้เห็นว่าpactlเป็นเครื่องมือที่ใช้:

ก่อนอื่นเราอาจต้องการรับรหัสประจำตัวของอ่างล้างมือ PA ของเรา ในระบบของฉันนี่คือสิ่งที่ฉันได้รับ:

$ pactl list short sinks
0       alsa_output.pci-0000_01_00.1.hdmi-surround      module-alsa-card.c      s16le 6ch 44100Hz  SUSPENDED
1       alsa_output.pci-0000_00_1b.0.analog-stereo      module-alsa-card.c      s16le 2ch 44100Hz  RUNNING

Sink 1 เป็นอ่างเริ่มต้นของฉันในปัจจุบัน
แต่ตอนนี้ฉันต้องการให้สตรีมปัจจุบันและอนาคตทั้งหมดของฉันเล่นผ่าน HDMI (เช่น sink 0)

มีคำสั่งให้ตั้งค่า sink เริ่มต้นสำหรับ PulseAudio แต่ดูเหมือนว่าจะไม่มีผลกับพีซีของฉัน:

$ pacmd set-default-sink 0 #doesn't work on my PC :(

แต่กระแสข้อมูลใหม่ดูเหมือนจะเชื่อมต่อกับอ่างที่มีกระแสข้อมูลถูกย้ายไปล่าสุด

ดังนั้นขอ pactl 0บอกจะย้ายลำธารกำลังเล่นทุกคนที่จะจม ก่อนอื่นเราจะต้องเขียนรายการพวกเขา:

$ pactl list short sink-inputs
290     1       176     protocol-native.c       float32le 2ch 44100Hz
295     1       195     protocol-native.c       float32le 2ch 44100Hz

ตกลงเรามีสองสาย (รหัส 290 และ 295) 1ที่มีทั้งที่แนบมากับอ่างล้างจาน
ให้ย้ายพวกมันไปจม0:

$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0

ดังนั้นควรจะเป็น ตอนนี้เราแค่ต้องสร้างสคริปต์ที่ใช้งานได้สำหรับเรา:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$1"

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input "$streamId" "$newSink"
done

คุณสามารถเรียกมันด้วย sink ID หรือชื่อ sink เป็นพารามิเตอร์ (เช่นอย่างใดอย่างหนึ่ง0หรือบางอย่างalsa_output.pci-0000_01_00.1.hdmi-surround)

ตอนนี้คุณสามารถแนบสคริปต์นี้กับเหตุการณ์ udev หรือแป้นพิมพ์ลัด


1
เยี่ยมมากขอบคุณ! ผมได้เปิดนี้เป็นสคริปต์ Python ซึ่งทำให้ดีและง่ายต่อการทำงานกับมันใช้ได้ที่นี่
Naftuli Kay

1
ที่เกี่ยวข้อง: askubuntu.com/a/14083/6645
Naftuli Kay

1
@NaftuliTzviKay: สคริปต์ของคุณไม่สามารถใช้ได้อีกต่อไป หากคุณยังมีอยู่ให้ลองโพสต์ไปที่ [GitHub Gist] (gist.github.com)
Denilson Sá Maia

แล้วจะเป็น0 sink input(s) available.อย่างไร แต่โปรแกรมเล่นแฟลชที่ขี้เล่นก็ยังเล่นเสียงอยู่ใช่ไหม และฉันเห็นโปรแกรมเล่นแฟลชในclient(s) logged inส่วนของpacmd list
Zhigalin

1
$ pacmd set-default-sink INDEXยังคงจำเป็นสำหรับสคริปต์ของฉันมิฉะนั้นคำสั่งแป้นพิมพ์สำหรับการเปลี่ยนระดับเสียงยังคงใช้แหล่งที่มาของอ่างเก็บน้ำเก่า
myol

9

คำสั่งต่อไปนี้ใช้เพื่อจัดการกับเซิร์ฟเวอร์เสียง PulseAudio:

pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.

นี่คือตัวอย่างของวิธีการใช้งาน

pacmd list-sinks:: ชื่อรายการหรือหมายเลขดัชนีของอ่างล้างมือที่เป็นไปได้

pacmd set-default-sink [sinkname]:: ตั้งค่า sink เอาท์พุทเริ่มต้น

pacmd set-default-source [sourcename]:: ตั้งค่าเริ่มต้นการป้อนข้อมูล

pacmd set-sink-volume [index] [volume]:: กำหนดปริมาณอ่าง

pacmd set-source-volume index volume:: ช่วงการควบคุมระดับเสียง 0 - 65536 (ยิ่งลดปริมาณยิ่งลดระดับเสียง)

นี่เป็นเพียงส่วนหนึ่งที่ฉันดึงออกมาจากหน้า wiki & man อ้างอิงสิ่งนี้สำหรับข้อมูลรายละเอียดเพิ่มเติม หรือคุณสามารถดูคำสั่ง--helpหรือmanหน้า

นอกจากนี้ยังมีเครื่องมือบรรทัดคำสั่งที่มีอยู่แล้วที่ให้บริการวัตถุประสงค์นี้ ชื่อของมันคือponymix มันเป็นตัวผสมบรรทัดคำสั่งสำหรับ PulseAudio การเชื่อมโยงที่มีให้กับโครงการ GitHub พัฒนาโดยเพื่อนและผู้ใช้ Arch Linux ที่เชื่อถือได้ / นักพัฒนา หากคุณไม่ได้ทำงาน Arch คุณก็สามารถรวบรวมได้จากแหล่งที่ใช้และmakesudo make install

$ ponymix --help
    usage: ponymix [options] <command>... 
Options:
 -h, --help              display this help and exit    
 -c, --card CARD         target card (index or name)
 -d, --device DEVICE     target device (index or name)
 -t, --devtype TYPE      device type
 -N, --notify            use libnotify to announce volume changes
     --source            alias to -t source
     --input             alais to -t source
     --sink              alias to -t sink
     --output            alias to -t sink
     --sink-input        alias to -t sink-input
     --source-output     alias to -t source-output
Device Commands:
  help                   display this message
  defaults               list default devices (default command)
  set-default            set default device by ID
  list                   list available devices
  list-short             list available devices (short form)
  list-cards             list available cards
  list-cards-short       list available cards (short form)
  get-volume             get volume for device
  set-volume VALUE       set volume for device
  get-balance            get balance for device
  set-balance VALUE      set balance for device
  adj-balance VALUE      increase or decrease balance for device
  increase VALUE         increase volume
  decrease VALUE         decrease volume
  mute                   mute device
  unmute                 unmute device
  toggle                 toggle mute
  is-muted               check if muted
Application Commands:
  move DEVICE            move target device to DEVICE
  kill DEVICE            kill target DEVICE
Card Commands:
  list-profiles          list available profiles for a card
  list-profiles-short    list available profiles for a card(short form)
  get-profile            get active profile for card
  set-profile PROFILE    set profile for a card

เฮ้ขอบคุณสำหรับคำตอบนี้! มันช่วยให้ฉันตันกับปัญหาที่เกี่ยวข้องกับคนนี้
KlaymenDK

5

แล็ปท็อปของฉันทำงาน Fedora 20 ช่องต่อ HDMI ไม่ได้ระบุว่าเป็นอ่างล้างจานในโปรไฟล์เริ่มต้น แต่เป็นที่แตกต่างกันรายละเอียดเอง

ฉันมีเพียง 1 อ่างล้างจานเช่นนี้เพลงดีเล่นบนลำโพงแล็ปท็อปของฉัน:

$ pactl list short sinks
8   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

ถ้าฉันpactl set-card-profile 0 output:hdmi-stereoเล่นเพลงที่ดีก็เล่นผ่าน HDMI ฉันเข้าใจ:

$ pactl list short sinks
14  alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

pactl set-card-profile 0 output:analog-stereo+input:analog-stereoที่จะได้รับกลับไปเริ่มต้นที่ฉันเพียงแค่เรียกใช้ วิธีเริ่มต้นจะมีอีกถ้าฉันรีบูต

รายการส่วนกำหนดค่าสำหรับการ์ดของฉันอยู่ที่ด้านใดด้านpactl list cardsหนึ่ง


ข้อมูลนี้มีให้โดยคำตอบที่ยอมรับแล้ว โปรดอย่าคัดลอกคำตอบของผู้ใช้รายอื่นเว้นแต่คุณจะมีอะไรเพิ่มให้มากกว่านี้ นี่เป็นเพียงการตอบโต้คำตอบอื่น ๆ และไม่มีอะไรใหม่หรือมีประโยชน์!
slm

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