在模拟立体声输出和HDMI音频输出之间切换的快捷方式


18

要切换到(显示器的)HDMI音频输出并从系统音频插孔恢复到正常的音频输出(对于耳机,因为我的显示器没有音频输出),我发现自己每次都打开声音偏好设置并选择正确的声道。有什么办法可以在面板上创建切换按钮或分配一些快捷键来切换,因为我经常进行切换。

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

在此处输入图片说明


1
+1如果我能一键切换到正确的HDMI显示输出模式和声音模式,那就太棒了。
Kit Menke

更好的是,当它检测到该HDMI / Display Port音频通道时会自动切换它。这就是对接的目的。我似乎记得不久前有一些对接代码,它们会根据某些硬件ID(MAC)更改配置。有人知道又叫什么吗?
伊利亚·林恩2014年

Answers:


10

使用pulseaudio,我们可以从命令行选择输出接收器:

pacmd set-default-sink "SINKNAME"

此命令可以在启动器,脚本中使用,甚至可以分配给键盘快捷方式,以在不同的接收器之间快速切换。请用您想要的接收器的名称或编号替换“ SINKNAME”。该命令列出了已知接收器及其相关的编号和名称:

pacmd list-sinks

注意:仅当禁用流目标设备读取时,才能通过命令行界面更改输出接收器。这可以通过将相应的行编辑/etc/pulse/default.pa为:

load-module module-stream-restore restore_device=false

或者,我们可以运行pulseaudio以同时将声音输出到内部音频设备和hdmi设备,方法是运行带有添加虚拟输出设备选项的paprefs

纸浆


2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"并且pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"仅在“声音首选项”中选择了相应的配置文件后才能工作。如果设置了HDMI并运行了pacmd命令以进行模拟立体声,Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.则会出现错误。但是,如果我从“声音首选项” GUI中手动选择配置文件并运行相同的命令,则不会收到错误消息。因此,它无助于切换。
iJeeves

@iJeeves:请参阅编辑以进行更新。
塔卡特2011年

类似的问题。如果我运行该命令,它将在视觉上在GUI中进行更改,但声音不会重定向。我必须在GUI中手动切换它才能正常工作。有任何想法吗?
伊利亚·林恩

1
@ElijahLynn:您可能还需要移动流:askubuntu.com/questions/71863/...
Takkat

@Takkat:我还没有尝试过,但这似乎是我遇到的确切问题。非常感谢!
伊利亚·林恩2014年

7

我发现这很烦人,并编写了一个脚本来切换输出:

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo+input:analog-stereo>" ] ; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
else 
        pacmd set-card-profile 0 "output:hdmi-stereo+input:analog-stereo"        
fi

