Comment configurer le son avec PulseAudio et Multiseat?

12

Dans un esprit de divulgation complète, je viens de poster cette question sur les forums ubuntu, mais je pense que plus de têtes qui y travaillent ne pourraient pas faire de mal.

J'ai une configuration multi-sièges qui fonctionne assez bien. Les périphériques d'entrée enfichables à chaud fonctionnent comme prévu et autres. Le seul problème que je ne parviens toujours pas à résoudre est d'obtenir l'audio pour chaque siège.

Voici un résumé de mes tentatives pour faire fonctionner l'audio:

  1. Configurez dynamiquement ~ / .pulse / default.pa en fonction de $ DISPLAY auquel l'utilisateur se connecte.

  2. Chargez pulseaudio comme une instance à l'échelle du système.

    • Impossible de faire fonctionner cela. Aucun matériel audio n'était accessible aux utilisateurs.
  3. Utilisez les règles udev pour marquer les sièges dans ConsoleKit. Suivez les directives udev trouvées ici: http://www.freedesktop.org/wiki/Software/systemd/multiseat

    • Je ne pensais pas que cela fonctionnerait, bien qu'il soit "garanti" de fonctionner par quelqu'un dans irc.freenode #pulseaudio

Aucune de ces tentatives n'a abouti, c'est pourquoi je me tourne maintenant vers la communauté pour obtenir de l'aide. Il est tout à fait possible que les méthodes suggérées fonctionnent et je viens de gâcher un aspect, idk. C'est la dernière pièce du puzzle qui est nécessaire avant de pouvoir mettre à jour la page MultiseatX pour inclure des instructions pour Ubuntu 12.04.

Ma compréhension de la situation: l'accès à pulseaudio est limité à la session active comme indiqué par ConsoleKit (quelque chose sur une ACL). CK ne peut marquer qu'une session comme active à la fois. Ce simple petit fait m'amène à penser que la solution devrait impliquer que pulseaudio soit exécuté comme une instance à l'échelle du système. Chaque utilisateur doit se connecter au serveur d'impulsions et être limité à un sous-ensemble de tout le matériel. Peut-être que chaque utilisateur se connecte au serveur d'impulsions via localhost, idk. Je sais que quelles que soient mes tentatives et leurs résultats infructueux, j'ai toujours pu utiliser sudo aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Center.wavpour jouer quelque chose à n'importe quel matériel.

Je saisis les pailles et je suis maintenant aux derniers poils que je peux tirer de ma tête. S'il vous plaît, aidez-moi à comprendre cela afin que nous puissions partager la richesse. Toute information supplémentaire nécessaire sera fournie à votre demande.

Anthony
la source
Ai-je bien compris: c'est 2 places 2 cartes son? Avez-vous remplacé default.pa par les minuscules fichiers personnalisés ou avez-vous ajouté les lignes personnalisées au default.pa autrement inchangé?
Takkat
J'aurais aimé avoir remarqué le commentaire ici ... Alors oui, c'est 2 cartes son. L'un est l'audio intégré, l'autre est l'audio du HDMI dans le GPU. Les minuscules fichiers personnalisés sont dans ~ / .pulse mais /etc/pulse/default.pa est intact. Donc, dans ce cas, si je comprends bien, le ~ / .pulse / default.pa ne remplacera pas /etc/pulse/default.pa, mais fusionnera plutôt avec.
Anthony
Essayez avec deux fichiers .pa personnalisés avec le contenu complet du default.pa où la section de périphérique différente comme dans les deux fichiers existants est ajoutée (au cas où ils ne seraient pas fusionnés).
Takkat
De plus, le fichier default.pa lu par pulseaudio exécuté en mode système devrait être dans /etc/pulse, pas dans HOME.
Takkat
je l'ai principalement travaillant atm. Je ferai rapport quand j'aurai tout résolu.
Anthony

Réponses:

7

