VirtualBox, Alsa et multiples cartes audio
De nos jours il y a vraiment des cartes sons partout.... Sur la carte mère, dans son clavier, dans son casque, dans ses baffles, you name it ! Et devant une telle profusion, il devient parfois compliqué d'indiquer spécifiquement à une application quelle carte utiliser. Et plus particulièrement à VirtualBox qui ne dispose pas d'une interface de configuration pour cet usage.
Le cas PulseAudio
Comme dirait un présidentiable (il parait que ça se dit..) tout mou, j'en entends qui disent, "il n'a qu'à utiliser PulseAudio". Seulement voilà, je ne veux pas... Ce n'est pas idéologique mais juste logique. En effet, justement par la profusion de carte audio, on peut de nos jours se permettre le luxe d'avoir une application par sortie en se disant raisonnablement qu'il y a peu de chance que j'utilise Skype et Linphone en même temps, sur le même casque (le bioware ne suit pas, je n'ai toujours qu'une bouche et deux oreilles après tout). Alors entre rajouter de l'entropie avec un pulseaudio qui va me jouer le "22 à Asnière", et simplement paramétrer mes applications une fois pour toute, le choix est vite fait.
Détermination du périphérique Alsa
Généralement l'assignation d'une application (Linphone, mpd, mplayer, et même Skype) à une carte se fait simplement par configuration. Mais étrangement ce n'est pas le cas pour VirtualBox. On peut juste lui indiquer "utilise Alsa", ce qui est vaguement léger...
Jusqu'alors je m'en moquais car la sortie principale (ampli & baffles) suffisait largement à l'usage que j'avais de mes VM's : tester des rendus de sites sur les différentes versions du catastrophique IE. Mais là, j'ai besoin d'utiliser une application de VoIP qui ne fonctionne que sous Windows (et oui...), et donc d'utiliser cette fois le casque...
Classiquement, en ligne de commande, une carte gérée par Alsa se sélectionne par son numéro d'index et la syntaxe hw=index,0. Pour la 3ième carte, la première ayant 0 comme index, nous aurons donc, pour mplayer par exemple, mplayer -ao alsa:device=hw=2,0.
Pour savoir à quelle carte correspond quel numéro, le plus simple est de visualiser le psoeudo fichier /proc/asound/cards :
gaston$cat /proc/asound/cards0 [Intel ]: HDA-Intel - HDA IntelHDA Intel at 0xfa100000 irq 221 [Speakers ]: USB-Audio - Logitech Z-5 SpeakersLogitech Logitech Z-5 Speakers at usb-0000:00:1a.0-1, full speed2 [Headset ]: USB-Audio - Logitech Wireless HeadsetLogitech Logitech Wireless Headset at usb-0000:00:1d.2-2, full speed3 [default ]: USB-Audio - Generic USB Audio DeviceGeneric USB Audio Device at usb-0000:00:1a.7-4.2, full speed
Mon casque est donc hw=2,0. Reste maintenant à expliquer cela à VirtualBox.
Les variables cachées de VirtualBox
Pour que la suite fonctionne, vous devez évidement avoir une machine virtuelle configurée avec la prise en charge de l'audio routé sur le pilote Alsa.
Nous allons commencer par obtenir la liste des machines disponibles ce qui nous sera utile pour en lancer une en particulier :
$ VBoxManage list vms"Winmachin-chose" {bfcc1fa1-d957-46a0-8cb6-899412a61fd7}...
VBoxManage c'est le couteau suisse de VirtualBox en ligne de commande. Avec vous pouvez tout faire ou presque, et notamment lancer une machine virtuelle avec la sous-commande startvm suivi du guid de la machine (le truc ésotérique entre accolades).
Pour indiquer quelle carte utiliser, nous allons passer à cette commande deux variables d'environnement, VBOX_ALSA_DAC_DEV et VBOX_ALSA_ADC_DEV, correspondant respectivement à la sortie audio (DAC pour Digital Analogic Converter) et l'entrée audio (ADC). Ce qui nous donne :
gaston$VBOX_ALSA_DAC_DEV="hw:2,0" VBOX_ALSA_ADC_DEV="hw:2,0" VBoxManage startvm bfcc1fa1-d957-46a0-8cb6-899412a61fd7
Et voilà. Si tout c'est bien passé, tout le son devrait entrer et sortir par le périphérique 2,0 (ici mon casque).