मैं शेल का उपयोग करके विभिन्न ऑडियो आउटपुट हार्डवेयर के बीच कैसे स्विच कर सकता हूं?


34

मैं अपने लैपटॉप का उपयोग बाहरी मॉनिटर के साथ करता हूं जिसमें स्पीकर हैं। जब मॉनिटर को HDMI के माध्यम से जोड़ा जाता है तो मैं सामान्य लैपटॉप ऑडियो आउटपुट और मॉनिटर आउटपुट के बीच स्विच कर सकता हूं (GUI: साउंड सेटिंग -> हार्डवेयर का उपयोग करके)।

मैं इस प्रक्रिया को बहुत समय तक दोहराता हूं और मुझे आश्चर्य है कि क्या मैं इसे स्वचालित कर सकता हूं या वैसे भी, शेल का उपयोग करके इसे तेजी से निष्पादित कर सकता हूं।

मेरा डिस्टर्ब Ubuntu 12.04 सूक्ति 3 के साथ है।

संपादित करें:

मैंने pacmd का उपयोग करने की कोशिश की, लेकिन सूची-सिंक मुझे केवल वह डिवाइस देता है जिसका मैं वर्तमान में उपयोग कर रहा हूं:

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.

जवाबों:


28

इस मामले में कार्ड हमेशा समान होता है। एक स्विच के बीच क्या बदल रहा है और दूसरा "कार्ड-प्रोफाइल" है।

तो जो समाधान वास्तव में काम किया है वह है:

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'

इस तरह मैं मॉनिटर से ऑडियो या लैपटॉप (हेडफ़ोन) से शेल में टाइप कर सकता हूँ: ऑडियो-एचडीएमआई या ऑडियो-लैपटॉप


हम्म। मेरे pacmd में 'लिस्ट-कार्ड्स' विकल्प नहीं है ...
ka3ak

5

मैंने एक छोटा संकेतक एप्लेट लिखा है जो आपको ध्वनि आउटपुट स्विच करने देता है। कोई शेल स्क्रिप्ट नहीं बल्कि शायद आपके या अन्य पाठकों के लिए मददगार हो।

https://github.com/lkettenb/sound-output-switcher

स्क्रीनशॉट


3

मैंने पिछले वाले के आधार पर एक बहुत छोटी स्क्रिप्ट बनाई, जो न केवल ऑडियो स्विच करती है, बल्कि वीडियो आउटपुट भी है। यह डिस्प्ले के बीच स्विच करने के लिए डिस्पर का उपयोग करता है।

यहाँ कोड है:

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

pactlअधिक जानकारी के लिए आप इसके मैन पेज को पढ़ सकते हैं ।


2

लुकास की पायथन लिपि ( https://github.com/lkettenb/sound-output-switcher , ऊपर पोस्ट की गई) एक नोटिफ़ायर एप्लेट को अच्छी तरह से लागू करने के लिए। इसके लिए एपिंडिलेटर पैकेज की जरूरत है। के साथ स्थापित किया जा सकता है

sudo apt-get install python-appindicator

3
कृपया अपने उत्तर में कम से कम कुछ शब्दों को शामिल करके बताएं कि स्क्रिप्ट क्या है और यह क्यों काम है।
derobert


0

जैसा कि मैंने यहां (शायद एक डुप्लिकेट), साउंड स्विचर संकेतक का एक विकल्प (जो एक पीपीए जोड़ने की आवश्यकता है) बताया:

एक लाइन में

मेरे मामले में 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)

स्क्रिप्ट को कीबोर्ड शॉर्टकट सौंपा, और मेरा जीवन अब खुश है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.