Journal PulseAudio, réseau, et effet surround

Posté par  (site web personnel) .
Étiquettes : aucune
1
2
mai
2008
Suite aux derniers journaux sur les mini serveurs, vous avez choisi d'en acheter un ? Comme il ne possède pas le wifi, je l'imagine posé sur l'étagère de la bibliothèque, entre le téléphone et la chaîne hi-fi ? Alors voila je vous propose de connecter cet ordinateur avec votre ordinateur principal et de monter un "mini home-cinéma" dans votre salon, rien de moins ! Je n'ai pas trouvé cet info sur le net, j'en offre donc l'exclusivité à linuxfr !

PulseAudio ( PA ) est un gestionnaire de son, permettant à plusieurs applications de partager une carte son, comme du temps où alsa dmix n'existait pas ( PA est d'ailleurs un dérivé de esd ). Aujourd'hui, les gestionnaire de son souffrent de la simplicité d'alsa, et sont souvent considérés comme inutiles ( en introduisant des temps de latence pour pas grand chose en plus ), sauf dans le cas de la mao, ou jack fait toujours recette.

Pourtant, les serveurs de son ont continué à faire ce qu'il faisaient très bien ( à savoir mixer et démixer du son ), et PA permet de faire tout ça à l'échelle d'un réseau : c'est ce que je vais vous présenter ici.

