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 :
- lister mes cartes audio (l'équivalent d'un
cat /proc/asound/cards
ou plus exactement d'uncat /proc/asound/card[0-9*]/id
) selon leur nom pour pouvoir les appeler (hw:Live
,hw:Juli
,hw:XFi
,hw:Intel
…) - 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 fairearecord -r 96000
sur une carte qui ne le gère pas, SANS le moduleplug
et ça resample tout de même si on ne demande pas--disable-resample
. Bref, alsa resample ET dansarecord
, ET dansplug
. 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 deos.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.