Kabuğu kullanarak farklı ses çıkışı donanımları arasında nasıl geçiş yapabilirim?


33

Dizüstü bilgisayarımı, hoparlörleri olan harici bir monitörle kullanıyorum. Monitör HDMI ile bağlandığında normal laptop ses çıkışı ile monitör çıkışı arasında (GUI: Ses Ayarı -> Donanım kullanılarak) geçiş yapabilirim.

Bu prosedürü çok fazla tekrarlıyorum ve bunu otomatikleştirip gerçekleştiremeyeceğimi veya neyse, kabuğu kullanarak daha hızlı bir şekilde uygulayabileceğimi merak etmeye başladım.

Benim dağıtımım, Gnome 3 ile Ubuntu 12.04.

DÜZENLE:

Pacmd kullanmayı denedim, ancak list-lavabolar sadece şu anda kullandığım cihazı veriyor:

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

GUI'den bir değişiklikten sonra:

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

Ve onu değiştirmeye çalışırsam alıyorum:

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.

Yanıtlar:


27

Bu durumda kart her zaman aynıdır. Bir anahtar ile bir başkası arasında değişen şey "kart profili" dir.

Yani gerçekten işe yarayan çözüm:

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

Benim durumumda tüm kart profillerini şu şekilde buldum:

pacmd list-cards

Ve monitör ve dizüstü hoparlörler arasında geçiş yapabildikten sonra:

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

Ve:

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

Kartın endeksi 0 ise:

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>

Son olarak, geçişi hızlandırmak için .bashrc dosyama iki takma ad ayarladım:

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'

Bu şekilde monitörden veya kabuğa yazılan dizüstü bilgisayardan (kulaklık) gelen ses arasında geçiş yapabilirim: audio-hdmi veya audio-laptop


Hm. Şifremde 'liste kartları' seçeneği
bulunmuyor


3

Öncekileri temel alan çok küçük bir senaryo oluşturdum; bu yalnızca sesi değil video çıkışını da değiştiriyor. Ekranlar arasında geçiş yapmak için disper kullanır .

İşte kod:

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

Benim için özellikle yararlı çünkü ekranları klonlamayı sevmiyorum. Ben birini ya da diğerini kullanırım. Ses profillerini kendi sisteminize uyarlamanız gerekebilir.


2

Kullanabilir, pactldaha fazla bilgi için man sayfasını okuyabilirsiniz.


2

Lukas'ın python betiği ( yukarıda belirtilen https://github.com/lkettenb/sound-output-switcher ) bir bildirim uygulaması uygulamasını uygulamak için iyi sonuç verir. Appindicator paketine ihtiyacı var. İle yüklenebilir

sudo apt-get install python-appindicator

3
Lütfen cevabınıza betiğin ne olduğunu ve neden kullanışlı olduğunu açıklayan en az birkaç kelime ekleyin.
derobert,


0

Ben söylediğim gibi burada (muhtemelen yinelenen), alternatif Ses Switcher Göstergesi (ki requieres bir PPA ekleme):

Bir satırda

Benim durumumda oldu hdmi-stereo-extra1+inputolacağını tek satırda böylece profili: [[ $(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".

Bir kullanabilirsiniz özel bir kısayol ile çalıştırmak için bash -c(diğer kısayol ile herhangi bir çelişki olması durumunda sizi uyarır):

görüntü tanımını buraya girin

Ayrıca bir de ekleyebilirsiniz aliasadresinden Müşteri .bashrc.

Bir komut dosyasında

@ User829996 (ve burada @ user56655) yanıtına dayanarak bazı değişiklikler yaptım:

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

Aşağıdakileri yapan python komut dosyasını oluşturdum

  1. Kimlikten bağımsız olarak varsayılan cihazı listedeki bir sonraki cihaza (etrafına sararak) getirin
  2. Çalışan tüm uygulamaları bu cihaza taşır.
  3. GUI'ye cihaz adı ile bir bildirim gönderir.
#!/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)

Komut dosyasına bir klavye kısayolu atandı ve hayatım şimdi mutlu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.