在 KDE 中快速更改音訊設備

在 KDE 中快速更改音訊設備

我最近從 Windows 切換到 O​​penSUSE(有 KDE),而且我仍在經歷學習曲線。

我經常在使用內建麥克風的耳機、使用顯示器的內建揚聲器和網路攝影機的麥克風之間切換。透過 KMix 使用 Phonon 選單(下面的範例),我可以重新排列設備,將我想要使用的設備放在頂部,但我更希望能夠使用熱鍵來完成此操作,類似於這音訊切換器應用程式在 Windows 上運行。當我這樣做時,我還想將主通道設定為新通道,以便我可以輕鬆調整音訊。

在此輸入影像描述

有沒有辦法透過某些腳本允許我(a)動態選擇新的預設音訊播放和音訊錄製設備,(b)同時也將主通道設定為同一播放設備(c)使用熱鍵或桌面上還有其他快速方法嗎?

答案1

大多數 GUI 套件使用相同的後端 PulseAudio。用於pactl編寫控制腳本。

NAME
       pactl - Control a running PulseAudio sound server

DESCRIPTION
       pactl can be used to issue control commands to the PulseAudio sound server.

       pactl only exposes a subset of the available operations. For the full set use the pacmd(1).

來源: man pactl

  1. 檢查可用的輸出接收器

    $ pactl list short sinks
    0   alsa_output.pci-0000_01_00.1.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    1   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    
  2. 檢查可用的輸入來源

    $ pactl list short sources
    0   alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor    module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    1   alsa_output.pci-0000_00_1b.0.analog-stereo.monitor  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    2   alsa_input.pci-0000_00_1b.0.analog-stereo   module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    
  3. 檢查預設值

    $ pactl info
    Server String: /run/user/1000/pulse/native
    Library Protocol Version: 30
    Server Protocol Version: 30
    Is Local: yes
    Client Index: 2
    Tile Size: 65472
    User Name: user
    Host Name: userpc
    Server Name: pulseaudio
    Server Version: 6.0
    Default Sample Specification: s16le 2ch 44100Hz
    Default Channel Map: front-left,front-right
    Default Sink: alsa_output.pci-0000_00_1b.0.analog-stereo
    Default Source: alsa_input.pci-0000_00_1b.0.analog-stereo
    
  4. 設定預設值

    pactl set-default-source id-or-name
    pactl set-default-sink id-or-name
    

    例子:

    pactl set-default-source alsa_input.pci-0000_00_1b.0.analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    

    或者:

    pactl set-default-source 2
    pactl set-default-sink 1
    

筆記:

  • 這只會影響新的流,您必須移動當前正在運行的流,因此使用:

    pacmd move-sink-input <stream-id> <sink-id/name>
    

    複製的好例子:當 HDMI 插入筆記型電腦時切換到 HDMI 音訊 (14.04)

  • 有些卡有多個可切換端口,可能您想要的端口不是預設端口。

    檢查可用連接埠:

    $pactl list sinks
    Sink #1
        State: RUNNING
        Name: alsa_output.pci-0000_00_1b.0.analog-stereo
        Description: Built-in Audio Analog Stereo
        Driver: module-alsa-card.c
        ...
        Ports:
            analog-output-speaker: Speakers (priority: 10000, not available)
            analog-output-headphones: Headphones (priority: 9000, available)
        Active Port: analog-output-headphones
        Formats:
            pcm
    ...
    

    設定它:

    pactl set-sink-port <sink-id/name> <port-name>
    

    例子:

    pactl set-sink-port 1 analog-output-headphones
    

更改主通道

下列的本教程qdbus,您可以使用以下方式設定主通道:

  1. 使用以下命令尋找每個裝置的主混音器。首先手動將主通道設定為您要檢查的通道,然後執行命令:

    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.currentMasterControl
    
  2. 使用該命令的結果和您希望控制的音訊接收器,使用以下語法來更改您的主通道:

    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.setCurrentMaster "[insert Mixer]" "[insert sink]" 2>&1 > /dev/null
    
  3. 最後,將所有當前音訊切換到新通道、將其設定為預設通道並將其設定為主通道的腳本如下所示:

    #!/bin/bash
    pactl set-default-sink alsa_output.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-stereo
    pactl set-default-source alsa_input.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-mono
    INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-stereo &> /dev/null; done
    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.setCurrentMaster "PulseAudio::Playback_Devices=:1" "alsa_output.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-stereo" 2>&1 > /dev/null
    

