Pulseaudio loopback décharger les périphériques de sortie audio

12

J'essaie de savoir comment décharger les sorties de bouclage pulseaudio. J'utilise pulseaudio pour créer un mixage en boucle pour capturer mon microphone et l'audio du système pour le streaming. Chaque fois que je lance mon script contenant ce code:

pactl load-module module-null-sink sink_name=mix 
pactl load-module module-loopback sink=mix
pactl load-module module-loopback sink=mix

avconv ...

pactl unload-module module-loopback

il laisse deux périphériques de sortie derrière lui après sa fermeture. La commande unload-module supprime l'enregistrement mais je ne trouve pas de commande pour les sorties.

AkBKukU
la source

Réponses:

17

La manière appropriée de décharger les modules

Le déchargement d'un module chargé dans Pulse Audio se fait par le numéro d'index du module, qui est donné lors du chargement:

pactl load-module module-null-sink sink_name=test
24

Dans l'exemple ci-dessus, le serveur Pulseaudio a chargé le module avec l'ID d'index 24. Ce module peut être déchargé avec la commande suivante:

pactl unload-module 24

Votre script devra analyser la sortie de pactl.

Dans le cas où nous ne connaissons pas le numéro de module, nous pouvons émettre la commande suivante qui affichera le numéro et le nom du module:

pactl list short modules

Les versions plus récentes permettent également le déchargement par nom:

pactl unload-module <name>

La méthode rapide et sale

Si pulseaudio est configuré comme un démon à génération automatique (qui devrait être le mendiant par défaut), nous pouvons rapidement décharger tous les modules chargés après la connexion avec une réinitialisation du serveur PulseAudio pour charger les modules par défaut définis dans notre default.paen exécutant:

pulseaudio -k

Cela déchargera efficacement tous les modules de votre script et chargera le récepteur par défaut pour la sortie.

Takkat
la source
Il convient de mentionner que toutes les applications ne se remettront pas de la coupure de leurs flux.
Aurelia
Obtenez le numéro de module par nom de récepteur: MODULE_NUMBER=$(pacmd list-sinks | grep -E "^\s*name:|^\s*module:" | grep -A 1 -E "^\s*name: <MY-SINK-NAME>" | grep -oP "module: \K[0-9]+")MY-SINK-NAMEest ce qu'il dit. Gardez le < >dans le code!
KrisWebDev
1
@KrisWebDev: merci, a ajouté une ligne sur la façon d'obtenir des indices de module pour une approche plus générale.
Takkat
Grand, alors cela devient: pactl list short modules | grep "sink_name=MY-SINK-NAME" | cut -f1 | xargs -L1 pactl unload-module. Il a l'avantage de supprimer TOUS les modules nommés MY-SINK-NAME(les noms de récepteurs ne sont pas uniques).
KrisWebDev