J'ai passé de nombreuses heures à rechercher en ligne, à tester différentes configurations et à parler aux développeurs de Pulseaudio. L'essentiel est que l'exécution de pulseaudio en mode utilisateur normal permettra uniquement à la session active marquée par ConsoleKit d'accéder au matériel audio. Étant donné que ConsoleKit actuel ne peut marquer qu'une session comme active à la fois, cela signifie que nous devons exécuter une instance de pulseaudio à l'échelle du système. L'avantage: chaque siège peut avoir un son individuel. L'inconvénient: TOUT le matériel audio est disponible pour tout utilisateur et peut être manipulé à volonté. Ce n'est pas une situation idéale pour un cybercafé ou tout autre lieu public où la sécurité est une préoccupation réelle. Gardez cela à l'esprit lorsque vous créez votre politique de sécurité de site. Il pourrait être prudent de limiter l'exécution de pavucontrol aux administrateurs uniquement.

Comme toujours, effectuez une sauvegarde de tous vos fichiers de configuration par défaut. Si vous avez bricolé vos configurations sans sauvegarder, vous pouvez récupérer le paquet pulseaudio avec apt-get -d install pulseaudio. Cela téléchargera le package (vers / var / cache / archives / apt) uniquement et vous pourrez extraire le contenu pour récupérer les configurations par défaut. Sachez que client.conf n'y est pas inclus.

Pour exécuter pulseaudio en tant que démon à l'échelle du système, nous devons modifier quelques fichiers.

1.) / etc / default / pulseaudio

    PULSEAUDIO_SYSTEM_START=1

2.) /etc/pulse/daemon.conf - Voir man pulse-daemon.conf pour plus d'informations.

    daemonize = yes
    local-server-type = system

3.) /etc/pulse/client.conf

    autospawn = no

Nous devons également ajouter des utilisateurs au groupe d'accès par impulsions.

sudo usermod -a -G pulse-access <username>

Maintenant que tous les utilisateurs peuvent accéder au matériel audio, nous devons sélectionner le matériel que chaque utilisateur utilisera. Cela peut être fait en utilisant pavucontrol. Veuillez noter que les paramètres sont stockés PAR UTILISATEUR et ne suivront pas le siège. Si les utilisateurs changent de siège, vous devrez resélectionner le matériel audio souhaité.

Commentaires supplémentaires sur Pulseaudio

J'avais espéré qu'il y aurait une solution plus élégante pour faire fonctionner l'audio par siège. L'utilisation d'un Pulseaudio à l'échelle du système en multisiège présente de nombreux inconvénients et n'est pas entièrement stable entre les redémarrages. J'avais tenté de démarrer une instance à l'échelle du système et de faire en sorte que les instances utilisateur s'y connectent en tant que serveur via localhost. Cela ne semble pas fonctionner puisque lorsque pulseaudio --start est exécuté, il source daemon.conf.

Concernant ConsolKit

Le problème que nous voyons lors de l'exécution d'un son pulseaudio normal par utilisateur est qu'un siège a accès au matériel et que tous les autres ont une sortie factice. Cela est dû au fait que ConsoleKit n'est pas entièrement conscient du siège. CK considère tous nos sièges comme des sessions de siège1 et ne peut marquer qu'une session comme active. Ce fait peut être vu en exécutant getfacl / dev / snd / *. L'idée m'est venue à l'esprit que nous pourrions être en mesure de modifier l'acl des fichiers / dev / snd / appropriés en fonction de $ DISPLAY qu'un utilisateur particulier utilise. C'est une option que je n'ai pas explorée. Veuillez envisager de contribuer à la cause multi-sièges en explorant cette hypothèse et en éditant le document avec vos résultats.

Il existe des branches multisièges pour ConsoleKit , GDM-2.3 et GDM-3.x qui devraient prévoir une fonctionnalité multisièges automatique.

Notes complémentaires

1.) Il serait sage d'interdire également aux utilisateurs de charger les modules DISALLOW_MODULE_LOADING = 1.

