Wie kann ich die richtigen Pulseaudio-Profile anzeigen, ohne Pulseaudio neu zu starten?

10

Manchmal verschwindet mein USB-Headset-Mikrofon aus meiner Liste der Eingabegeräte. Das erneute Anschließen des Headsets funktioniert nicht, das Beenden von Pulseaudio jedoch:

pulseaudio -k

Wenn Pulseaudio wieder gestartet wird, wird mein USB-Headset sowohl unter den Eingabe- als auch unter den Ausgabegeräten angezeigt und funktioniert einwandfrei.

Das Problem ist, dass das Beenden von Pulseaudio auch alle Anwendungen zum Absturz bringt oder sie ohne Ton belässt. Dies bedeutet, dass ich Skype, Steam, XChat, jeden laufenden Videoplayer (SMPlayer stürzt ab), alle laufenden Spiele usw. neu starten muss.

Gibt es eine Möglichkeit, das Neuladen aller Geräte zu erzwingen, ohne die laufende Instanz von Pulseaudio zu beenden?


Interessanterweise wird beim erneuten Anschließen des Headsets nur das Ausgabegerät angezeigt, wenn ich mein USB-Headset durch Neustart von Pulseaudio zum Laufen bringe. Ich muss Pulseaudio mit angeschlossenem Headset neu starten, damit das Eingabegerät angezeigt wird.


Bearbeiten: Aktiviert pavuvontrolunter "Konfiguration":

Bildschirmfoto

Nach dem Neustart von Pulseaudio ist ein zusätzliches Profil mit der Endung "+ Digital Stereo Input" (oder ähnlichem) in der Liste verfügbar und standardmäßig ausgewählt.

Hubro
quelle

Antworten:

7

Ich habe eine Weile mit dem gleichen Problem gelitten und hatte endlich die Gelegenheit, es mir anzusehen. Es stellt sich heraus, dass das Entladen und Neuladen des für das Audiogerät verantwortlichen Pulseaudio-Moduls für mich funktioniert.

Entladen und Nachladen des Moduls von Hand

Geben Sie im Terminalfenster den Befehl ein

pacmd list-cards

Suchen Sie in der Ausgabe das Audiogerät, dem Profile fehlen. Sie werden wahrscheinlich mehrere Karten erhalten und müssen die richtige finden. Meins sieht so aus:

[...]
index: 8
    name: <alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset>
    driver: <module-alsa-card.c>
    owner module: 27
    properties:
            alsa.card = "1"
            alsa.card_name = "Logitech USB Headset"
            [... more output ...]
[...]

Schlagen Sie in Ihrer Ausgabe die Zeile " Besitzermodul " nach. Das ist das Modul, das Sie entladen müssen, aber Sie müssen zuerst die Parameter überprüfen, damit Sie es neu laden können. Befehl eingeben

pacmd list-modules

und suchen Sie das Modul, das Ihre Karte steuert. Wiederum sieht der relevante Teil der Ausgabe in meinem Fall so aus ( Index stimmt mit dem Besitzermodul aus der Ausgabe von Pacmd-Listenkarten überein ):

[...]
index: 27
    name: <module-alsa-card>
    argument: <device_id="1" name="usb-Logitech_Logitech_USB_Headset-00-Headset" card_name="alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1">
    used: 2
    load once: no
    properties:
    [... more output ...]
[...]

Sie benötigen den Modulnamen und die Argumente, um es neu zu laden.

Geben Sie zum Entladen des Moduls den Befehl ein (ersetzen Sie den Modulindex durch den entsprechenden Wert aus Ihrer Ausgabe).

pacmd unload-module module-index

Geben Sie den Befehl ein, um das Modul nach dem Entladen neu zu laden

pacmd load-module module-name module-arguments

Ersetzen Modul-Namen und Modul-Argumente mit den Werten aus Ausgabe von pacmd list-Module . Lassen Sie die spitzen Klammern weg.

Jetzt sollte das Modul neu geladen werden und mit etwas Glück sind Ihre Headset-Profile wieder da.

Automatisierung anwenden

Die oben genannten Schritte sind eine Menge Arbeit, wenn Sie Ihr Gerät häufig zurücksetzen müssen, da sich der Modulindex ständig ändert und Sie ihn jedes Mal nachschlagen müssen. Ich habe ein Shell-Skript für mich geschrieben, um das Schlimmste zu automatisieren:

#!/bin/bash

if [ -z "$1" ]; then
  echo "Pulseaudio has these cards:"
  pacmd list-cards | grep 'name: '
  exit 0
fi

MODULE_INDEX=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'index:' | head -n 1 | cut -d ':' -f 2 | tr -d ' '`
MODULE_NAME=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'name:' | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
MODULE_ARGUMENTS=`pacmd list-modules | tac | grep -e "argument: .*$1" | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
echo "Module index is $MODULE_INDEX"
echo "Module name: $MODULE_NAME"
echo "Module args: $MODULE_ARGUMENTS"

if [ -z "$MODULE_INDEX" ]; then echo "Could not find module index"; exit 0; fi
if [ -z "$MODULE_NAME" ]; then echo "Could not find module name"; exit 0; fi
if [ -z "$MODULE_ARGUMENTS" ]; then echo "Could not find module arguments"; exit 0; fi

echo "Unloading module"
pacmd unload-module $MODULE_INDEX
echo ""
echo "Reloading module"
pacmd load-module $MODULE_NAME $MODULE_ARGUMENTS
echo ""

Wenn das Skript ohne Argumente ausgeführt wird, listet es die Karten auf, die Pulseaudio kennt. Wenn ein Teil des Kartennamens als Argument angegeben wird, versucht das Skript, das entsprechende Pulseaudio-Modul zu entladen und neu zu laden.

Saft
quelle
Verdammt gute Antwort. Ich werde dies so schnell wie
möglich
Das ist mir heute wieder passiert und ich habe Ihre Lösung ausprobiert. Es hat perfekt funktioniert ! Auch Ihr erster Schritt ist überflüssig. Die Modulargumente im zweiten Schritt identifizieren das Headset. Ich werde ein schnelles Python-Skript erstellen, das dies vollständig automatisiert.
Hubro
Es ist jetzt 1,5 Jahre später und ich habe nie ein Drehbuch dafür gemacht. Bevor ich mir Zeit dafür nahm, wurde das Problem anscheinend durch ein Systemupdate behoben. Ich habe dieses Problem bis heute nicht mehr gehabt.
Hubro
Wer liefert die Profile für Pulseaudio-Karten? Ist es behoben und kann nicht geändert werden, oder gibt es eine Möglichkeit, eigene Profile für eine Karte zu schreiben?
CMCDragonkai
1
Denn wenn Sie dies tun, flippen alle Anwendungen, die pulseaudio (und damit Ihre Geräte) verwendet haben, aus und müssen neu gestartet werden, was sehr schmerzhaft ist.
Lingfish