web-dev-qa-db-fra.com

Pulse Audio ne fonctionne pas après la reprise

Hy, After Suspend - Resume Sound Les applications continuent de jouer, mais il n'y a pas de son.

Je dois émettre (dans un Shell)

/usr/bin/pasuspender /bin/true

alors le son est de nouveau là.

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

pulseaudio -k 

Les deux commandes sont décrites ici:

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

Le problème est donc:

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

/etc/systemd/system/[email protected]

après suspension, cela ne fonctionne pas. J'ai donc installé un CV de script dans

/etc/pm/sleep.d/

comme ça:

case "$1" in
    hibernate|suspend)
            # Stopping is not required
            ;;
    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 il est trop tôt, il semble qu'il soit exécuté avant que l'audio Pulse ne soit de nouveau activé. Parce que si j'émets

/usr/bin/pasuspender /bin/true

après Reprendre dans un Shell ça marche toujours.

La question est donc:

Où mettre/usr/bin/pasuspender/bin/true pour qu'il soit exécuté très tard dans le processus de reprise? Il serait également intéressant de savoir pourquoi je dois exécuter cette commande, je ne pourrais pas savoir ce qui interrompt la lecture @Suspend.

Ubuntu: 15.10 Carte son: Xonar U7 USB

1
Peter Fleix

Je ne réponds pas à votre question sur la façon de résoudre le problème de script; cependant, je vais tenter d'expliquer pourquoi cela se produit. L'audio est un flux qui est envoyé au périphérique audio, c'est une communication à sens unique; N'attendant plus de réponse de l'appareil, une fois la cible localisée et le flux en cours. En tant que tel, il n'est pas facile de détecter lorsque le flux est interrompu, contrairement à tout flux de données bidirectionnel, lorsqu'il serait évident qu'il n'y a plus de communication; ainsi après que le flux soit interrompu, par une suspension, l'écoulement est arrêté et il perd sa cible. Cependant, il ne se rend pas compte que cela s'est produit en raison du processus de localisation cible qui ne se produit qu'au démarrage du flux; lorsque le pointeur de mémoire est initialisé.

Le travail autour est très probablement la recherche et la réinitialisation de ces emplacements de mémoire.

Pulse Audio, semble-t-il, utilise plusieurs tampons en fonction du matériel, le matériel est bien sûr la cible finale du flux. N'importe lequel de ces tampons, s'il perd le pointeur sur 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 très probable que dma se produise au cours de ce processus afin de libérer le flux de toute dépendance lourde du processeur; bien sûr en fonction de votre matériel.

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

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

1
iain