Schnelles Ändern des Audiogeräts in KDE

Schnelles Ändern des Audiogeräts in KDE

Ich bin vor Kurzem von Windows auf OpenSUSE (mit KDE) umgestiegen und bin immer noch in der Lernphase.

Ich wechsle ziemlich häufig zwischen der Verwendung meiner Kopfhörer mit eingebautem Mikrofon und der Verwendung der eingebauten Lautsprecher meines Monitors und des Mikrofons meiner Webcam. Über das Phonon-Menü über KMix (Beispiel unten) kann ich die Geräte neu anordnen, um das gewünschte Gerät oben zu platzieren, aber ich würde es lieber mit einem Hotkey tun können, ähnlich wie beiAudio-UmschalterAnwendung unter Windows. Wenn ich das mache, möchte ich auch den Master-Kanal auf den neuen einstellen, damit ich den Ton einfach anpassen kann.

Bildbeschreibung hier eingeben

Gibt es eine Möglichkeit über ein Skript, das es mir ermöglicht, (a) spontan ein neues Standardgerät für die Audiowiedergabe und -aufzeichnung auszuwählen und (b) gleichzeitig den Masterkanal auf dasselbe Wiedergabegerät einzustellen (c) und zwar über einen Hotkey oder eine andere schnelle Methode auf dem Desktop?

Antwort1

Die meisten GUI-Kits verwenden dasselbe Backend PulseAudio. Verwenden Sie es pactlzum Schreiben von Steuerskripten.

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

Quelle: man pactl

  1. So überprüfen Sie die verfügbaren Ausgabesenken

    $ 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. So prüfen Sie die verfügbaren Eingabequellen

    $ 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. So überprüfen Sie die Standardeinstellungen

    $ 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. So legen Sie den Standardwert fest

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

    Beispiel:

    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
    

    oder:

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

Anmerkungen:

  • Dies wirkt sich nur auf neue Streams aus. Sie müssen die aktuell laufenden Streams verschieben. Verwenden Sie daher:

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

    Schönes Beispiel zum Abschreiben:Umschalten auf HDMI-Audio, wenn HDMI an einen Laptop angeschlossen ist (14.04)

  • Manche Karten haben mehrere umschaltbare Ports. Möglicherweise ist der gewünschte Port nicht der Standardport.

    Suchen Sie nach verfügbaren Ports:

    $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
    ...
    

    So legen Sie es fest:

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

    Beispiel:

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

So ändern Sie den Master-Kanal

Gefolgtdieses Tutorialkönnen Sie den Masterkanal qdbuswie folgt einstellen:

  1. Suchen Sie mit dem folgenden Befehl den Master-Mixer für jedes Ihrer Geräte. Stellen Sie zunächst den Master-Kanal manuell auf den Kanal ein, den Sie überprüfen möchten, und führen Sie dann den Befehl aus:

    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.currentMasterControl
    
  2. Verwenden Sie das Ergebnis dieses Befehls und den Audio-Senk, den Sie steuern möchten, und ändern Sie mit der folgenden Syntax Ihren Masterkanal:

    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.setCurrentMaster "[insert Mixer]" "[insert sink]" 2>&1 > /dev/null
    
  3. Am Ende sieht das Skript zum Umschalten des gesamten aktuellen Audios auf einen neuen Kanal, zum Festlegen als Standard und zum Einstellen als Masterkanal wie folgt aus:

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

Antwort2

Dank andiese AntwortIch habe endlich eine Lösung gefunden, siehe die Anleitung unten

Im gemischten Modus immer den HDMI-Ausgang anzeigen Wir werden ein neues Profil erstellen, das die beiden Profile „Analog-Audio“ und „HDMI-Audio“ verknüpft.

Meines Wissens nach /usr/share/pulseaudio/alsa-mixer/profile-sets/default.conflistet diese Datei alle Mapping-Profile zwischen Alsa und Pulseaudio auf.

1.
Analog profileSuchen Sie die Zuordnung, die zu Ihrer Definition passt HDMI profile. (Beschreibung:sollte übereinstimmen mitGeräteprofilegezeigt inLautstärkeKde-Einstellungsmodul)

Für mich sind folgende dabei:

[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.
Auf der Grundlage der obigen Mapping-Definition habe ich das folgende neue Profil erstellt, das die beiden oben genannten gruppiert:

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

3.
Starten Sie Pulse Audio mit diesem Befehl neu:

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

4.
Gehen Sie zu den KDE-Phonon-Einstellungen > Audio-Hardware-Setup und wählen Sie das neue Profil aus. 2 Profile im Mixer

Nun sollten beide Profile im gemischten Modus angezeigt werden und Sie können ganz einfach wechseln:

HDMI wird jetzt immer im Mixer angezeigt
Ich würde vorschlagen, diesen Plasmoid-Mixer zu verwenden:https://store.kde.org/p/1100894/

(zusätzlicher Schritt) Erzwingen Sie die Aktivierung beider Ausgänge

Wenn es Ihnen nichts ausmacht, wenn sowohl der Computerlautsprecher als auch der Fernseher gleichzeitig Ton ausgeben (Sie müssen den Audioausgang also im Grunde nie umschalten).

Sie können die folgende Einstellung auswählen und dann haben Sie einen neuen Eintrag im Mixer

Bildbeschreibung hier eingeben

Antwort3

Aufbauend auf vorherigen Kommentaren habe ich das folgende Skript geschrieben und es an einen Hotkey gebunden, der in KDE Plasma verwendet werden kann, um zwischen meinen beiden Audiogeräten umzuschalten. Ich habe lieber die Kontrolle über meine Audioquelle, als diesen Prozess vollständig zu automatisieren.

Ändern Sie Ihre Audiogeräte nach Bedarf. Verwenden Sie, pactl list short sinksum Ihre Geräte zu bestimmen.

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

Antwort4

Ich habe überall gesucht ... ich habe nichts gefunden ... Ich habe ein Skript in Python erstellt, verwenden Sie es)

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

verwandte Informationen