शेल से PulseAudio इनपुट / आउटपुट बदलें?


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 pactlPulseAudio कमांड लाइन विकल्पों के लिए एक नज़र हो सकती है ।
टेरेसा ई जूनियर

ऑफ-टॉपिक: उन स्क्रीनशॉट्स पर क्या GUI एप्लीकेशन है?
WhyNotHugo

यह प्राथमिक प्रणाली सेटिंग्स है।
नातुल्ली काय

जवाबों:


53

@ टेरेसा-ए-जूनियर ने बताया कि pactlउपयोग करने के लिए उपकरण है:

सबसे पहले हम अपने पीए सिंक की आईडी प्राप्त करना चाहते हैं। मेरे सिस्टम पर मुझे यही मिलता है:

$ 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

सिंक 1 वर्तमान में मेरा डिफ़ॉल्ट सिंक है।
लेकिन अब मैं चाहता हूं कि मेरे सभी वर्तमान और भविष्य की धाराएं एचडीएमआई (सिंक 0) के माध्यम से खेली जाएं।

PulseAudio के लिए डिफ़ॉल्ट सिंक सेट करने के लिए एक कमांड है, लेकिन यह मेरे पीसी पर कोई प्रभाव नहीं डालता है:

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

इसके बजाय, नई धाराएँ उस सिंक से जुड़ी हुई प्रतीत होती हैं, जिसकी एक धारा सबसे हाल ही में उसके पास गई थी।

तो चलिए बताते हैं कि संकलित करने के लिए सभी वर्तमान में चल रही धाराएं चलती हैं 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

आप इसे या तो सिंक आईडी या सिंक नाम के साथ पैरामीटर (जैसे या तो 0कुछ या कुछ alsa_output.pci-0000_01_00.1.hdmi-surround) कह सकते हैं ।

अब आप इस स्क्रिप्ट को udev घटना या मुख्य शॉर्टकट से जोड़ सकते हैं।


1
बहुत अच्छे धन्यवाद! मैंने इसे एक पायथन स्क्रिप्ट में बदल दिया है, जो इसके साथ काम करना अच्छा और आसान बनाती है, यह यहां उपलब्ध है
Naftuli Kay

1
संबंधित: askubuntu.com/a/14083/6645
Naftuli Kay

1
@NaftuliTzviKay: आपकी स्क्रिप्ट अब उपलब्ध नहीं है। यदि आपके पास अभी भी है, तो [गिटहब गिस्ट] (gist.github.com) पर पोस्ट करने पर विचार करें।
डेनिलसन सा मैया

और क्या अगर 0 sink input(s) available.? लेकिन वह चमकदार फ़्लैश प्लेयर अभी भी ऑडियो खेल रहा है? और मैं client(s) logged inpacmd list
जिगलिन

1
$ pacmd set-default-sink INDEXमेरी स्क्रिप्ट के लिए अभी भी आवश्यक है अन्यथा वॉल्यूम बदलने के लिए कीबोर्ड कमांड पुराने सिंक स्रोत का उपयोग करना जारी रखते हैं।
माइल

9

पल्सएडियो साउंड सर्वर में हेरफेर करने के लिए निम्न कमांड का उपयोग किया जाता है:

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]:: डिफ़ॉल्ट आउटपुट सिंक सेट करें

pacmd set-default-source [sourcename]:: डिफ़ॉल्ट इनपुट सेट करें

pacmd set-sink-volume [index] [volume]:: सिंक वॉल्यूम सेट करें

pacmd set-source-volume index volume:: वॉल्यूम कंट्रोल रेंज 0 - 65536 (संख्या जितनी कम हो उतनी कम)

ये केवल कुछ ही हैं जो मैंने विकि और मैन पेज से निकाले हैं। संदर्भ यह अधिक विस्तृत जानकारी के लिए। या फिर आप कमांड --helpया manपेज देख सकते हैं ।

वहाँ भी एक कमांड लाइन उपकरण पहले से ही है जो इस उद्देश्य को पूरा करता है। इसका नाम pameix है । यह PulseAudio के लिए कमांड लाइन मिक्सर है। लिंक प्रदान की गई परियोजनाओं के लिए है। यह एक दोस्त और साथी आर्क लिनक्स विश्वसनीय उपयोगकर्ता / डेवलपर द्वारा विकसित किया गया है। यदि आप आर्क नहीं चला रहे हैं, तो आप इसे स्रोत के उपयोग से संकलित कर सकते हैं makeऔर sudo 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

फेडोरा 20 पर चलने वाले मेरे लैपटॉप पर, एचडीएमआई आउटपुट को डिफ़ॉल्ट प्रोफ़ाइल में सिंक के रूप में सूचीबद्ध नहीं किया गया है , बल्कि स्वयं एक अलग प्रोफ़ाइल के रूप में।

मेरे पास इस तरह का केवल 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तो अच्छा संगीत एचडीएमआई के माध्यम से चल रहा है। मुझे मिला:

$ 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पहले उल्लेख नहीं किया गया था, और इस उत्तर पर सबसे महत्वपूर्ण जानकारी है।
स्पाइडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.