KDE에서 오디오 장치를 빠르게 변경

KDE에서 오디오 장치를 빠르게 변경

저는 최근에 Windows에서 OpenSUSE(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.confAlsa와 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

삼.
다음 명령을 사용하여 펄스 오디오를 다시 시작하십시오.

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

4.
KDE 포논 설정 > 오디오 하드웨어 설정으로 이동하여 새 프로필을 선택하십시오. 믹서의 프로필 2개

이제 두 프로필이 혼합되어 표시되므로 쉽게 전환할 수 있습니다.

이제 HDMI가 항상 믹서에 표시됩니다.
나는 이 플라스모이드 믹서를 사용하는 것을 제안합니다:https://store.kde.org/p/1100894/

(추가 단계) 두 출력을 강제로 활성화합니다.

컴퓨터 스피커와 TV 출력 오디오를 동시에 사용하는 것이 마음에 들지 않는다면(따라서 기본적으로 오디오 출력을 전환할 필요가 없습니다).

아래 설정을 선택하면 믹서에 새 항목이 생깁니다.

여기에 이미지 설명을 입력하세요

답변3

이전 의견을 바탕으로 다음 스크립트를 작성하고 KDE 플라즈마에서 두 오디오 장치 사이를 전환하는 데 사용할 단축키에 바인딩했습니다. 저는 이 프로세스를 완전히 자동화하는 대신 오디오 소스를 제어하는 ​​것을 좋아합니다.

오디오 장치를 적절하게 변경하십시오. 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

여기저기 찾아봤는데... 못찾았어요... 파이썬으로 스크립트를 만들어서 사용했어요)

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()

관련 정보