2.) Autospawn = no n'est pas entièrement nécessaire comme le montre mon exemple de fichier. Cela ne pose aucun problème.

Anthony
la source
1
Anthony, merci pour votre message, cela a été utile! J'ai rencontré le même problème et j'ai découvert comment obtenir le résultat souhaité sans exécuter Pulseaudio en mode système. Jetez un œil: unix.stackexchange.com/a/104344/34581 . J'espère que ce sera utile.
Ilia Rostovtsev
1

Ma compréhension de la situation: l'accès à pulseaudio est limité à la session active comme indiqué par ConsoleKit (quelque chose à propos d'une ACL). CK ne peut marquer qu'une session comme active à la fois.

Il y a un patch à ConsoleKit pour ajouter un support multi-sièges; cela lui permettra de signaler tous les sièges actifs comme actifs. Cela résoudra peut-être votre problème. Il a besoin de coopération avec le gestionnaire d'affichage, et il existe un correctif pour les anciennes versions de GDM qui ajoute ce support.

J'ai travaillé sur plusieurs sièges dans Natty (11.04) en utilisant des packages ConsoleKit et GDM modifiés à partir d'un PPA . Je n'ai pas encore mis à niveau depuis Natty - il m'a fallu beaucoup de temps pour comprendre comment le faire fonctionner, et je crains que LightDM ne fonctionne pas avec le ConsoleKit patché.

EDIT: Je dois noter que Fedora 17 a des fonctionnalités multisièges impressionnantes, dont certaines seront en Quantal. Ils ont une page wiki décrivant leur approche . Ubuntu ne peut pas simplement copier l'approche de Fedora car cela nécessiterait des changements importants; Fedora utilise systemd et GDM tandis qu'Ubuntu utilise upstart et LightDM.

Richard Hansen
la source
Lol. Je connais les branches ConsoleKit et GDM multisièges. Vous remarquerez que je les ai liés à la page Ubuntu MultiseatX que je suis en train de mettre à jour. En fait, la branche ck dépend de la branche gdm. Ils sont gérés par la même personne d'Oracle. Le PPA que vous avez référencé est également quelque chose que je connais et n'est pas pour 12.04. J'essaie de le faire d'une manière qui n'implique pas de sortir des référentiels standard. Concernant Fedora et systemd ... l'approche multisièges systemd ne fonctionnera PAS avec le binaire nvidia.
Anthony
0

J'essayais récemment de résoudre le problème avec PulseAudio et Multiseat. Voyant qu'il n'y avait pas de solution élégante, ma solution était d'utiliser le réseau.

Cette solution convient à mon scénario car je suis l'utilisateur le plus souvent dans la machine et mon siège est le plus souvent connecté. Et mon siège est configuré pour gaucher et personne d'autre ne l'utilise.

Dans mon ~/.config/pulse/default.pa j'ai copié la configuration système de /etc/pulse/default.paet ajouté la ligne suivante:

load-module module-native-protocol-tcp auth-anonymous=1 auth-ip-acl=127.0.0.1

Dans les paramètres pulseaudio des autres utilisateurs, ajoutez un tunnel - ou plusieurs, si c'est ce dont vous avez besoin - avec quelque chose le long:

load-module module-tunnel-sink server=127.0.0.1 sink=alsa_output.pci-0000_00_XX.X.iec958-stereo

Modifiez le nom du récepteur pour qu'il corresponde à celui de votre machine. Vous pouvez décider de configurer un nom plus convivial - ce qui signifie que vous devez le configurer dans votre fichier de paramètres pulseaudio - mais je viens d'utiliser le nom donné en le regardant avec pacmd list-sinks.

Ce n'est pas une solution élégante, j'essaierai probablement d'utiliser une configuration à l'échelle du système comme suggéré par @Anthony dans mon prochain rig, mais si vous avez beaucoup de cartes et que vous voulez juste partager un ou quelques puits / source, c'est un solution plus "chirurgicale".

MariusSiuram
la source