Multiples sources d’enregistrement audio sous GNU/Linux avec ALSA
Configurer une petit solution de streaming audio lorsqu'on dispose d'un serveur dédié est l'affaire de peu de temps. L'installation d'Icecast2 est aisée, tout comme celle du streamer Darkice. Ensuite... on passe du temps à comprendre pourquoi le son du tuner ou du lecteur CD connecté à l'entrée Ligne de la carte son ne peut être enregistré alors qu'on l'entend bien dans les haut-parleurs du PC.
Pire encore que le fait d'enregistrer du silence, l'utilisation d'un bitrate variable pour l'encodage du stream par Darkice ou Ices2 donne des résultats très étranges. Le bitrate variable, comme son nom l'indique n'est pas fixe. Or lorsque le signal à encoder est plat, le calcul du bitrate semble devenir impossible et le lecteur (XMMS par exemple) ne fait que bufferiser sans jamais lire le flux.
Mais le problème n'est pas là. Pourquoi ne puis-je pas enregistrer ce que j'entends dans mes beau haut-parleurs Altec Lansing ? La réponse est simple : ALSA est en mesure de prendre en charge un grand nombre d'entrées et de sorties pour une carte son classique (Ensoniq 5880 AudioPCI). Cependant, encore faut-il préciser quelle entrée doit servir de source d'enregistrement.
Pour cela deux solutions :
alsamixer, le mixeur graphique en mode consoleamixer, le mixeur en ligne de commandes (mieux)
Sur ma configuration, le mixer control concerné est Line :
% amixer sget Line,0 Simple mixer control 'Line',0 Capabilities: pvolume pswitch pswitch-joined cswitch cswitch-exclusive Capture exclusive group: 0 Playback channels: Front Left - Front Right Capture channels: Front Left - Front Right Limits: Playback 0 - 31 Front Left: Playback 0 [0%] [off] Capture [off] Front Right: Playback 0 [0%] [off] Capture [off]
% amixer sset Line,0 0%,0% cap
Ici, c'est l'argument cap (comme capture) qui sélectionne ce contrôle comme source d'enregistrement. Dès lors, plus de problème avec Darkice qu'il suffit de configurer pour une source ALSA :
[input] device = hwplug:0,0 sampleRate = 11025 bitsPerSample = 16 channel = 2
J'en profite ici pour préciser une petite astuce. Plutôt que de spécifier, comme ici, le périphérique ALSA source, utilisez plutôt plug:dsnoop (plugin dsnoop). Celui-ci permet de partager une source d'enregistrement. Autrement dit, vous pouvez non seulement utiliser Darkice pour streamer le son mais utiliser, en plus, un autre outil comme arecord pour enregistrer cette source. Le tout sans utiliser des choses lourdes comme Jackit. Que du bonheur...