maxidcx c'est lancé dans un projet ambitieux : modifier le firmware de l'interface USB d'un oktodac pour l'utiliser aussi comme DSP !
Après tout, la puissance de calcul de l'XMOS dans ces interfaces est généralement sous utilisée.
https://www.homecinema-fr.com/forum/diy-sources/extension-dsp-pour-dac-okto-research-t30102466.html
Alors non seulement il a réussi, mais il a en fait créé un véritable framework de programmation dsp générique, portable et le tout en opensource :
https://github.com/fabriceo/AVDSP
A partir de cette base, il était facile de l'intégrer au sous-système son de Linux (Alsa), offrant ainsi la possibilité d'ajouter n'importe quel traitement DSP à un streamer Linux.
Le but de ce post, n'est pas de décrire le fonctionnement et l'utilisation d'AVDSP. D'abord par ce que je suis pas doué pour la doc et ensuite par ce qu'un framework de programmation n'est pas forcement une chose simple qui s'explique en un post.
Je vais au contraire, vous montrer une utilisation basique, ne nécessitant pas de programmation : l'égalisation de la réponse en fréquence à partir d'EQ générées avec REW.
Cela s'adresse à des utilisateurs ayant quand même une certaine habitude de Linux (compilation depuis des sources, configuration Alsa ...), mais rien d'insurmontable.
1) Téléchargement et compilation
Les sources sont téléchargeable ici :
https://github.com/fabriceo/AVDSP/releases/tag/v1.0
Une fois téléchargées et unzippées, lire la partie compilation du fichier AVDSP/module_avdsp/linux/README.md pour compiler l'ensemble du framework.
Au final ont dispose dans le répertoire AVDSP/module_avdsp/build, d'une commande : dspcreate et d'un plugin Alsa : libasound_module_pcm_avdsp.so
A noter, que, comme on compile sur la machine d’exécution, ceci est valable quelque soit la plateforme (x86_64 ou ARM).
2) Création des EQ avec REW
Avec REW, charger la mesure de la réponse que vous voulez égaliser. (voir tutos sur ce forum).
Lancer l'outil EQ en configurant l'utilisation du dsp : generic. Ce mode mettra à votre disposition de nombreuses fonctions d'égalisation et de filtrage. Elles sont pratiquement toutes supportées par AVDSP (sauf LS 12 et HS 12 , mais LS et HS le sont).
Une fois satisfait du résultat, exporter les eqs sous forme de fichier texte (menu : File/Export/Export filter settings as text)
Si vous voulez des eqs différentes pour votre enceinte gauche et droite créer deux fichiers. (Par exemple : filtregauche.txt et filtredroit.txt).
3) Génération du bytecode
AVDSP est fondé sur l'utilisation d'un code intermédiaire (bytecode). Le fichier de bytecode doit être généré avant de pouvoir être exécuté par le runtime. C'est le rôle de la commande dspcreate :
- Code: Tout sélectionner
./dspcreate -binfile eq.bin -dspformat 2 -dspprog ../dspprogs/REWgenericEQ.so filtregauche.txt filtredroit.txt
- eq.bin est le nom du fichier bytecode à générer
- REWgenericEQ.so est un programme AVDSP. dspcreate execute ce programme pour qu'il lise les fichiers d'EQ texte de REW et fasse les appels au framework AVDSP afin de creer le bytecode.
- -dspformat 2 est nécessaire car AVDSP sait générer du bytecode pour traitement en flottant ou int64 (et d'autres). Seul le format int64 (2) est supporté en Linux.
- filtregauche.txt filtredroit.txt sont les deux fichiers générés à l'étape 2.
Si vous voulez les mêmes eq pour les deux voies, il faut répéter le nom du fichier deux fois sur la ligne de commande.
4) Installation et configuration Alsa
Maintenant que l'on a le fichier de bytecode, il va falloir l’exécuter (en fait l'interpréter).
C'est le rôle du plugin alsa : libasound_module_pcm_avdsp.so. Il faut le recopier au bon endroit pour qu'il soit pris en compte par Alsa. Cela peut dépendre de la distribution Linux utilisée (ie : sur une Fedora c'est : /usr/lib64/alsa-lib/ ).
Il faut modifier le fichier de configuration Alsa (/etc/asound.conf) et rajouter les lignes suivantes :
- Code: Tout sélectionner
pcm.dsp {
type avdsp
dspprog "/mydir/eq.bin"
slave {
pcm "hw:USB,0"
}
}
Cela va créer un nouveau device Alsa appelé dsp qui fait appel au plugin AVDSP pour interpréter /mydir/eq.bin et envoyer le résultat vers le device "hw:USB,0"
Bien-sur, il faut adapter /mydir au path où vous avez mis eq.bin et USB,0 au nom Alsa de la sortie son utilisée. (en général le nom du DAC).
5) Utilisation
C'est presque fini
On a maintenant un nouvel device Alsa qu'il suffit d'utiliser comme sortie son. Alsa va rediriger le flux vers le plugin AVDSP qui renverra vers le device slave !
Pour l'essayer , on peut tester avec aplay :
- Code: Tout sélectionner
aplay -D dsp
Si il n'y a pas d'erreur d'ouverture de device, alors tout ba bien
Ensuite tout dépend de votre utilisation.
Par exemple pour un serveur mpd on configurera ainsi :
- Code: Tout sélectionner
audio_output {
type "alsa"
name "DAC"
device "dsp"
dop "no"
}
Mais tout programme pouvant jouer du son dans un device Alsa pourra utiliser le plugin avdsp en jouant vers le device dsp...
Et voila
Encore une fois, ce n'est qu'un exemple d'utilisation. Le plus simple en fait ...
On peut par exemple aussi, faire du filtrage actif, si on dispose d'une carte son possédant plusieurs voies. Il suffit de créer autant de fichiers texte eq que de voies (ie 6 pour une paire d'enceinte 3 voies) et utiliser REWgenericEQ de la façon suivante :
- Code: Tout sélectionner
./dspcreate -binfile eq.bin -dspformat 2 -dspprog ../dspprogs/REWgenericEQ.so -w 3 bassG.txt mediumG.txt aigueG.txt bassD.txt mediumD.txt aigueD.txt
Le device dsp aura alors 2 voies en entrée et 6 voies en sortie vers le DAC (il peut y avoir un peu de conf Alsa supplémentaire pour le routage).
Si on veut aller plus loin, il faut mettre les mains dans le cambouis et commencer à programmer ses propres fonctions de DSP, comme maxidcx l'a fait pour son filtrage soustractif...