Je vais passer l'étape d'installation et configuration [que vous trouverez par exemple ici : http://doc.ubuntu-fr.org/pulseaudio] ( faites cependant attention au firewall ) pour aller directement à l'essentiel : la configuration en réseau.

Bon, considérons que tout est installé, sur les PC à connecter mettons ceci dans le fichier default.pa


### Load the RTP reciever module
load-module module-rtp-recv

### Load the RTP sender module
load-module module-null-sink sink_name=diffusion format=s16be channels=2 rate=44100 description="RTP Multicast Sink"
#loop=1 permet de diifuser en local le flux que nous allons envoyer sur le réseau
load-module module-rtp-send source=diffusion.monitor loop=1


Ici nous activons des deux côtés l'émission du flux sur le réseau, et la réception de ce qui est diffusé. Cela signifie que tout ce qui sera émis, d'un côté ou d'un autre sera diffusé sur l'ensemble du réseau : mpd etc.
Si les deux ordinateurs sont dans la même pièce, cela permet d'avoir un "faux surround", faux car les flux sont copiés, et si l'on présente un vrai flux 5.1, il ne sera pas traité comme tel ( de plus, les canaux gauche et droite sont conservé de chaque côté, ce qui n'est peut être pas ce que vous souhaitez ). Néanmoins, si vous vous mettez au milieu du salon, en écoutant la musique vous aurez droit à une nouvelle approche de votre musique !

Par contre, si le morceau dure longtemps, mais alors vraiment très longtemps ( dans mon cas une vingtaine de minutes ), vous allez commencer à percevoir que quelque chose ne va pas, mais sans trop savoir quoi. Puis ce quelque chose va se transformer en écho, et cet écho en décalage.

Et oui, car deux ordinateurs ne tournent pas à la même vitesse ! Si l'on présente à chacun un flux de 200mn à 44100hz, cela peut durer 198mn chez le premier, et 201m et des brouettes chez le second... ( sans compter les ntp et autres interférences de ce type ) Ici on a même moyen de mesurer cette différence à l'oreille ( je vous laisse chercher sur le net à partir de quand l'oreille commence à percevoir un décalage et de le chronométrer ) Le protocole de diffusion réseau ( rtp ) n'a pas de contrôle de synchronisation et ne permet pas ce genre de correction ( du moins pas encore.. )

Il va donc falloir passer par autre chose, et ça va être l'occasion de présenter un peu la manière dont PA gère le son.

Il existe des points d'entrées ( micro ) et des points de sorties ( carte son ). Au niveau logiciel, PA permet de rediriger les sorties son vers celles que l'on souhaites, existantes, ou virtuelles. Un système de module nous permet de contrôler ce que l'on fait des flux, et vers où l'on souhaite les rediriger.
Ici, nous allons créer une duplication du flux local que nous allons envoyer vers l'autre ordinateur :

load-module module-tunnel-sink server=$ip_distante sink_name=copie channel_map=rear-left,rear-right channels=2
On crée un tunnel, dans lequel on envoie le flux directement. Accessoirement, on défini quels sont les canaux qui seront utilisés là bas ( J'ai mis ici des canaux correspondant à une sortie arrière dans un système 5.1 )
( Du côté client, il suffit juste que la connexion tcp soit activée, par exemple en faisant:
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16
)

Pour l'instant, on a juste créé un tube, maintenant nous allons le fondre avec la sortie locale :
load-module module-combine master=alsa_output.hw_0 slaves=copie channel_map=left,right,rear-left,rear-right channels=4


La liste des modules et ce qu'il est possible de faire avec:
[http://pulseaudio.org/wiki/Modules]

Et voilà ! La sortie principale ( alsa_output.hw_0 ) sera fondue avec copie, et diffusée directement sur notre autre ordinateur. J'ai terminé ici la mise en place du système surround, en spécifiant que ce flux avait bien 4 enceintes. Vous voila maintenant heureux possesseur d'un système surround dans votre domicile :)

Il ne reste plus qu'à utiliser ce flux ( son nom est celui utilisé par défaut, c'est à dire combined ), et profiter de notre sortie.
En lançant le son, vous pourrez entendre un écho et une légère distorsion au début, le temps que PA égalise les deux sortie, et ensuite plus rien, c'est vraiment un plaisir !

Il ne reste plus qu'à configurer les logiciels pour utiliser la sortie proposer, mais avec toutes les passerelles ( esd, alsa, oss, etc ) ça n'est pas trop un problème. Sur ce, amusez vous bien !

Il y a une limitation cependant, c'est que si le serveur esclave venait à être coupé, la connexion ne se refait pas automatiquement ( le son continue d'être joué, mais en local seulement ), jusqu'à ce que la configuration soit rechargée. Cela signifie que vous voulez mettre en place ce système sur votre mini-pc, le son ne sera plus diffusé une fois que vous aurez éteint votre ordinateur principal. ( Par contre dans l'autre sens, il n'y a pas de problème, puisque je pense que l'uptime de votre serveur sera supérieur à celui de votre ordinateur de bureau ).

À noter qu'il est possible d'utiliser cette configuration pour les jeux ( sdl ), la musique, la vidéo etc. Bref vous pouvez tout faire passer à la moulinette de PA ( sauf flash qui présente quelques problèmes, mais comme vous le savez flash .. )

Sur ce, je vous souhaite bonne musique !
  • # ...

    Posté par  . Évalué à 2.


    Et oui, car deux ordinateurs ne tournent pas à la même vitesse ! Si l'on présente à chacun un flux de 200mn à 44100hz, cela peut durer 198mn chez le premier, et 201m et des brouettes chez le second... ( sans compter les ntp et autres interférences de ce type )

    C'est surtout les horloges de la carte audio qui cadence la lecture...


    Le protocole de diffusion réseau ( rtp ) n'a pas de contrôle de synchronisation et ne permet pas ce genre de correction ( du moins pas encore.. )

    J'ai des souvenirs comme quoi rtp/rtcp ont tout un mecanisme de timestamp pour garantir la synchro des flux. Mais peut etre que ca marche pas dans se cas, ou alors ca vient du fait que rtcp n'est pas utilisé.
    • [^] # Re: ...

      Posté par  . Évalué à 4.

      Tu entends 2 sons séparés après un décalage de 30ms. C'est ton cerveau qui confond les sons en dessous de 30ms et pas ton oreille.

      Autre expérience sympathique, si tu te bouches une des deux oreilles tu entendras la réverbération de la pièce alors qu'avec tes deux oreilles, celle-ci est masquée par ton cerveau, magique non?
      • [^] # Re: ...

        Posté par  . Évalué à 4.

        chez moi ça marche pas, tu utilise quelle version de cerveau ?
    • [^] # Re: ...

      Posté par  . Évalué à 2.

      A propos de RTP/RTCP c'est très simple en fait:

      RTP: Real-time Transport Protocol
      RTCP: Real-Time Control Protocol

      RTCP est un protocole de contrôle des flux RTP permettant entre autre de faire de la qualité de service et de la synchronisation.

      Souvent on n'a pas le temps/l'argent/les moyens/l'envie de développer et mettre en place RTCP, et on se contente de RTP.

      Je pense que c'est le cas ici.
  • # Flash et PulseAudio

    Posté par  (site web personnel) . Évalué à 1.

    Flash 9 fonctionne très bien avec Pulse Audio à condition de compiler un petit plugin supplémentaire.

    git-clone http://git.0pointer.de/repos/libflashsupport.git/

    et puis les classiques ./bootstrap.sh && make && sudo make install. Penser à installer libpulseaudio-dev et les éventuels outils manquants que bootstrap.sh vous signalera.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.