答案2

謝謝這個答案我終於找到了解決方案,請參考下面的說明

始終顯示混合中的 HDMI 輸出 我們將建立一個連結「模擬音訊」和「HDMI 音訊」這兩個設定檔的新設定檔。

據我了解,該文件 /usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf列出了 Alsa 和 Pulseaudio 之間的所有映射配置。

1.
Analog profile找到與 您的定義相關的映射HDMI profile。 (描述:應該匹配設備設定檔顯示在音訊音量Kde設定模組)

對我來說有以下幾點:

[Mapping analog-stereo]
device-strings = front:%f
channel-map = left,right
paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2
paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic
priority = 10

[Mapping hdmi-stereo-extra1]
description = Digital Stereo (HDMI 2)
device-strings = hdmi:%f,1
paths-output = hdmi-output-1
channel-map = left,right
priority = 2
direction = output

2.
在上述映射定義的基礎上,我建立了以下新設定文件,將上述設定檔分組:

[Profile output:analog-stereo+output:hdmi-stereo-extra1]
description = All
output-mappings = analog-stereo hdmi-stereo-extra1
input-mappings = analog-stereo

3.
使用以下命令重新啟動脈衝音訊:

pulseaudio --kill; sleep 1; pulseaudio --start

4.
前往 KDE 聲子設定 > 音訊硬體設定並選擇新的設定檔。 攪拌機中有 2 個配置文件

現在您應該可以看到混合的兩個配置文件,這樣您就可以輕鬆切換:

HDMI 現在始終顯示在混音器中
我建議使用這種等離子體混合器:https://store.kde.org/p/1100894/

(額外步驟)強制啟用兩個輸出

如果您不介意同時讓電腦揚聲器和電視輸出音訊(所以基本上您不必切換音訊輸出)。

您可以選擇以下設置,然後您將在混音器中看到一個新條目

在此輸入影像描述

答案3

根據先前的評論,我編寫了以下腳本並將其綁定到熱鍵,以便在 KDE Plasma 中使用以在兩個音訊設備之間切換。我喜歡控制我的音訊來源,而不是完全自動化這個過程。

根據需要更改您的音訊設備。用於pactl list short sinks確定您的設備。

#!/bin/bash

# Audio sinks
HEADSET='alsa_output.usb-Corsair_Corsair_VOID_PRO_Wireless_Gaming_Headset-00.analog-stereo'
SPEAKERS='alsa_output.pci-0000_1f_00.3.analog-stereo'

# Get current audio sink
CURRENTDEV=$(pactl list short sinks | grep RUNNING | awk {'print $2'})

# Determine our next audio sink
if [[ "$CURRENTDEV" == "$HEADSET" ]]; then
    NEXTDEV=$SPEAKERS
else
    NEXTDEV=$HEADSET
fi

# Set our default device
pactl set-default-sink $NEXTDEV

# Move current streams (dont check for null, if null you wont see heads up display of audio change)
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
for i in ${INPUTS[*]}; do pacmd move-sink-input $i $NEXTDEV &> /dev/null; done

答案4

我到處搜尋...我沒有找到...我用python做了一個腳本,使用它)

import os
speakers = []
st = 0
au = os.popen("pacmd list-sinks")
audiotm = au.read()
audio = list(audiotm.split())
indices = [i for i, x in enumerate(audio) if x == "name:"]
for num in range(len(indices)):
    speakers.append(audio[indices[num]+1])
for num in range(len(speakers)):
    speakers[num] = speakers[num][1:len(speakers[num])-1]
dir = os.path.abspath(__file__)
dir = dir[:-5]
try: f = open(dir + "lststate.txt","r");st = int(f.read()) ;f.close();
except:f = open(dir + "lststate.txt","w");f.write(str(st)); f.close();
if st == len(speakers): st = 0;
OUT = speakers[st]
st += 1
f = open(dir + "lststate.txt","w");f.write(str(st)); f.close();
z = os.popen("pactl list short sink-inputs")
OUTID = z.read().split()
x = os.popen("pacmd set-default-sink " + OUT)
for num in range(0,len(OUTID),7):
    y = os.popen("pactl move-sink-input " + OUTID[num] + " " + OUT)
exit()

相關內容