然后在键盘上绑定一个未使用的键来执行它(请参阅如何将自定义命令绑定到键盘快捷键?


尽管您已经18个月没有登录了,只是想让您知道这是最好的答案IMO +1
WinEunuuchs2Unix

如果我需要在两张卡之间切换,而不仅仅是一张卡的两个配置文件,该怎么办?
Oebele'7

2

另一个接收器切换脚本

在Ubuntu 16.04上测试


但是,这一功能仅允许您切换所需应用程序的音频。

用法:集中您要更改其接收器的应用程序并运行此脚本。而已!!!

此脚本检测正在关注的应用程序,找到从中播放的所有音频,然后将它们切换到下一个可用的接收器。

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

解释脚本

我们需要重点找到应用程序的PID

但是首先我们需要

xprop -root _NET_ACTIVE_WINDOW 

然后将其插入此处$xid以获取应用程序的pid

xprop -id $xid _NET_WM_PID

现在我们需要找到与该PID相关的接收器输入

首先让我们线性化命令的输出以在 pacmd list-sink-inputs每行列出一个接收器输入,在同一行上显示其索引,接收器和PID

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

让我们逐步分析它:

grep -E 'index:|sink:|process.id只保留包含线index:sink:process.id

tr '\n' ' ' 连接所有行

tr -d '"'删除所有"字符。需要没有引号的pid

sed -e 's/index:/\n/g'index:换行符替换所有出现的字符\n

tail -n +2 删除第一行,因为它是空的

结果是这样的:

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

让我们分析一行以了解其含义:

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182是接收器输入索引,0是接收器索引,13752最后是所属应用程序的pid

然后我们遍历每一行

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

最后仅过滤与焦点应用的pid匹配的接收器输入的pid

  if [ $sink_input_pid = $app_pid ]; then

提取数据

有了awk我们就可以获得我们需要的元素

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

获取接收器的数量,以了解接收器的旋转何时应从0重新开始。

sink_list_size=${#sink_list_array[@]}

找到下一个接收器,我们必须遍历接收器列表,知道哪个匹配current_sink_index并知道下一个接收器的索引。

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

最后,我们将接收器输入移至next_sink_index

pacmd move-sink-input $sink_input_index $next_sink_index

在Ubuntu 16.04上的注意事项:

配置快捷键时,我无法使其与ubuntu的快捷键管理器一起使用。所以我必须安装compizconfig-settings-manager

sudo apt-get install compizconfig-settings-manager

+1是新用户的绝佳首选。由于最初的问题是针对Ubuntu 11.04的,因此您应该指出测试了哪个版本。
WinEunuuchs2Unix '02

@ WinEunuuchs2Unix哇!谢谢 :)。我在标题下方添加了Ubuntu的版本。
Madacol '02


1

由于屏幕截图中仅显示一个声卡,因此我认为应该切换此声卡的输出

例如:我有一个带有一个集成声卡的笔记本,但是在对接时它具有数字输出(SPDIF)。

因此,我想做的是在pulseaudio中切换活动输出或“ Profile”。

我发现了执行此操作的命令:

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

我为所需的输出设置(在此为数字输出,但为模拟(微)输入)获得正确名称的做法是:

pacmd list | grep output

1

我也一直试图找到解决该问题的方法。从Ubuntu 11.04开始,这似乎不可能直接实现,我仅发现本指南将HDMI和Analog都添加为单独的输出,因此pacmd现在显示3个接收器。然后可以使用上述命令在接收器之间切换。(另请参阅

但是显然,Ubuntu 11.11将获得带有Jack检测系统的PulseAudio。根据下面的网站,David Henningsson通过udev对检测进行了编码,因此脉冲音频会自动切换到最后添加的输出,包括在同一声卡的不同配置文件之间进行切换(就像您和我的设置一样)。(请参阅此处

因此,我希望当下周五尝试最终版本时,此方法将起作用。


1

基于先前的许多答案,我编写了一个脚本,该脚本设置播放接收点在可用接收点之间交替。

最好的使用方法是创建一个键盘快捷方式来运行它,因此,每当您按下该组合键时,音频就会重定向到下一个可用的接收器。

可以在这里找到代码:https : //gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

就我而言,模拟选项不在列表中。安装pavucontrol: sudo apt install pavucontrol

通过启动应用程序可以解决此问题:

  1. 输入以下内容,通过终端启动应用程序:(pavucontrol输入)
  2. 转到“配置”标签。
  3. 在Intern Sound选择Analoge立体声输出配置文件

在此处输入图片说明

现在,我可以在这里听起来并选择其他配置文件(在Linux Mint下):

在此处输入图片说明


0

声音切换器指示器(需要添加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"

您可以使用自定义快捷方式gnome-control-center keyboard)执行该操作bash -c(如果与其他快捷方式有任何冲突,则会发出警告):

屏幕截图

屏幕截图

我用:

  • Super + Alt + o:在耳机和HDMI之间切换输出。
  • Super + Alt + Up:调高音量
  • Super + Alt + Down:降低音量

你也可以添加alias到您的.bashrc

在Ubuntu 16.04和18.04上测试


如果您不想超出脚本的行为,我将基于@ user829996进行一些更改:

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

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.