2 votes

Le son Pulse ne fonctionne pas après la reprise

Bonjour, Après la suspension - reprise, les applications sonores continuent de fonctionner, mais il n'y a pas de son.

Je dois exécuter (dans un shell)

/usr/bin/pasuspender /bin/true

ensuite le son revient.

Cette commande fonctionne bien sûr également, mais elle interrompt la lecture (La lecture dans les applications sonores doit être redémarrée), donc je ne veux pas de cela:

pulseaudio -k

Les deux commandes sont décrites ici:

https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting (Voir "Pas de son après reprise de la suspension")

Donc le problème est:

Si je place la commande "psasuspender..." dans

/etc/systemd/system/resume-fix-pulseaudio@.service

après la suspension, cela ne fonctionne pas. Alors j'ai configuré un script de reprise dans

/etc/pm/sleep.d/

comme ceci:

case "$1" in
    hibernate|suspend)
            # L'arrêt n'est pas nécessaire
            ;;
    thaw|resume)
            /usr/bin/pasuspender /bin/true
            ;;
    *) exit $NA
            ;;
esac

Cela ne fonctionne pas non plus, dans /var/log/pm-suspend.log j'obtiens alors:

Running hook /etc/pm/sleep.d/50alsa resume suspend:
Connection failure: Connection refused
pa_context_connect() failed: Invalid argument
/etc/pm/sleep.d/50alsa resume suspend: Returned exit code 1.

Ma conclusion: Dans Systemd, le script n'est pas exécuté, je ne sais pas pourquoi. Dans /etc/pm/sleep.d, le script est exécuté, mais c'est trop tôt, il semble qu'il soit exécuté avant que PulseAudio ne soit de nouveau disponible. Car si j'exécute

/usr/bin/pasuspender /bin/true

après la reprise dans un Shell, cela fonctionne toujours.

La question est donc:

Où placer /usr/bin/pasuspender /bin/true pour qu'il soit exécuté très tard dans le processus de reprise? Ce serait également intéressant de savoir pourquoi je dois exécuter cette commande, je n'ai pas réussi à découvrir ce qui interrompt la lecture @Suspend.

Ubuntu: 15.10 Carte son: Xonar U7 USB

1voto

iain Points 49

Je ne réponds pas à votre question sur la manière de résoudre le problème du script; cependant, je vais tenter une explication sur pourquoi cela se produit. L'audio est un flux envoyé vers le périphérique audio, c'est une communication unidirectionnelle; N'attendant aucune réponse supplémentaire de l'appareil, une fois la cible localisée et que le flux est en cours. En tant que tel, il n'est pas facile de détecter quand le flux est interrompu, contrairement à un flux de données bidirectionnel, où il serait évident qu'il n'y a plus de communication; donc après l'interruption du flux par une suspension, le flux est arrêté et perd sa cible. Cependant, il ne réalise pas que cela s'est produit en raison du processus de localisation de la cible se produisant uniquement lorsque le flux est démarré; lorsque le pointeur mémoire est initialisé.

La solution de contournement consiste probablement à rechercher et à réinitialiser ces emplacements mémoire.

Pulse Audio, semble-t-il, utilise plusieurs tampons en fonction du matériel, le matériel étant bien sûr la cible finale du flux. L'un de ces tampons, s'ils perdent le pointeur vers l'emplacement mémoire, arrêtera la lecture. Voici un petit article intéressant:

http://voices.canonical.com/david.henningsson/2014/11/21/pulseaudio-buffers-and-protocol/

Il est probable que le dma se produise pendant ce processus afin de libérer le flux de toute dépendance CPU importante; bien sûr, en fonction de votre matériel.

https://en.wikipedia.org/wiki/Direct_memory_access

J'espère que cela vous aide d'une certaine manière.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X