Forum Programmation.python Python 3 et Alsa

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
2
23
fév.
2013

Bonjour, je développe un projet en Python 3 avec des trucs très amusants et modernes (Gstreamer 1.0, DBus, Jackd2, Opus…), je gère du son principalement.

Jusqu'à maintenant, je partais du principe que je connaissais d'avance mes cartes sons et leurs capacités. Mais désormais, on me demande que je puisse lister tout cela depuis le logiciel. Aussi, je me retrouve dans une situation où il faudrait que j'adapte certaines choses en fonction des cartes sons.

Par exemple la Juli@ travaille en S32_LE et ne supporte pas du tout le S16_LE, alors que la majorité des cartes grand publique travaillent en S16_LE, il me faut donc adapter le format d'enregistrement en fonction de la carte.

Autre exemple, la Muse XL Pocket LT3 possède un bug gênant, elle déclare gérer l’échantillonnage à 48KHz en entrée et en sortie, mais dans les faits, le son en sortie est pourri à cet échantillonnage, et donc, pour cette carte, je dois sampler volontairement à 44100, ne pouvant compter sur le module plug d'alsa puisque la carte ment.

Donc je cherche à pouvoir :

  1. lister mes cartes audio (l'équivalent d'un cat /proc/asound/cards ou plus exactement d'un cat /proc/asound/card[0-9*]/id) selon leur nom pour pouvoir les appeler (hw:Live, hw:Juli, hw:XFi, hw:Intel…)
  2. interroger quelques caractéristiques : Marque et modèle (pour faire des contournement de bug en fonction de), format d'enregistrement et de lecture gérés, échantillonnages gérés (pour adapter automatiquement aux capacités), nombre de canaux disponibles en lecture ou enregistrement. Je crois que c'est tout !

J'ai trouvé deux modules python pour faire cela : python-pyalsa, et pyalsaaudio. Je préfère le feeling du second (POO), mais le premier est le projet officiel d'Alsa et donc celui que j'aurai choisi si… si… si je pouvais l'utiliser !
Ces deux projets sont pour Python 2 uniquement !

Alors donc quelques questions :

  • Est-il possible d'utiliser un module Python 2 dans un projet Python 3 ? (je crois que non) Et sinon :
  • Comment interrogeriez-vous Alsa avec Python ? Mes besoins ne sont pas grands, je pars du principe que le mixage est bon et les switchs logiciels convenablement sélectionnés.

En fait déjà de base, en shell, je ne m'y retrouve pas dans ce *@~# d'Alsa !
Le seul truc fiable et reproductible que j'ai trouvé sont les deux commandes citées plus haut…

  • dans /proc/asound/ rien n'est jamais pareil selon les cartes et les pilotes
  • les sorties de arecord/aplay -l/-L sont imbitables et inutilisables, arecord/aplay savent lister des formats et échantillonnages, mais qu'à l'utilisation (enregistrement ou lecture) et en fait racontent n'importe quoi en faisant du resampling dans le de dos. Par exemple je peux faire arecord -r 96000 sur une carte qui ne le gère pas, SANS le module plug et ça resample tout de même si on ne demande pas --disable-resample. Bref, alsa resample ET dans arecord, ET dans plug. Tout ça est un bazar pas possible ! Alsa est LE gros point noir dans mon projet. Et dans tout ça tout ce que je voudrais c'est une liste simple de cartes et de quelques unes de leur capacité, et d'obtenir le résultat dans Python. J'accepterai des hack crade à coup de os.system() mais même ça me semble improbable.

Des idées ? Merci !

NB: même si vous ne développez pas en Python, si vous avez des tweaks pour interroger Alsa, je prends ! :)

Suivre le flux des commentaires

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