Bagaimana saya bisa beralih di antara perangkat keras keluaran audio yang berbeda menggunakan shell?

34

Saya menggunakan laptop saya dengan monitor eksternal yang memiliki speaker. Ketika monitor dipasang melalui HDMI saya dapat beralih (menggunakan GUI: Sound Setting -> Hardware) antara output audio laptop normal dan output monitor.

Saya mengulangi prosedur ini banyak waktu dan saya mulai bertanya-tanya apakah saya dapat mengotomatiskannya atau, bagaimanapun, menjalankannya dengan cara yang lebih cepat menggunakan shell.

Distro saya adalah Ubuntu 12.04 dengan gnome 3.

EDIT:

Saya mencoba menggunakan pacmd, tetapi list-sinks memberi saya hanya perangkat yang saya gunakan saat ini:

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

Setelah beralih dari GUI:

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

Dan jika saya mencoba mengubahnya, saya dapat:

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.
Luigi Massa Gallerano
sumber

Jawaban:

28

Dalam hal ini kartu selalu sama. Apa yang berubah antara sakelar dan sakelar lainnya adalah "kartu-profil".

Jadi solusi yang sebenarnya berhasil adalah:

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

Dalam kasus saya, saya menemukan semua profil kartu dengan:

pacmd list-cards

Dan setelah saya bisa beralih antara monitor dan speaker laptop dengan:

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

Dan:

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

Di mana 0 adalah indeks kartu:

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>

Dan akhirnya, untuk beralih lebih cepat, saya mengatur dua alias di file .bashrc saya:

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'

Dengan cara ini saya dapat beralih antara audio dari monitor atau dari laptop (headphone) dengan mengetikkan shell: audio-HDMI atau audio-laptop

Luigi Massa Gallerano
sumber
Hm Pacmd saya tidak memiliki opsi 'daftar kartu' ...
ka3ak
5

Saya menulis applet indikator kecil yang memungkinkan Anda mengganti output suara. Tidak ada skrip shell tetapi mungkin bermanfaat bagi Anda atau pembaca lain.

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

Tangkapan layar

Lukas
sumber
3

Saya membuat skrip yang sangat kecil berdasarkan yang sebelumnya, yang tidak hanya mengalihkan audio tetapi juga output video. Menggunakan disper untuk beralih antar tampilan.

Ini kodenya:

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

Bagi saya ini sangat berguna karena saya tidak suka mengkloning display. Saya menggunakan salah satu atau yang lain. Anda mungkin perlu menyesuaikan profil audio dengan sistem spesifik Anda.

pengguna56655
sumber
2

Anda dapat menggunakan pactl, membaca halaman manualnya untuk informasi lebih lanjut.

favadi
sumber
2

Skrip python Lukas ( https://github.com/lkettenb/sound-output-switcher , diposting di atas) untuk mengimplementasikan applet notifier berfungsi dengan baik. Perlu paket appindicator. Itu bisa diinstal dengan

sudo apt-get install python-appindicator
P.Wridge
sumber
3
Harap sertakan setidaknya beberapa kata dalam jawaban Anda yang menjelaskan apa skrip itu dan mengapa skrip itu berguna.
derobert
0

Seperti yang saya katakan di sini (mungkin duplikat), alternatif untuk Sound Switcher Indicator (yang meminta menambahkan PPA):

Dalam satu baris

Dalam kasus saya adalah hdmi-stereo-extra1+inputprofil, sehingga dalam satu baris akan: [[ $(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".

Anda dapat menggunakan pintasan khusus untuk menjalankannya bash -c(akan memperingatkan Anda jika ada konflik dengan pintasan lainnya):

masukkan deskripsi gambar di sini

Anda juga dapat menambahkan aliaske .bashrc.

Dalam naskah

Saya membuat beberapa perubahan berdasarkan jawaban @ user829996 (dan di sini @ 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
Pablo A
sumber
0

Saya membuat skrip python berikut yang melakukan hal berikut:

  1. Alihkan perangkat default ke perangkat berikutnya pada daftar (dengan membungkus) terlepas dari id
  2. Memindahkan semua aplikasi yang berjalan ke perangkat ini.
  3. Mengirim pemberitahuan ke GUI dengan nama perangkat.
#!/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)

Menugaskan pintasan keyboard ke skrip, dan hidup saya bahagia sekarang

Nimrod.s
sumber