如何使用外壳在不同的音频输出硬件之间切换?


33

我将笔记本电脑与带有扬声器的外接显示器一起使用。通过HDMI连接显示器时,我可以在笔记本电脑的正常音频输出和显示器输出之间切换(使用GUI:声音设置->硬件)。

我花了很多时间重复这个过程,我开始怀疑我是否可以自动化它,或者无论如何,可以使用Shell以更快的方式执行它。

我的发行版是带有gnome 3的Ubuntu 12.04。

编辑:

我尝试使用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.

Answers:


27

在这种情况下,卡总是相同的。交换机和另一个之间的更改是“卡配置文件”。

因此,实际有效的解决方案是:

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'

通过这种方式,我可以在显示器的音频或在外壳中键入笔记本电脑(耳机)的音频之间进行切换:audio-hdmi或audio-laptop


嗯 我的pacmd没有“列表卡”选项...
ka3ak


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,阅读其手册页以获取更多信息。




0

正如我在这里所说的(可能是重复的),是Sound Switcher Indicator的替代品(要求添加PPA):

一行

就我而言,是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

我创建了以下python脚本,该脚本执行以下操作:

  1. 将默认设备切换到列表中的下一个设备(带有回绕),而不考虑ID的
  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)

为脚本分配了键盘快捷键,现在我的生活很幸福

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.