rapport du projet media player vst -...
TRANSCRIPT
Media Player Vst Host
TER
Master 1
Anneacutee 20042005
Etudiants
De Georges Adrien
Jorcin Reacutemi
Roche Michaeumll
Scalabre Teacuterence
Encadreacute par
Mr Michel Buffa
2
bull Introduction (p 4)
o Preacuteface o Rappel du travail demandeacute o En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport o Inteacuterecirct dun tel logiciel alors quil existe media player winamp
des logiciels de musique pro etc bull Lexistant le logiciel ADA Player (p 7)
o Preacutesentation des fonctionnaliteacutes analyse technique o Lire un meacutedia agrave laide du framework Net et de lAPI direct
show o Utilisation de drivers asio
Asio cest quoi ADA Player est lecteur multimeacutedia ET un VST host Comment on reacutealise un mixage entre le son du micro et
celui du meacutedia bull Notre approche mettre le noyau en dll refaire linterface
graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram (p 14)
o Partage du projet en tacircches et affectations o Reacutealisation dun meacutedia player basique o Transformation du noyau en dll reconception o Apprentissage de C deacuteveloppement dune gui basique o Code manageacute et non Manageacute C parle agrave C++ Mais cest
comme JNI en plus simple o Etude dune solution pour le support de skins o Etude des SDK AsioVST
bull Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees (p 27) o Une nouvelle Playlist o Une nouvelle interface de configuration des drivers asio o Gestion des preacutefeacuterences utilisateur o Inteacutegration dun gestionnaire de plugins VST externe o Possibiliteacute de plugger une chaicircne de traitement sonore agrave
plusieurs endroits o En bref quels sont les apports de XTram
bull Bilan (p 40) o Technique o Personnel
bull Conclusion (p 42) bull Annexes (p 42)
o Webographiebibliographie o Architecture des diffeacuterentes classesmodules o Guide de deacuteveloppement de skins o Compleacutement annexe (issu du rapport dADA Player) o Remerciements o Rapport et soutenance intermeacutediaires
3
Introduction Preacuteface Pour commencer si vous ecirctes en train de lire une version papier de ce
rapport ne vous eacutetonnez pas de la mise en page relativement simple Il
sagit lagrave en fait de la version imprimeacutee du document eacutelectronique
disponible sur la page TWiki de notre TER En effet notre rapport a eacuteteacute
reacutedigeacute sur le conseil de notre encadrant Michel Buffa directement sur le
Twiki afin de permettre un accegraves direct aux diffeacuterents liens La version sur
le Twiki contient par ailleurs de nombreux liens permettant au lecteur de
teacuteleacutecharger les diffeacuterents outils et de visiter les diffeacuterentes pages illustrant
nos propos mais ne faisant pas partie du rapport (avancement du TER
problegravemes rencontreacutes etc)
Rappel du travail demandeacute Ce projet consiste agrave refaire et agrave ameacuteliorer un prototype de lecteur
multimeacutedia similaire au meacutedia player de windows dans son approche
(utilisation des codecs installeacutes sur lOS Windows pour supporter les
diffeacuterents types de meacutedias) si ce nest quil permet pendant la lecture de
traiter en temps reacuteel le son qui entre par lentreacutee micro au travers dune
chaicircne de plugins de traitement sonores et le mixer agrave celui du meacutedia en
cours de lecture
Le prototype de lan dernier -ADA Player- deacuteveloppeacute par des eacutetudiants
dESSI2 est fonctionnel mais comporte de nombreux deacutefauts le
principal eacutetant quil a eacuteteacute deacuteveloppeacute agrave laide de la plate-forme Borland
C++ Builder tregraves peu utiliseacutee et que son interface graphique utilise des
composants Borland peu standards
Un autre deacutefaut est son systegraveme de skins non documenteacute qui rend
leacutevolution de son interface graphique compliqueacutee et non intuitive On
nous a demandeacute de refaire agrave partir de zeacutero toute linterface graphique du
logiciel A leacutepoque de nombreuses fonctionnaliteacutes figurant dans le cahier
des charges nont pu ecirctre reacutealiseacutees (comme par exemple de pouvoir
instancier des chaicircnes de traitement sonore pour traiter le son en
provenance du meacutedia joueacute ou encore le son apregraves le mix micromeacutedia
la version actuelle ne permet que de traiter le son du micro) et on nous a
demandeacute de les impleacutementer
4
En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport
Nous avons ducirc eacutenormeacutement retravailler la conception du logiciel
original et abandonner complegravetement son interface Par ailleurs une
partie du noyau de traitement sonore existant dans ADA Player a pu ecirctre
conserveacute nous en avons fait une librairie reacuteutilisable (une dll windows)
mais apregraves lavoir nettoyeacutee fiabiliseacutee et partiellement reconccedilue ce qui na
pas eacuteteacute une mince affaire Des problegravemes inheacuterents au changement de
plateforme de deacuteveloppement ont eacutegalement eacuteteacute longs agrave reacutegler comme le
changement dAPI pour le traitement des chaicircnes de caractegraveres etc
La solution choisie consiste agrave conserver le noyau sous forme de dll
en C++ non manageacute pour des raisons de performances (dans le
traitement sonore temps-reacuteel on gratte la milliseconde) et agrave utiliser le
langage C pour reacutealiser toute linterface graphique Lorsque nous
avons ajouteacute de nouvelles fonctionnaliteacutes bien entendu nous avons
travailleacute sur les deux parties (la partie C++ et la partie C)
Ce projet a neacutecessiteacute lapprentissage dun nouveau langage (C)
dun nouveau framework (direct sounddirect show) dune API de
traitement sonore relativement bas niveau (le SDK de Steinberg
utiliseacute pour la gestion des plugins de traitement sonores et
lutilisation de drivers au format ASIO pour le traitement temps
reacuteel du son) de deux outils de deacuteveloppement diffeacuterents (Borland
C++ Builder et Visual Studio Net 2003) et leacutetude dun projet
relativement complexe parfois peu ou pas documenteacute
Nous avons reacuteussi agrave mener agrave bien ce projet comme vous allez pouvoir le
constater dans les sections suivantes mais auparavant laissez-nous vous
eacuteclairer sur quelques points particuliers avant de rentrer dans les
deacutetails
Inteacuterecirct dun tel logiciel alors quil existe media player winamp des logiciels de musique pro etc
Pourquoi traiter le son en provenance du micro et le mixer agrave celui du
meacutedia Les applications sont multiples
bull Chanter dans un micro par-dessus une musique daccompagnement
en ajoutant des effets sur la voix (reacuteverbeacuteration compression
eacutegalisation etc)
5
bull Brancher une guitare sur la prise micro traiter le son agrave laide de
simulation damplificateurs guitare (on parle de modeacutelisation
numeacuterique damplificateurs agrave lampe par exemple) et jouer sur une
musique Utile pour apprendre des morceaux et sentraicircner
bull Faire le doublage dune videacuteo amateur etc
Lutilisation de codecs rend le logiciel peu portable car tregraves lieacute agrave windows
mais cette approche composants permet de supporter de maniegravere tregraves
simple tous les formats existants ou agrave venir Par exemple il existe un
codec permettant de lire des fichiers de karaokeacute au format mp3 dans ce
cas on pourra chanter ou jouer de la guitare tout en suivant les paroles agrave
leacutecran Ou bien si on deacutesire accompagner son groupe de rock preacutefeacutereacute sur
scegravene on lira un film (divx ou autre) et on pourra mixer sa guitare par-
dessus
Il nexiste actuellement aucun logiciel sur le marcheacute en freeware
shareware ou commercial permettant de faire ce qui vient decirctre
deacutecrit A ce titre ADA Player malgreacute ses deacutefauts a trouveacute son public
principalement des musiciens amateurs Mr Buffa a fait connaicirctre le
logiciel par le biais des forums du site httpwwwaudiofanzinefr et en a
fait de la pub sur la page web comment transformer son PC en multi-effet
pour guitare tregraves populaire qui propose ADA Player en teacuteleacutechargement
de mecircme quune documentation utilisateur bien illustreacutee
Le traitement du son se fait agrave laide de composants speacutecialiseacutes des
plugins au format VST utiliseacute par tous les logiciels de MAO y compris les
logiciels professionnels utiliseacutes en studio On trouve des milliers de plugins
agrave ce format permettant de reacutealiser une multitude de traitements On
trouve des multi-effets pour guitare produisant des sons rivalisant avec du
mateacuteriel hardware tregraves haut de gamme des plugins speacutecialiseacutes dans la
voix permettant de faire chanter juste mecircme si on a une voix de casserole
et quon chante faux des plugins qui vous donnent la voix de Dark Vador
etc
Seul problegraveme ces plugins fonctionnent agrave laide de drivers sonores au
format ASIO de Steinberg (la maison deacutedition du ceacutelegravebre seacutequenceur
Cubase) qui sont fournis avec des cartes sons pro ou semi-pro coucirctant au
bas mot 200 euros Ce type de driver autorise un traitement du son avec
une tregraves faible latence
6
On appelle latence le temps que met le son entrant pour ressortir une fois
traiteacute Les drivers asio avec une carte son ad hoc permettent dobtenir la
mecircme latence que le mateacuteriel 100 hardware cest-agrave-dire entre 2 et 10
ms Faire cohabiter deux types de drivers dans une mecircme application 1)
drivers direct sound pour pouvoir utiliser le systegraveme de codecs de
windows et 2) drivers asio pour le son temps-reacuteel a eacuteteacute un challenge qua
ducirc relever le groupe deacutetudiants ayant reacutealiseacute le prototype lan dernier
Lexistant le logiciel ADA Player Preacutesentation des fonctionnaliteacutes analyse technique
ADA Player est un lecteur multimeacutedia baseacute sur la technologie Direct Show
de Microsoft Dans une premier temps nous preacutesenterons les principes
dimpleacutementation dun tel lecteur agrave laide de cette API baseacutee sur
lutilisation de composants au sein dun framework relativement complexe
Cest par lagrave que nous avons commenceacute notre eacutetude et cest la premiegravere
chose que nous avons reacutealiseacutee lors du portage de lapplication
Dans un second temps nous donnerons des deacutetails techniques concernant
lutilisation dun driver ASIO et de plugins au format VST et finiront par
vous expliquer comment on peut reacutealiser un mixage en temps reacuteel par
logiciel entre le son provenant du media et celui provenant du micro
LAPI direct sound (partie de direct show utiliseacutee pour deacutecoder le son du
meacutedia) comporte effectivement un composant mixer mais qui nest pas
utilisable dans notre cas car le son traiteacute en provenance du micro a
emprunteacute une voie non Microsoftienne (utilisation de drivers asio) et vous
savez ce quil en coucircte de ne pas rouler sur les sentiers recommandeacutes par
Bill Gates Non le mixage est effectueacute 100 en software
Etant donneacute que nous avons ducirc refaire linterface graphique dans son
inteacutegraliteacute nous ne rentrerons pas dans les deacutetails techniques ici nous
rappellerons juste ces fonctionnaliteacutes
7
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
2
bull Introduction (p 4)
o Preacuteface o Rappel du travail demandeacute o En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport o Inteacuterecirct dun tel logiciel alors quil existe media player winamp
des logiciels de musique pro etc bull Lexistant le logiciel ADA Player (p 7)
o Preacutesentation des fonctionnaliteacutes analyse technique o Lire un meacutedia agrave laide du framework Net et de lAPI direct
show o Utilisation de drivers asio
Asio cest quoi ADA Player est lecteur multimeacutedia ET un VST host Comment on reacutealise un mixage entre le son du micro et
celui du meacutedia bull Notre approche mettre le noyau en dll refaire linterface
graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram (p 14)
o Partage du projet en tacircches et affectations o Reacutealisation dun meacutedia player basique o Transformation du noyau en dll reconception o Apprentissage de C deacuteveloppement dune gui basique o Code manageacute et non Manageacute C parle agrave C++ Mais cest
comme JNI en plus simple o Etude dune solution pour le support de skins o Etude des SDK AsioVST
bull Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees (p 27) o Une nouvelle Playlist o Une nouvelle interface de configuration des drivers asio o Gestion des preacutefeacuterences utilisateur o Inteacutegration dun gestionnaire de plugins VST externe o Possibiliteacute de plugger une chaicircne de traitement sonore agrave
plusieurs endroits o En bref quels sont les apports de XTram
bull Bilan (p 40) o Technique o Personnel
bull Conclusion (p 42) bull Annexes (p 42)
o Webographiebibliographie o Architecture des diffeacuterentes classesmodules o Guide de deacuteveloppement de skins o Compleacutement annexe (issu du rapport dADA Player) o Remerciements o Rapport et soutenance intermeacutediaires
3
Introduction Preacuteface Pour commencer si vous ecirctes en train de lire une version papier de ce
rapport ne vous eacutetonnez pas de la mise en page relativement simple Il
sagit lagrave en fait de la version imprimeacutee du document eacutelectronique
disponible sur la page TWiki de notre TER En effet notre rapport a eacuteteacute
reacutedigeacute sur le conseil de notre encadrant Michel Buffa directement sur le
Twiki afin de permettre un accegraves direct aux diffeacuterents liens La version sur
le Twiki contient par ailleurs de nombreux liens permettant au lecteur de
teacuteleacutecharger les diffeacuterents outils et de visiter les diffeacuterentes pages illustrant
nos propos mais ne faisant pas partie du rapport (avancement du TER
problegravemes rencontreacutes etc)
Rappel du travail demandeacute Ce projet consiste agrave refaire et agrave ameacuteliorer un prototype de lecteur
multimeacutedia similaire au meacutedia player de windows dans son approche
(utilisation des codecs installeacutes sur lOS Windows pour supporter les
diffeacuterents types de meacutedias) si ce nest quil permet pendant la lecture de
traiter en temps reacuteel le son qui entre par lentreacutee micro au travers dune
chaicircne de plugins de traitement sonores et le mixer agrave celui du meacutedia en
cours de lecture
Le prototype de lan dernier -ADA Player- deacuteveloppeacute par des eacutetudiants
dESSI2 est fonctionnel mais comporte de nombreux deacutefauts le
principal eacutetant quil a eacuteteacute deacuteveloppeacute agrave laide de la plate-forme Borland
C++ Builder tregraves peu utiliseacutee et que son interface graphique utilise des
composants Borland peu standards
Un autre deacutefaut est son systegraveme de skins non documenteacute qui rend
leacutevolution de son interface graphique compliqueacutee et non intuitive On
nous a demandeacute de refaire agrave partir de zeacutero toute linterface graphique du
logiciel A leacutepoque de nombreuses fonctionnaliteacutes figurant dans le cahier
des charges nont pu ecirctre reacutealiseacutees (comme par exemple de pouvoir
instancier des chaicircnes de traitement sonore pour traiter le son en
provenance du meacutedia joueacute ou encore le son apregraves le mix micromeacutedia
la version actuelle ne permet que de traiter le son du micro) et on nous a
demandeacute de les impleacutementer
4
En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport
Nous avons ducirc eacutenormeacutement retravailler la conception du logiciel
original et abandonner complegravetement son interface Par ailleurs une
partie du noyau de traitement sonore existant dans ADA Player a pu ecirctre
conserveacute nous en avons fait une librairie reacuteutilisable (une dll windows)
mais apregraves lavoir nettoyeacutee fiabiliseacutee et partiellement reconccedilue ce qui na
pas eacuteteacute une mince affaire Des problegravemes inheacuterents au changement de
plateforme de deacuteveloppement ont eacutegalement eacuteteacute longs agrave reacutegler comme le
changement dAPI pour le traitement des chaicircnes de caractegraveres etc
La solution choisie consiste agrave conserver le noyau sous forme de dll
en C++ non manageacute pour des raisons de performances (dans le
traitement sonore temps-reacuteel on gratte la milliseconde) et agrave utiliser le
langage C pour reacutealiser toute linterface graphique Lorsque nous
avons ajouteacute de nouvelles fonctionnaliteacutes bien entendu nous avons
travailleacute sur les deux parties (la partie C++ et la partie C)
Ce projet a neacutecessiteacute lapprentissage dun nouveau langage (C)
dun nouveau framework (direct sounddirect show) dune API de
traitement sonore relativement bas niveau (le SDK de Steinberg
utiliseacute pour la gestion des plugins de traitement sonores et
lutilisation de drivers au format ASIO pour le traitement temps
reacuteel du son) de deux outils de deacuteveloppement diffeacuterents (Borland
C++ Builder et Visual Studio Net 2003) et leacutetude dun projet
relativement complexe parfois peu ou pas documenteacute
Nous avons reacuteussi agrave mener agrave bien ce projet comme vous allez pouvoir le
constater dans les sections suivantes mais auparavant laissez-nous vous
eacuteclairer sur quelques points particuliers avant de rentrer dans les
deacutetails
Inteacuterecirct dun tel logiciel alors quil existe media player winamp des logiciels de musique pro etc
Pourquoi traiter le son en provenance du micro et le mixer agrave celui du
meacutedia Les applications sont multiples
bull Chanter dans un micro par-dessus une musique daccompagnement
en ajoutant des effets sur la voix (reacuteverbeacuteration compression
eacutegalisation etc)
5
bull Brancher une guitare sur la prise micro traiter le son agrave laide de
simulation damplificateurs guitare (on parle de modeacutelisation
numeacuterique damplificateurs agrave lampe par exemple) et jouer sur une
musique Utile pour apprendre des morceaux et sentraicircner
bull Faire le doublage dune videacuteo amateur etc
Lutilisation de codecs rend le logiciel peu portable car tregraves lieacute agrave windows
mais cette approche composants permet de supporter de maniegravere tregraves
simple tous les formats existants ou agrave venir Par exemple il existe un
codec permettant de lire des fichiers de karaokeacute au format mp3 dans ce
cas on pourra chanter ou jouer de la guitare tout en suivant les paroles agrave
leacutecran Ou bien si on deacutesire accompagner son groupe de rock preacutefeacutereacute sur
scegravene on lira un film (divx ou autre) et on pourra mixer sa guitare par-
dessus
Il nexiste actuellement aucun logiciel sur le marcheacute en freeware
shareware ou commercial permettant de faire ce qui vient decirctre
deacutecrit A ce titre ADA Player malgreacute ses deacutefauts a trouveacute son public
principalement des musiciens amateurs Mr Buffa a fait connaicirctre le
logiciel par le biais des forums du site httpwwwaudiofanzinefr et en a
fait de la pub sur la page web comment transformer son PC en multi-effet
pour guitare tregraves populaire qui propose ADA Player en teacuteleacutechargement
de mecircme quune documentation utilisateur bien illustreacutee
Le traitement du son se fait agrave laide de composants speacutecialiseacutes des
plugins au format VST utiliseacute par tous les logiciels de MAO y compris les
logiciels professionnels utiliseacutes en studio On trouve des milliers de plugins
agrave ce format permettant de reacutealiser une multitude de traitements On
trouve des multi-effets pour guitare produisant des sons rivalisant avec du
mateacuteriel hardware tregraves haut de gamme des plugins speacutecialiseacutes dans la
voix permettant de faire chanter juste mecircme si on a une voix de casserole
et quon chante faux des plugins qui vous donnent la voix de Dark Vador
etc
Seul problegraveme ces plugins fonctionnent agrave laide de drivers sonores au
format ASIO de Steinberg (la maison deacutedition du ceacutelegravebre seacutequenceur
Cubase) qui sont fournis avec des cartes sons pro ou semi-pro coucirctant au
bas mot 200 euros Ce type de driver autorise un traitement du son avec
une tregraves faible latence
6
On appelle latence le temps que met le son entrant pour ressortir une fois
traiteacute Les drivers asio avec une carte son ad hoc permettent dobtenir la
mecircme latence que le mateacuteriel 100 hardware cest-agrave-dire entre 2 et 10
ms Faire cohabiter deux types de drivers dans une mecircme application 1)
drivers direct sound pour pouvoir utiliser le systegraveme de codecs de
windows et 2) drivers asio pour le son temps-reacuteel a eacuteteacute un challenge qua
ducirc relever le groupe deacutetudiants ayant reacutealiseacute le prototype lan dernier
Lexistant le logiciel ADA Player Preacutesentation des fonctionnaliteacutes analyse technique
ADA Player est un lecteur multimeacutedia baseacute sur la technologie Direct Show
de Microsoft Dans une premier temps nous preacutesenterons les principes
dimpleacutementation dun tel lecteur agrave laide de cette API baseacutee sur
lutilisation de composants au sein dun framework relativement complexe
Cest par lagrave que nous avons commenceacute notre eacutetude et cest la premiegravere
chose que nous avons reacutealiseacutee lors du portage de lapplication
Dans un second temps nous donnerons des deacutetails techniques concernant
lutilisation dun driver ASIO et de plugins au format VST et finiront par
vous expliquer comment on peut reacutealiser un mixage en temps reacuteel par
logiciel entre le son provenant du media et celui provenant du micro
LAPI direct sound (partie de direct show utiliseacutee pour deacutecoder le son du
meacutedia) comporte effectivement un composant mixer mais qui nest pas
utilisable dans notre cas car le son traiteacute en provenance du micro a
emprunteacute une voie non Microsoftienne (utilisation de drivers asio) et vous
savez ce quil en coucircte de ne pas rouler sur les sentiers recommandeacutes par
Bill Gates Non le mixage est effectueacute 100 en software
Etant donneacute que nous avons ducirc refaire linterface graphique dans son
inteacutegraliteacute nous ne rentrerons pas dans les deacutetails techniques ici nous
rappellerons juste ces fonctionnaliteacutes
7
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
bull Introduction (p 4)
o Preacuteface o Rappel du travail demandeacute o En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport o Inteacuterecirct dun tel logiciel alors quil existe media player winamp
des logiciels de musique pro etc bull Lexistant le logiciel ADA Player (p 7)
o Preacutesentation des fonctionnaliteacutes analyse technique o Lire un meacutedia agrave laide du framework Net et de lAPI direct
show o Utilisation de drivers asio
Asio cest quoi ADA Player est lecteur multimeacutedia ET un VST host Comment on reacutealise un mixage entre le son du micro et
celui du meacutedia bull Notre approche mettre le noyau en dll refaire linterface
graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram (p 14)
o Partage du projet en tacircches et affectations o Reacutealisation dun meacutedia player basique o Transformation du noyau en dll reconception o Apprentissage de C deacuteveloppement dune gui basique o Code manageacute et non Manageacute C parle agrave C++ Mais cest
comme JNI en plus simple o Etude dune solution pour le support de skins o Etude des SDK AsioVST
bull Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees (p 27) o Une nouvelle Playlist o Une nouvelle interface de configuration des drivers asio o Gestion des preacutefeacuterences utilisateur o Inteacutegration dun gestionnaire de plugins VST externe o Possibiliteacute de plugger une chaicircne de traitement sonore agrave
plusieurs endroits o En bref quels sont les apports de XTram
bull Bilan (p 40) o Technique o Personnel
bull Conclusion (p 42) bull Annexes (p 42)
o Webographiebibliographie o Architecture des diffeacuterentes classesmodules o Guide de deacuteveloppement de skins o Compleacutement annexe (issu du rapport dADA Player) o Remerciements o Rapport et soutenance intermeacutediaires
3
Introduction Preacuteface Pour commencer si vous ecirctes en train de lire une version papier de ce
rapport ne vous eacutetonnez pas de la mise en page relativement simple Il
sagit lagrave en fait de la version imprimeacutee du document eacutelectronique
disponible sur la page TWiki de notre TER En effet notre rapport a eacuteteacute
reacutedigeacute sur le conseil de notre encadrant Michel Buffa directement sur le
Twiki afin de permettre un accegraves direct aux diffeacuterents liens La version sur
le Twiki contient par ailleurs de nombreux liens permettant au lecteur de
teacuteleacutecharger les diffeacuterents outils et de visiter les diffeacuterentes pages illustrant
nos propos mais ne faisant pas partie du rapport (avancement du TER
problegravemes rencontreacutes etc)
Rappel du travail demandeacute Ce projet consiste agrave refaire et agrave ameacuteliorer un prototype de lecteur
multimeacutedia similaire au meacutedia player de windows dans son approche
(utilisation des codecs installeacutes sur lOS Windows pour supporter les
diffeacuterents types de meacutedias) si ce nest quil permet pendant la lecture de
traiter en temps reacuteel le son qui entre par lentreacutee micro au travers dune
chaicircne de plugins de traitement sonores et le mixer agrave celui du meacutedia en
cours de lecture
Le prototype de lan dernier -ADA Player- deacuteveloppeacute par des eacutetudiants
dESSI2 est fonctionnel mais comporte de nombreux deacutefauts le
principal eacutetant quil a eacuteteacute deacuteveloppeacute agrave laide de la plate-forme Borland
C++ Builder tregraves peu utiliseacutee et que son interface graphique utilise des
composants Borland peu standards
Un autre deacutefaut est son systegraveme de skins non documenteacute qui rend
leacutevolution de son interface graphique compliqueacutee et non intuitive On
nous a demandeacute de refaire agrave partir de zeacutero toute linterface graphique du
logiciel A leacutepoque de nombreuses fonctionnaliteacutes figurant dans le cahier
des charges nont pu ecirctre reacutealiseacutees (comme par exemple de pouvoir
instancier des chaicircnes de traitement sonore pour traiter le son en
provenance du meacutedia joueacute ou encore le son apregraves le mix micromeacutedia
la version actuelle ne permet que de traiter le son du micro) et on nous a
demandeacute de les impleacutementer
4
En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport
Nous avons ducirc eacutenormeacutement retravailler la conception du logiciel
original et abandonner complegravetement son interface Par ailleurs une
partie du noyau de traitement sonore existant dans ADA Player a pu ecirctre
conserveacute nous en avons fait une librairie reacuteutilisable (une dll windows)
mais apregraves lavoir nettoyeacutee fiabiliseacutee et partiellement reconccedilue ce qui na
pas eacuteteacute une mince affaire Des problegravemes inheacuterents au changement de
plateforme de deacuteveloppement ont eacutegalement eacuteteacute longs agrave reacutegler comme le
changement dAPI pour le traitement des chaicircnes de caractegraveres etc
La solution choisie consiste agrave conserver le noyau sous forme de dll
en C++ non manageacute pour des raisons de performances (dans le
traitement sonore temps-reacuteel on gratte la milliseconde) et agrave utiliser le
langage C pour reacutealiser toute linterface graphique Lorsque nous
avons ajouteacute de nouvelles fonctionnaliteacutes bien entendu nous avons
travailleacute sur les deux parties (la partie C++ et la partie C)
Ce projet a neacutecessiteacute lapprentissage dun nouveau langage (C)
dun nouveau framework (direct sounddirect show) dune API de
traitement sonore relativement bas niveau (le SDK de Steinberg
utiliseacute pour la gestion des plugins de traitement sonores et
lutilisation de drivers au format ASIO pour le traitement temps
reacuteel du son) de deux outils de deacuteveloppement diffeacuterents (Borland
C++ Builder et Visual Studio Net 2003) et leacutetude dun projet
relativement complexe parfois peu ou pas documenteacute
Nous avons reacuteussi agrave mener agrave bien ce projet comme vous allez pouvoir le
constater dans les sections suivantes mais auparavant laissez-nous vous
eacuteclairer sur quelques points particuliers avant de rentrer dans les
deacutetails
Inteacuterecirct dun tel logiciel alors quil existe media player winamp des logiciels de musique pro etc
Pourquoi traiter le son en provenance du micro et le mixer agrave celui du
meacutedia Les applications sont multiples
bull Chanter dans un micro par-dessus une musique daccompagnement
en ajoutant des effets sur la voix (reacuteverbeacuteration compression
eacutegalisation etc)
5
bull Brancher une guitare sur la prise micro traiter le son agrave laide de
simulation damplificateurs guitare (on parle de modeacutelisation
numeacuterique damplificateurs agrave lampe par exemple) et jouer sur une
musique Utile pour apprendre des morceaux et sentraicircner
bull Faire le doublage dune videacuteo amateur etc
Lutilisation de codecs rend le logiciel peu portable car tregraves lieacute agrave windows
mais cette approche composants permet de supporter de maniegravere tregraves
simple tous les formats existants ou agrave venir Par exemple il existe un
codec permettant de lire des fichiers de karaokeacute au format mp3 dans ce
cas on pourra chanter ou jouer de la guitare tout en suivant les paroles agrave
leacutecran Ou bien si on deacutesire accompagner son groupe de rock preacutefeacutereacute sur
scegravene on lira un film (divx ou autre) et on pourra mixer sa guitare par-
dessus
Il nexiste actuellement aucun logiciel sur le marcheacute en freeware
shareware ou commercial permettant de faire ce qui vient decirctre
deacutecrit A ce titre ADA Player malgreacute ses deacutefauts a trouveacute son public
principalement des musiciens amateurs Mr Buffa a fait connaicirctre le
logiciel par le biais des forums du site httpwwwaudiofanzinefr et en a
fait de la pub sur la page web comment transformer son PC en multi-effet
pour guitare tregraves populaire qui propose ADA Player en teacuteleacutechargement
de mecircme quune documentation utilisateur bien illustreacutee
Le traitement du son se fait agrave laide de composants speacutecialiseacutes des
plugins au format VST utiliseacute par tous les logiciels de MAO y compris les
logiciels professionnels utiliseacutes en studio On trouve des milliers de plugins
agrave ce format permettant de reacutealiser une multitude de traitements On
trouve des multi-effets pour guitare produisant des sons rivalisant avec du
mateacuteriel hardware tregraves haut de gamme des plugins speacutecialiseacutes dans la
voix permettant de faire chanter juste mecircme si on a une voix de casserole
et quon chante faux des plugins qui vous donnent la voix de Dark Vador
etc
Seul problegraveme ces plugins fonctionnent agrave laide de drivers sonores au
format ASIO de Steinberg (la maison deacutedition du ceacutelegravebre seacutequenceur
Cubase) qui sont fournis avec des cartes sons pro ou semi-pro coucirctant au
bas mot 200 euros Ce type de driver autorise un traitement du son avec
une tregraves faible latence
6
On appelle latence le temps que met le son entrant pour ressortir une fois
traiteacute Les drivers asio avec une carte son ad hoc permettent dobtenir la
mecircme latence que le mateacuteriel 100 hardware cest-agrave-dire entre 2 et 10
ms Faire cohabiter deux types de drivers dans une mecircme application 1)
drivers direct sound pour pouvoir utiliser le systegraveme de codecs de
windows et 2) drivers asio pour le son temps-reacuteel a eacuteteacute un challenge qua
ducirc relever le groupe deacutetudiants ayant reacutealiseacute le prototype lan dernier
Lexistant le logiciel ADA Player Preacutesentation des fonctionnaliteacutes analyse technique
ADA Player est un lecteur multimeacutedia baseacute sur la technologie Direct Show
de Microsoft Dans une premier temps nous preacutesenterons les principes
dimpleacutementation dun tel lecteur agrave laide de cette API baseacutee sur
lutilisation de composants au sein dun framework relativement complexe
Cest par lagrave que nous avons commenceacute notre eacutetude et cest la premiegravere
chose que nous avons reacutealiseacutee lors du portage de lapplication
Dans un second temps nous donnerons des deacutetails techniques concernant
lutilisation dun driver ASIO et de plugins au format VST et finiront par
vous expliquer comment on peut reacutealiser un mixage en temps reacuteel par
logiciel entre le son provenant du media et celui provenant du micro
LAPI direct sound (partie de direct show utiliseacutee pour deacutecoder le son du
meacutedia) comporte effectivement un composant mixer mais qui nest pas
utilisable dans notre cas car le son traiteacute en provenance du micro a
emprunteacute une voie non Microsoftienne (utilisation de drivers asio) et vous
savez ce quil en coucircte de ne pas rouler sur les sentiers recommandeacutes par
Bill Gates Non le mixage est effectueacute 100 en software
Etant donneacute que nous avons ducirc refaire linterface graphique dans son
inteacutegraliteacute nous ne rentrerons pas dans les deacutetails techniques ici nous
rappellerons juste ces fonctionnaliteacutes
7
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Introduction Preacuteface Pour commencer si vous ecirctes en train de lire une version papier de ce
rapport ne vous eacutetonnez pas de la mise en page relativement simple Il
sagit lagrave en fait de la version imprimeacutee du document eacutelectronique
disponible sur la page TWiki de notre TER En effet notre rapport a eacuteteacute
reacutedigeacute sur le conseil de notre encadrant Michel Buffa directement sur le
Twiki afin de permettre un accegraves direct aux diffeacuterents liens La version sur
le Twiki contient par ailleurs de nombreux liens permettant au lecteur de
teacuteleacutecharger les diffeacuterents outils et de visiter les diffeacuterentes pages illustrant
nos propos mais ne faisant pas partie du rapport (avancement du TER
problegravemes rencontreacutes etc)
Rappel du travail demandeacute Ce projet consiste agrave refaire et agrave ameacuteliorer un prototype de lecteur
multimeacutedia similaire au meacutedia player de windows dans son approche
(utilisation des codecs installeacutes sur lOS Windows pour supporter les
diffeacuterents types de meacutedias) si ce nest quil permet pendant la lecture de
traiter en temps reacuteel le son qui entre par lentreacutee micro au travers dune
chaicircne de plugins de traitement sonores et le mixer agrave celui du meacutedia en
cours de lecture
Le prototype de lan dernier -ADA Player- deacuteveloppeacute par des eacutetudiants
dESSI2 est fonctionnel mais comporte de nombreux deacutefauts le
principal eacutetant quil a eacuteteacute deacuteveloppeacute agrave laide de la plate-forme Borland
C++ Builder tregraves peu utiliseacutee et que son interface graphique utilise des
composants Borland peu standards
Un autre deacutefaut est son systegraveme de skins non documenteacute qui rend
leacutevolution de son interface graphique compliqueacutee et non intuitive On
nous a demandeacute de refaire agrave partir de zeacutero toute linterface graphique du
logiciel A leacutepoque de nombreuses fonctionnaliteacutes figurant dans le cahier
des charges nont pu ecirctre reacutealiseacutees (comme par exemple de pouvoir
instancier des chaicircnes de traitement sonore pour traiter le son en
provenance du meacutedia joueacute ou encore le son apregraves le mix micromeacutedia
la version actuelle ne permet que de traiter le son du micro) et on nous a
demandeacute de les impleacutementer
4
En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport
Nous avons ducirc eacutenormeacutement retravailler la conception du logiciel
original et abandonner complegravetement son interface Par ailleurs une
partie du noyau de traitement sonore existant dans ADA Player a pu ecirctre
conserveacute nous en avons fait une librairie reacuteutilisable (une dll windows)
mais apregraves lavoir nettoyeacutee fiabiliseacutee et partiellement reconccedilue ce qui na
pas eacuteteacute une mince affaire Des problegravemes inheacuterents au changement de
plateforme de deacuteveloppement ont eacutegalement eacuteteacute longs agrave reacutegler comme le
changement dAPI pour le traitement des chaicircnes de caractegraveres etc
La solution choisie consiste agrave conserver le noyau sous forme de dll
en C++ non manageacute pour des raisons de performances (dans le
traitement sonore temps-reacuteel on gratte la milliseconde) et agrave utiliser le
langage C pour reacutealiser toute linterface graphique Lorsque nous
avons ajouteacute de nouvelles fonctionnaliteacutes bien entendu nous avons
travailleacute sur les deux parties (la partie C++ et la partie C)
Ce projet a neacutecessiteacute lapprentissage dun nouveau langage (C)
dun nouveau framework (direct sounddirect show) dune API de
traitement sonore relativement bas niveau (le SDK de Steinberg
utiliseacute pour la gestion des plugins de traitement sonores et
lutilisation de drivers au format ASIO pour le traitement temps
reacuteel du son) de deux outils de deacuteveloppement diffeacuterents (Borland
C++ Builder et Visual Studio Net 2003) et leacutetude dun projet
relativement complexe parfois peu ou pas documenteacute
Nous avons reacuteussi agrave mener agrave bien ce projet comme vous allez pouvoir le
constater dans les sections suivantes mais auparavant laissez-nous vous
eacuteclairer sur quelques points particuliers avant de rentrer dans les
deacutetails
Inteacuterecirct dun tel logiciel alors quil existe media player winamp des logiciels de musique pro etc
Pourquoi traiter le son en provenance du micro et le mixer agrave celui du
meacutedia Les applications sont multiples
bull Chanter dans un micro par-dessus une musique daccompagnement
en ajoutant des effets sur la voix (reacuteverbeacuteration compression
eacutegalisation etc)
5
bull Brancher une guitare sur la prise micro traiter le son agrave laide de
simulation damplificateurs guitare (on parle de modeacutelisation
numeacuterique damplificateurs agrave lampe par exemple) et jouer sur une
musique Utile pour apprendre des morceaux et sentraicircner
bull Faire le doublage dune videacuteo amateur etc
Lutilisation de codecs rend le logiciel peu portable car tregraves lieacute agrave windows
mais cette approche composants permet de supporter de maniegravere tregraves
simple tous les formats existants ou agrave venir Par exemple il existe un
codec permettant de lire des fichiers de karaokeacute au format mp3 dans ce
cas on pourra chanter ou jouer de la guitare tout en suivant les paroles agrave
leacutecran Ou bien si on deacutesire accompagner son groupe de rock preacutefeacutereacute sur
scegravene on lira un film (divx ou autre) et on pourra mixer sa guitare par-
dessus
Il nexiste actuellement aucun logiciel sur le marcheacute en freeware
shareware ou commercial permettant de faire ce qui vient decirctre
deacutecrit A ce titre ADA Player malgreacute ses deacutefauts a trouveacute son public
principalement des musiciens amateurs Mr Buffa a fait connaicirctre le
logiciel par le biais des forums du site httpwwwaudiofanzinefr et en a
fait de la pub sur la page web comment transformer son PC en multi-effet
pour guitare tregraves populaire qui propose ADA Player en teacuteleacutechargement
de mecircme quune documentation utilisateur bien illustreacutee
Le traitement du son se fait agrave laide de composants speacutecialiseacutes des
plugins au format VST utiliseacute par tous les logiciels de MAO y compris les
logiciels professionnels utiliseacutes en studio On trouve des milliers de plugins
agrave ce format permettant de reacutealiser une multitude de traitements On
trouve des multi-effets pour guitare produisant des sons rivalisant avec du
mateacuteriel hardware tregraves haut de gamme des plugins speacutecialiseacutes dans la
voix permettant de faire chanter juste mecircme si on a une voix de casserole
et quon chante faux des plugins qui vous donnent la voix de Dark Vador
etc
Seul problegraveme ces plugins fonctionnent agrave laide de drivers sonores au
format ASIO de Steinberg (la maison deacutedition du ceacutelegravebre seacutequenceur
Cubase) qui sont fournis avec des cartes sons pro ou semi-pro coucirctant au
bas mot 200 euros Ce type de driver autorise un traitement du son avec
une tregraves faible latence
6
On appelle latence le temps que met le son entrant pour ressortir une fois
traiteacute Les drivers asio avec une carte son ad hoc permettent dobtenir la
mecircme latence que le mateacuteriel 100 hardware cest-agrave-dire entre 2 et 10
ms Faire cohabiter deux types de drivers dans une mecircme application 1)
drivers direct sound pour pouvoir utiliser le systegraveme de codecs de
windows et 2) drivers asio pour le son temps-reacuteel a eacuteteacute un challenge qua
ducirc relever le groupe deacutetudiants ayant reacutealiseacute le prototype lan dernier
Lexistant le logiciel ADA Player Preacutesentation des fonctionnaliteacutes analyse technique
ADA Player est un lecteur multimeacutedia baseacute sur la technologie Direct Show
de Microsoft Dans une premier temps nous preacutesenterons les principes
dimpleacutementation dun tel lecteur agrave laide de cette API baseacutee sur
lutilisation de composants au sein dun framework relativement complexe
Cest par lagrave que nous avons commenceacute notre eacutetude et cest la premiegravere
chose que nous avons reacutealiseacutee lors du portage de lapplication
Dans un second temps nous donnerons des deacutetails techniques concernant
lutilisation dun driver ASIO et de plugins au format VST et finiront par
vous expliquer comment on peut reacutealiser un mixage en temps reacuteel par
logiciel entre le son provenant du media et celui provenant du micro
LAPI direct sound (partie de direct show utiliseacutee pour deacutecoder le son du
meacutedia) comporte effectivement un composant mixer mais qui nest pas
utilisable dans notre cas car le son traiteacute en provenance du micro a
emprunteacute une voie non Microsoftienne (utilisation de drivers asio) et vous
savez ce quil en coucircte de ne pas rouler sur les sentiers recommandeacutes par
Bill Gates Non le mixage est effectueacute 100 en software
Etant donneacute que nous avons ducirc refaire linterface graphique dans son
inteacutegraliteacute nous ne rentrerons pas dans les deacutetails techniques ici nous
rappellerons juste ces fonctionnaliteacutes
7
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
En deux mots le travail reacutealiseacute preacutesenteacute dans ce rapport
Nous avons ducirc eacutenormeacutement retravailler la conception du logiciel
original et abandonner complegravetement son interface Par ailleurs une
partie du noyau de traitement sonore existant dans ADA Player a pu ecirctre
conserveacute nous en avons fait une librairie reacuteutilisable (une dll windows)
mais apregraves lavoir nettoyeacutee fiabiliseacutee et partiellement reconccedilue ce qui na
pas eacuteteacute une mince affaire Des problegravemes inheacuterents au changement de
plateforme de deacuteveloppement ont eacutegalement eacuteteacute longs agrave reacutegler comme le
changement dAPI pour le traitement des chaicircnes de caractegraveres etc
La solution choisie consiste agrave conserver le noyau sous forme de dll
en C++ non manageacute pour des raisons de performances (dans le
traitement sonore temps-reacuteel on gratte la milliseconde) et agrave utiliser le
langage C pour reacutealiser toute linterface graphique Lorsque nous
avons ajouteacute de nouvelles fonctionnaliteacutes bien entendu nous avons
travailleacute sur les deux parties (la partie C++ et la partie C)
Ce projet a neacutecessiteacute lapprentissage dun nouveau langage (C)
dun nouveau framework (direct sounddirect show) dune API de
traitement sonore relativement bas niveau (le SDK de Steinberg
utiliseacute pour la gestion des plugins de traitement sonores et
lutilisation de drivers au format ASIO pour le traitement temps
reacuteel du son) de deux outils de deacuteveloppement diffeacuterents (Borland
C++ Builder et Visual Studio Net 2003) et leacutetude dun projet
relativement complexe parfois peu ou pas documenteacute
Nous avons reacuteussi agrave mener agrave bien ce projet comme vous allez pouvoir le
constater dans les sections suivantes mais auparavant laissez-nous vous
eacuteclairer sur quelques points particuliers avant de rentrer dans les
deacutetails
Inteacuterecirct dun tel logiciel alors quil existe media player winamp des logiciels de musique pro etc
Pourquoi traiter le son en provenance du micro et le mixer agrave celui du
meacutedia Les applications sont multiples
bull Chanter dans un micro par-dessus une musique daccompagnement
en ajoutant des effets sur la voix (reacuteverbeacuteration compression
eacutegalisation etc)
5
bull Brancher une guitare sur la prise micro traiter le son agrave laide de
simulation damplificateurs guitare (on parle de modeacutelisation
numeacuterique damplificateurs agrave lampe par exemple) et jouer sur une
musique Utile pour apprendre des morceaux et sentraicircner
bull Faire le doublage dune videacuteo amateur etc
Lutilisation de codecs rend le logiciel peu portable car tregraves lieacute agrave windows
mais cette approche composants permet de supporter de maniegravere tregraves
simple tous les formats existants ou agrave venir Par exemple il existe un
codec permettant de lire des fichiers de karaokeacute au format mp3 dans ce
cas on pourra chanter ou jouer de la guitare tout en suivant les paroles agrave
leacutecran Ou bien si on deacutesire accompagner son groupe de rock preacutefeacutereacute sur
scegravene on lira un film (divx ou autre) et on pourra mixer sa guitare par-
dessus
Il nexiste actuellement aucun logiciel sur le marcheacute en freeware
shareware ou commercial permettant de faire ce qui vient decirctre
deacutecrit A ce titre ADA Player malgreacute ses deacutefauts a trouveacute son public
principalement des musiciens amateurs Mr Buffa a fait connaicirctre le
logiciel par le biais des forums du site httpwwwaudiofanzinefr et en a
fait de la pub sur la page web comment transformer son PC en multi-effet
pour guitare tregraves populaire qui propose ADA Player en teacuteleacutechargement
de mecircme quune documentation utilisateur bien illustreacutee
Le traitement du son se fait agrave laide de composants speacutecialiseacutes des
plugins au format VST utiliseacute par tous les logiciels de MAO y compris les
logiciels professionnels utiliseacutes en studio On trouve des milliers de plugins
agrave ce format permettant de reacutealiser une multitude de traitements On
trouve des multi-effets pour guitare produisant des sons rivalisant avec du
mateacuteriel hardware tregraves haut de gamme des plugins speacutecialiseacutes dans la
voix permettant de faire chanter juste mecircme si on a une voix de casserole
et quon chante faux des plugins qui vous donnent la voix de Dark Vador
etc
Seul problegraveme ces plugins fonctionnent agrave laide de drivers sonores au
format ASIO de Steinberg (la maison deacutedition du ceacutelegravebre seacutequenceur
Cubase) qui sont fournis avec des cartes sons pro ou semi-pro coucirctant au
bas mot 200 euros Ce type de driver autorise un traitement du son avec
une tregraves faible latence
6
On appelle latence le temps que met le son entrant pour ressortir une fois
traiteacute Les drivers asio avec une carte son ad hoc permettent dobtenir la
mecircme latence que le mateacuteriel 100 hardware cest-agrave-dire entre 2 et 10
ms Faire cohabiter deux types de drivers dans une mecircme application 1)
drivers direct sound pour pouvoir utiliser le systegraveme de codecs de
windows et 2) drivers asio pour le son temps-reacuteel a eacuteteacute un challenge qua
ducirc relever le groupe deacutetudiants ayant reacutealiseacute le prototype lan dernier
Lexistant le logiciel ADA Player Preacutesentation des fonctionnaliteacutes analyse technique
ADA Player est un lecteur multimeacutedia baseacute sur la technologie Direct Show
de Microsoft Dans une premier temps nous preacutesenterons les principes
dimpleacutementation dun tel lecteur agrave laide de cette API baseacutee sur
lutilisation de composants au sein dun framework relativement complexe
Cest par lagrave que nous avons commenceacute notre eacutetude et cest la premiegravere
chose que nous avons reacutealiseacutee lors du portage de lapplication
Dans un second temps nous donnerons des deacutetails techniques concernant
lutilisation dun driver ASIO et de plugins au format VST et finiront par
vous expliquer comment on peut reacutealiser un mixage en temps reacuteel par
logiciel entre le son provenant du media et celui provenant du micro
LAPI direct sound (partie de direct show utiliseacutee pour deacutecoder le son du
meacutedia) comporte effectivement un composant mixer mais qui nest pas
utilisable dans notre cas car le son traiteacute en provenance du micro a
emprunteacute une voie non Microsoftienne (utilisation de drivers asio) et vous
savez ce quil en coucircte de ne pas rouler sur les sentiers recommandeacutes par
Bill Gates Non le mixage est effectueacute 100 en software
Etant donneacute que nous avons ducirc refaire linterface graphique dans son
inteacutegraliteacute nous ne rentrerons pas dans les deacutetails techniques ici nous
rappellerons juste ces fonctionnaliteacutes
7
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
bull Brancher une guitare sur la prise micro traiter le son agrave laide de
simulation damplificateurs guitare (on parle de modeacutelisation
numeacuterique damplificateurs agrave lampe par exemple) et jouer sur une
musique Utile pour apprendre des morceaux et sentraicircner
bull Faire le doublage dune videacuteo amateur etc
Lutilisation de codecs rend le logiciel peu portable car tregraves lieacute agrave windows
mais cette approche composants permet de supporter de maniegravere tregraves
simple tous les formats existants ou agrave venir Par exemple il existe un
codec permettant de lire des fichiers de karaokeacute au format mp3 dans ce
cas on pourra chanter ou jouer de la guitare tout en suivant les paroles agrave
leacutecran Ou bien si on deacutesire accompagner son groupe de rock preacutefeacutereacute sur
scegravene on lira un film (divx ou autre) et on pourra mixer sa guitare par-
dessus
Il nexiste actuellement aucun logiciel sur le marcheacute en freeware
shareware ou commercial permettant de faire ce qui vient decirctre
deacutecrit A ce titre ADA Player malgreacute ses deacutefauts a trouveacute son public
principalement des musiciens amateurs Mr Buffa a fait connaicirctre le
logiciel par le biais des forums du site httpwwwaudiofanzinefr et en a
fait de la pub sur la page web comment transformer son PC en multi-effet
pour guitare tregraves populaire qui propose ADA Player en teacuteleacutechargement
de mecircme quune documentation utilisateur bien illustreacutee
Le traitement du son se fait agrave laide de composants speacutecialiseacutes des
plugins au format VST utiliseacute par tous les logiciels de MAO y compris les
logiciels professionnels utiliseacutes en studio On trouve des milliers de plugins
agrave ce format permettant de reacutealiser une multitude de traitements On
trouve des multi-effets pour guitare produisant des sons rivalisant avec du
mateacuteriel hardware tregraves haut de gamme des plugins speacutecialiseacutes dans la
voix permettant de faire chanter juste mecircme si on a une voix de casserole
et quon chante faux des plugins qui vous donnent la voix de Dark Vador
etc
Seul problegraveme ces plugins fonctionnent agrave laide de drivers sonores au
format ASIO de Steinberg (la maison deacutedition du ceacutelegravebre seacutequenceur
Cubase) qui sont fournis avec des cartes sons pro ou semi-pro coucirctant au
bas mot 200 euros Ce type de driver autorise un traitement du son avec
une tregraves faible latence
6
On appelle latence le temps que met le son entrant pour ressortir une fois
traiteacute Les drivers asio avec une carte son ad hoc permettent dobtenir la
mecircme latence que le mateacuteriel 100 hardware cest-agrave-dire entre 2 et 10
ms Faire cohabiter deux types de drivers dans une mecircme application 1)
drivers direct sound pour pouvoir utiliser le systegraveme de codecs de
windows et 2) drivers asio pour le son temps-reacuteel a eacuteteacute un challenge qua
ducirc relever le groupe deacutetudiants ayant reacutealiseacute le prototype lan dernier
Lexistant le logiciel ADA Player Preacutesentation des fonctionnaliteacutes analyse technique
ADA Player est un lecteur multimeacutedia baseacute sur la technologie Direct Show
de Microsoft Dans une premier temps nous preacutesenterons les principes
dimpleacutementation dun tel lecteur agrave laide de cette API baseacutee sur
lutilisation de composants au sein dun framework relativement complexe
Cest par lagrave que nous avons commenceacute notre eacutetude et cest la premiegravere
chose que nous avons reacutealiseacutee lors du portage de lapplication
Dans un second temps nous donnerons des deacutetails techniques concernant
lutilisation dun driver ASIO et de plugins au format VST et finiront par
vous expliquer comment on peut reacutealiser un mixage en temps reacuteel par
logiciel entre le son provenant du media et celui provenant du micro
LAPI direct sound (partie de direct show utiliseacutee pour deacutecoder le son du
meacutedia) comporte effectivement un composant mixer mais qui nest pas
utilisable dans notre cas car le son traiteacute en provenance du micro a
emprunteacute une voie non Microsoftienne (utilisation de drivers asio) et vous
savez ce quil en coucircte de ne pas rouler sur les sentiers recommandeacutes par
Bill Gates Non le mixage est effectueacute 100 en software
Etant donneacute que nous avons ducirc refaire linterface graphique dans son
inteacutegraliteacute nous ne rentrerons pas dans les deacutetails techniques ici nous
rappellerons juste ces fonctionnaliteacutes
7
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
On appelle latence le temps que met le son entrant pour ressortir une fois
traiteacute Les drivers asio avec une carte son ad hoc permettent dobtenir la
mecircme latence que le mateacuteriel 100 hardware cest-agrave-dire entre 2 et 10
ms Faire cohabiter deux types de drivers dans une mecircme application 1)
drivers direct sound pour pouvoir utiliser le systegraveme de codecs de
windows et 2) drivers asio pour le son temps-reacuteel a eacuteteacute un challenge qua
ducirc relever le groupe deacutetudiants ayant reacutealiseacute le prototype lan dernier
Lexistant le logiciel ADA Player Preacutesentation des fonctionnaliteacutes analyse technique
ADA Player est un lecteur multimeacutedia baseacute sur la technologie Direct Show
de Microsoft Dans une premier temps nous preacutesenterons les principes
dimpleacutementation dun tel lecteur agrave laide de cette API baseacutee sur
lutilisation de composants au sein dun framework relativement complexe
Cest par lagrave que nous avons commenceacute notre eacutetude et cest la premiegravere
chose que nous avons reacutealiseacutee lors du portage de lapplication
Dans un second temps nous donnerons des deacutetails techniques concernant
lutilisation dun driver ASIO et de plugins au format VST et finiront par
vous expliquer comment on peut reacutealiser un mixage en temps reacuteel par
logiciel entre le son provenant du media et celui provenant du micro
LAPI direct sound (partie de direct show utiliseacutee pour deacutecoder le son du
meacutedia) comporte effectivement un composant mixer mais qui nest pas
utilisable dans notre cas car le son traiteacute en provenance du micro a
emprunteacute une voie non Microsoftienne (utilisation de drivers asio) et vous
savez ce quil en coucircte de ne pas rouler sur les sentiers recommandeacutes par
Bill Gates Non le mixage est effectueacute 100 en software
Etant donneacute que nous avons ducirc refaire linterface graphique dans son
inteacutegraliteacute nous ne rentrerons pas dans les deacutetails techniques ici nous
rappellerons juste ces fonctionnaliteacutes
7
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Lire un meacutedia agrave laide du framework Net et de lAPI direct show
La premiegravere fonctionnaliteacute que remplissait ADA Player eacutetait non seulement
de lire des fichiers musicaux mais aussi des fichiers videacuteos en fait de
tout type du moment que les codecs (un codec est un composant de
codage ou de deacutecodage ou les deux agrave la fois) adeacutequats eacutetaient installeacutes
sur la machine La solution consiste agrave utiliser des fonctions de lAPI Direct
Show de microsoft
DirectShow est une sous partie de directX qui gegravere lui-mecircme lrsquoensemble
du multimeacutedia sous windows Les fonctions de directShow sont donc
utilisables directement agrave lrsquoaide de leur API De ce fait lrsquoutilisateur pourra
lire gracircce agrave ADA Player tous les formats lisibles par Windows cela allant
du mp3 au mpeg en passant par le avi et le cdg (format karaokeacute) Pour
se rendre compte que les fonctions travaillent directement avec le cœur
de windows il suffit drsquoouvrir un fichier image jpg et se rendre compte
qursquoil srsquoaffiche
Si on regarde plus en deacutetail le fonctionnement de Direct Show il est en
apparence simple tout meacutedia est composeacute de son de video de textes
etc Meacutedia est dabord deacutecoupeacute en plusieurs fluxs en fonction du type
Par exemple un divx sera deacutecoupeacute en un flux sonore un flux videacuteo et
peut-ecirctre un flux pour les sous-titres Lorsquune application utilise Direct
Show pour lire le meacutedia juste apregraves le deacutecoupage un graphe de
composants est construit nommeacutee le laquo graph directShow raquo Dans tout
graphe de ce type il y a au moins une source qui peut ecirctre un fichier (le
meacutedia deacutecoupeacute en fluxs) un peacuteripheacuterique ou mecircme une adresse distante
ainsi qursquoune sortie (renderer dans le jargon de directShow) Enfin au
milieu on retrouve les filtres les composants Direct Show (deacutecodeur
mp3 divx etc) qui sont chacun composeacutes drsquoau moins une entreacutee et une
sortie nommeacutes laquo pins raquo (ou broches) Dans le graphe sont donc ajouteacutes
les filtres relieacutes par leurs broches On obtient ainsi un chemin de lrsquoentreacutee
vers la sortie qursquoempruntera le meacutedia (et ses flux) lors de sa lecture Un
outil reacuteellement pratique pour visualiser ce genre de parcours est distribueacute
avec le SDK DirectX il se nomme GraphEdit Il permet en outre de
manipuler agrave la souris le graphe en inseacuterant des composants en les
reliant en modifiant leurs proprieacuteteacutes un peu agrave la maniegravere dun IDE Java
comme JBuilder lorsquon manipule des composants Java (java beans)
8
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
En voici un exemple simple
Ici la source est un fichier mp3 Dans ce cas les donneacutes vont transiter vers
le laquo Stream Splitter raquo (qui extrait les fluxs) puis vers le deacutecodeur pour
enfin terminer sur la sortie audio de la carte son
Nous venons de voir comment on peut jouer un meacutedia avec Direct
Show Voyons maintenant comment on peut traiter en temps reacuteel le son
qui provient de lentreacutee micro de la carte son (en fait de nimporte quelle
entreacutee line in micro ou autre si la carte possegravede plusieurs entreacutees
comme les cartes sont speacutecialiseacutees dans la MAO)
Utilisation de drivers asio
Asio cest quoi
Le logiciel ADA Player en plus de pouvoir se reposer sur les drivers
standard de windows peut fonctionner eacutegalement avec des drivers ASIO
Seuls ces drivers permettent de traiter le son sans latence et dutiliser des
logiciels et composants de traitement issus du monde professionnel en
MAO comme les plugins VSTs dont vous navez pas fini dentendre parler
puisque leur support est la grande originaliteacute du logiciel que nous avons
deacuteveloppeacute dans ce TER
Le terme ASIO est une abreacuteviation de Audio Streaming Input Output
(En franccedilais entreacuteesortie de flux audio) ASIO est une architecture de
driver de cartes audionumeacuteriques creacuteeacutee par la socieacuteteacute Steinberg Linteacuterecirct
majeur de lutilisation de tels drivers est la faible latence quils autorisent
Cela signifie que le temps mis par un signal entre son entreacutee et sa sortie
dans la carte son apregraves traitements eacuteventuels est tregraves faible (environ
2ms)
Ces drivers ASIO se montrent beaucoup plus performants que leurs
homologues standard Windows (DirectSound) On en conclut donc quafin
9
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
que leur logiciel soit bel et bien efficace et permette de mixer le son micro
agrave celui du meacutedia sans latence les concepteurs dADA Player ont eacuteteacute
contraints dutiliser les drivers ASIO
Mais un problegraveme persistait alors seules les cartes son professionnelles
supportent la norme ASIO et il eacutetait agrave priori impossible dutiliser un tel
logiciel sur des cartes son classiques
Heureusement un driver geacuteneacuterique du nom dASIO4ALL deacuteveloppeacute par
un programmeur allemand permet dutiliser la norme ASIO sur une
machine eacutequipeacutee dune carte son standard (ex portable) en utilisant un
mode non documenteacute des couches basses de direct Sound En reacutealiteacute
asio4all est un hack geacutenial un wrapper autour dun driver windows utiliseacute
dans un mode exclusif Avec asio4all une seule application peut utiliser la
carte son agrave la fois mais enfin on peut traiter le son en temps reacuteel sur un
ordinateur standard sans se ruiner en coucircteuse cartes sons Ce driver
gratuit est sorti peu de temps avant que Mr Buffa ne propose le sujet aux
eacutelegraveves dEssi2 lan dernier
Reacutesumons si on utilise le driver asio4all on peut utiliser les softs
professionnels Comment un logiciel fait pour traiter le son Il utilise des
plugins au format VST la norme en MAO Un tel logiciel sappelle un VST
Host Il en existe plusieurs des gros comme Cubase le seacutequencer
reacutefeacuterence aujourdhui et de tout petits gratuits qui font le strict
minimum traiter le son entrant au travers dune chaicircne de plugins VST et
le ressortir sur la sortie de la carte son Chainer de la socieacuteteacute Xluptop est
un tel petit gestionnaire de plugins un petit VST Host Problegraveme si je
lance ce logiciel je ne peux pas utiliser un autre lecteur multimeacutedia
comme Winamp ou le mediaplayer il ny aura pas de son car le driver
asio4all utiliseacute par mon VST Host garde la carte son pour lui seul il est
en mode exclusif
Donc lideacutee de Mr Buffa lorsquil a proposeacute le sujet a eacuteteacute la suivante
faisons un lecteur multimeacutedia qui fasse aussi VST host
ADA Player est lecteur multimeacutedia ET un VST host
ADA en plus decirctre un media player classique est aussi un VST Host Il agit
agrave la maniegravere de Spin Audio FX Processor ou encore Xluptop chainer
cest agrave dire quil permet de charger et de manager des plugins VST les
10
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
utiliser pour traiter le son en provenance du micro mixer le tout au son
du meacutedia en cours de lecture
Un exemple de VST HOST le logiciel Spin Audio FX Processor
Les plugins VST (acronyme de Virtual Studio Technology) sont une norme
(en vigueur dans la MAO) deacutefinie par la socieacuteteacute Steinberg pour la creacuteation
dinstruments virtuels Ce sont en fait tout simplement des dll (librairies)
qui sont utiliseacutes par la plupart des logiciels de MAO Le son entrant par la
carte son passe alors par un ou plusieurs effets (car il est possible de
creacuteer des listes de plugins on les appelle des chaicircnes) pour sortir enfin
traiteacute et modifieacute
De nos jours il existe des milliers de plugins permettant de modifier la
voix ou le son de sa guitare selon ses deacutesirs les plus fous Il est donc
possible comme il plait agrave Mr Buffa de jouer chez soit de la guitare avec
le son mythique de ZZtop en y appliquant par exemple des effets tels que
reverb ou encore delay(echo)
La gestion dun plugin VST par un VST Host classique est simple Il suffit
au logiciel de charger la dll du plugin et dutiliser les meacutethodes adeacutequates
pour deacutefinir ses paramegravetres (taille des buffers freacutequence
deacutechantillonnage) La partie VST Host dADA Player v2 gegravere tous les
plugins de toutes les versions infeacuterieure agrave 23 Elle possegravede
malheureusement certaines limitations certains plugins ne sont pas
reconnus son ergonomie laisse agrave deacutesirer le logiciel est assez lourd
lorsquon veut lui faire deacutetecter des plugins nouvellement installeacutes sur
11
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
lordinateur (il rescanne tous les chemins de recherche) il ne permet pas
de chargersauvegarder des configurations On nous a demandeacute dans
notre projet dameacuteliorer tous ces points
Voici la partie VST Host du logiciel ADA Player V2
Comment on reacutealise un mixage entre le son du micro et celui du meacutedia
Lors de louverture dun fichier videacuteo ou karaokeacute avec graphEdit on peut
se rendre compte que le graphe est seacutepareacute en deux parties distinctes une
pour la videacuteo lautre pour laudio
Malheureusement le fait dutiliser des drivers ASIO4ALL qui utilise la
sortie son de maniegravere exclusive empecircche de continuer agrave envoyer le son agrave
directSound lorsque le micro est actif Il est donc impossible pour reacutealiser
un mix dajouter dans le graphe un filtre qui ajouterait tout simplement la
voix au flux audio (il existe en effet des composants direct show standards
qui permettraient de faire ce mixage) En gros on peut utiliser
uniquement une partie de direct show pour deacutecoder le meacutedia mais pas les
composants speacutecifiques au rendu du son Ceux-ce se plaignent que la
carte son est deacutejagrave utiliseacutee Normal la partie asiotraitement du son du
micro lutilise deacutejagrave
La solution adopteacutee par les concepteurs dADA Player a eacuteteacute de transmettre
agrave ASIO le flux sonore quil meacutelangera lui mecircme au son du micro (entreacutee
de la carte son) Le mixage est donc effectueacute 100 en logiciel dans le
code du noyau de Ada Player
12
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Le filtre directSound a donc naturellement eacuteteacute enleveacute du graphe
directShow et a eacuteteacute remplaceacute par un autre filtre nommeacute SampleGrabber
qui est fourni dans lAPI de DirectX Un SampleGrabber est comme son
nom lrsquoindique un filtre qui voit passer des samples des eacutechantillons
Dhabitude ce filtre est utiliseacute dans une tout autre application Il permet
par exemple dextraire une image dune videacuteo en lappliquant sur son flux
Dans notre cas le SampleGrabber est utiliseacute pour prendre le flux audio et
le transmettre agrave une fonction de callback situeacutee dans notre logiciel avant
quon le mixe au flux sonore en provenance du micro et quon lenvoie
dans la carte son via asio Enfin ce filtre doit ecirctre raccordeacute agrave quelque
chose qui sera un filtre inactif le NullRenderer A ce niveau le flot est
en PCM DATA (voir explications en annexe pour les curieux)
Enfin comme il est expliqueacute dans le rapport dADA player les buffers
venant du meacutedia narrivent pas agrave la mecircme vitesse que ceux en
provenance du micro Ces buffers se dirigent donc alors vers une fonction
de deacutecoupage (la fonction de callback) qui va les seacuteparer en bloc de taille
eacutegale agrave celle des buffers micro et les placer dans une liste dattente avant
decirctre utiliseacutes Pour la suite cest la partie ASIO qui se charge du mix et
de fondre le son que lon lui envoie avec celui du micro
Le graphe que lon obtient apregraves ces modifications est de ce type
13
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Lopeacuteration syntheacutetiseacutee est donc facile agrave comprendre Le son du meacutedia
joueacute est reacutecupeacutereacute par le filtre SampleGrabber et meacutelangeacute au son du
micro (qui est passeacute par les effets sonores VST) le tout est enfin sorti par
le driver ASIO Le mix est enfin effectueacute
Mais un veacuteritable mix nest pas complet si lon ne peut pas reacuteellement
meacutelanger agrave sa guise les deux sources ADA Player posseacutedait donc une
fonction qui permettait de modifier le volume pour favoriser le micro ou le
son du meacutedia La fonction est simple elle est de cette forme SON_FINAL
= a SON_MICRO + b SON_MEDIA les valeurs a et b eacutetant des
coefficients compris entre 0 et 1
Voici donc le mixer de son graphique dADA Player
En balanccedilant donc le curseur dun coteacute agrave lautre lutilisateur peut obtenir
un mix qui mettra plus en valeur le media (si il chante ou joue mal par
exemple) ou son microguitare et les effets qui y sont appliqueacutes
Notre approche mettre le noyau en dll refaire linterface graphique rajouter les fonctionnaliteacutes manquantes pour enfin donner naissance agrave un tout nouveau logiciel XTram Partage du projet en tacircches et affectations
Les tacircches ci-dessous ont eacuteteacute deacutetermineacutees degraves le deacutebut du projet Elles se
sont deacuterouleacutees seacutequentiellement mais avec toujours trois ou quatre tacircches
en parallegravele Voir diagramme de Gant un peu plus loin Nous avons preacuteciseacute
entre parenthegravese agrave la fin de chaque description le nom des personnes en
charge de la tacircche
14
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
1 Degraves le deacutebut essayer de recompiler le code du projet existant
avec Borland C++ Builder lIDE utiliseacute par les auteurs dAda Player
(Tout le monde)
2 Etudier lAPI direct show (qui contient directSound et directShow)
analyser le code de ADA Player et extraire les classes concernant la
partie media player (non graphique) et la porter sous Visual Studio
2003 dans lideacutee de construire un embryon de lecteur multimeacutedia en
C (Michael Adrien)
3 Apprendre C au travers de petits tutoriaux commencer agrave faire une
gui basique (Teacuterence)
4 Recherche de solutions propres pour que la gui puisse supporter des
skins (tregraves agrave la mode dans le monde des logiciels de musique
important si on veut que le grand public ladopte) (Teacuterence) Petit
programme veacuterifiant si le skin est bien formeacute (Michael)
5 Etudier les SDKs de steinberg pour comprendre comment utiliser les
drivers asio et comment marchent les plugins VST En mecircme temps
regarder comment ces outils ont eacuteteacute utiliseacutes dans ADA Player (Remi)
6 Extraire de ADA Player la partie AsioVSTmixage et la recompiler
sous Visual Studio 2003 (Remi)
7 Une fois que le mini lecteur et que la partie asiovst compilent
sous VS joindre ces deux parties pour en faire une dll C++ (Remi)
8 Une fois la dll precircte lutiliser depuis linterface graphique codeacutee en
C On est toujours avec un proto archi-basique (Teacuterence)
9 Refondement complet de la playlist en C (ajout reacutecursif de
reacutepertoires dragndrop random )(Michael)
10 Ensuite et de maniegravere increacutementale ajouter les nouvelles
fonctionnaliteacutes dans la DLL et en parallegravele mettre agrave jour la gui et enfin
obtenir notre logiciel XTram sous sa forme finale (Remi Adrien)
Voici donc le diagramme de Gantt repreacutesentant leacutevolution de notre
travail
15
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Diagramme de Gantt
Reacutealisation dun meacutedia player basique
Les deacutebuts ont eacuteteacute laborieux une semaine pour arriver agrave compiler un
petit bout de code directShow censeacute jouer un meacutedia
Ne maicirctrisant pas encore parfaitement Visual Studio nous narrivions pas
agrave speacutecifier les librairies utiliseacutees En effet sous Visual Studio il existe
plusieurs endroits ougrave eacutediter les liens et nous ne parvenions pas agrave ce quun
filtre DirectSound (le fameux SampleGrabber) ne stoppe pas la
compilation
Ensuite nous avons assez rapidement reacuteussi agrave reacutealiser un petit lecteur
multimeacutedia basique non graphique Puis nous avons inteacutegreacute les fonctions
de la partie media player dADA Player (en prenant soin de supprimer
toutes les deacutependances agrave Borland C++) et en les modifiant quelque peu
(dans loptique prochaine de les utiliser via une interface graphique) nous
avons enfin reacuteussi agrave obtenir les fonctionnaliteacutes minimales dun media
player
Voici un bout de code commenteacute de la partie principale Comme vous le
voyez lAPI directShow fait 90 du travail Encore faut il savoir lutiliser
ce qui a demandeacute de nombreuses heures de recherche
16
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
17
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Par la suite au lieu de faire une gui basique comme nous lavions preacutevu
nous nous sommes heurteacutes au problegraveme du code manageacute et du code non
manageacute dans Net En gros si vous ne le saviez pas deacutejagrave le code manageacute
est du byte code interpreacuteteacute par une machine virtuelle (un peu comme
java) et le code non manageacute est assimileacute agrave du code compileacute en mode
natif (C C++) Avoir du code manageacute qui appelle du code non manageacute
cela revient agrave faire avec Net et CC++ du JNI (Java Native Interface) en
javaC++
En effet les fonctions utilisant les composants COM (toute la partie du
media player utilisant directShow) et issues de lAPI Win32(mixer
modifiant le volume windows partie ASIO) est un exemple de code non
manageacute En revanche linterface graphique que nous voulions creacuteer aussi
basique quelle soit devait ecirctre en C qui produit apregraves compilation du
code manageacute (bytecode) car exeacutecuteacute sous le controcircle du runtime Il nous
fallait donc faire la liaison entre code manageacute (partie C++) et non manageacute
(partie C) ce qui nest pas eacutevident
Nous avons alors rapidement deacutecideacute de transformer le code noyau de ADA
Player (non graphique) en dll ce qui nous a demandeacute encore un long
travail car nous eacutetions tregraves peu agrave laise avec lenvironnement de
deacuteveloppement et avec le code de Ada Player
Notre but eacutetait que linterface graphique puisse appeler les fonctions que
nous avions impleacutementeacutees en C++ via la DLL creacuteeacute La liaison software-gui
allait ecirctre reacutealiseacutee ce qui nous permettrait de tester reacuteellement et
dacceacuteleacuterer limpleacutementation de nos fonctions
Transformation du noyau en dll reconception
Au cours de diffeacuterents projets nous avons deacutejagrave creacuteer de nombreuses
librairies mais le seul problegraveme crsquoest que ces librairies on eacuteteacute creacuteeacutes pour
linux Notre formation nous a jamais donneacutee lrsquooccasion de creacuteer des
librairies windows ainsi notre inexpeacuterience nous a contraint agrave faire de
nombreuses recherches sur le net ainsi que dans des ouvrages papiers
Une fois ces moments de profonde remise en cause nous avions les
compeacutetences et les connaissances neacutecessaires pour la creacuteation de la dll
faisant le lien entre le code c++ et la partie graphique sous c (agrave notre
grand regret Mr Buffa nrsquoa pas pu nous aider hellip une fois de plus )
18
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Tout drsquoabord le travail consiste agrave creacuteer un projet DLL sous Visual Studio
creacuteent ainsi un prototype de main
BOOL APIENTRY DllMain(HANDLE hModule DWORD ul_reason_for_call LPVOID lpReserved)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH OutputDebugString(DLL_PROCESS_ATTACHn) break
case DLL_THREAD_ATTACH tring( n) bre k
tring( ) bre
case DLL_PROCESS_DETACH DebugString(DLL_PROCESS_DETACHn) break
return true
bull
ctions neacutecessaires agrave la gui Il a donc fallu
parcourir meacuteticuleusement toutes les classes c++ afin drsquoen extraire les
rties inteacuteressantes (travail pas reacuteellement compliqueacute mais tregraves
appel la fonction play de la classe Player eacutecrite en C++
PlayergetPlayer()-gtplay(media)
OutputDebugS DLL_THREAD_ATTACH a
case DLL_THREAD_DETACH OutputDebugS DLL_THREAD_DETACHn ak
Output
Une collaboration eacutetroite entre Reacutemi et Teacuterence a ducirc ecirctre meneacutee
afin drsquoajouter toutes les fon
pa
fastidieux )
extern C void WINAPI Play(char media)
19
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
toutes les fonctions de la DLL dans un fichier
def (le fichier def est en fait un fichier de deacutefinition de module qui est
liens)
ila les premiegraveres lignes
se 2
Pause 4
op 5
dans lequel on place lentecircte de toutes les fonctions de la dll
nction qui drsquoinitialisation
fonction appeleacute pour la lecture drsquoun media
typedef void (WINAPI DLL_Function_Play) (char media)
bull Il faut ensuite exporter
utiliseacute par leacutediteur de
Vo
LIBRARY TestDLL
DESCRIPTION exporte les fonctions de la dll
EXPORTS
Initialize 1
Relea
Play 3
St
bull et pour terminer un fichier dentecircte pour les exeacutecutables clients de
la DLL
voici sa syntaxe
fo
typedef void (WINAPI DLL_Function_Initialize) (char name)
20
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Apprentissage de C deacuteveloppement dune gui basique
widgets il est toujours
boutons etc mais pas sur les listes les
combo boxs etc
Finalement comme nous narrivions pas agrave nous deacutecider au tout deacutebut on
Pour impleacutementer notre interface graphique (et notre playlist mais nous
le verrons plus tard) nous avons utiliseacute C que nous ne connaissions
pas
Proche de Java lapprentissage de ce langage nest pas si difficile Ainsi
nous avons appris C sans laide de nos enseignants mais nous nous
sommes aideacutes des sites wwwcsharpfrcom (tutoriaux explications
exemples de code) et msdnmicrosoftcom (API de C)
Concernant la gui apregraves avoir codeacute des petites interfaces graphiques pour
nous faire la main il nous a fallu faire un choix skins ou pas skins
Partout on nous a dit quil fallait deacutecider degraves le deacutebut du projet Mais
attention skins ne veut pas dire pas de
neacutecessaire dutiliser des widgets Net La skin est un ensemble de bouts
de bitmaps qui enrobent les widgets ces bitmaps sappliquent sur les
bordures des Panels sur les
a repousseacute leacutetude des skins agrave plus tard pour comprendre le concept de
code manageacutenon manageacute
Code manageacute et non Manageacute C parle agrave C++ Mais cest comme JNI en plus simple
Comme citeacute plus haut nous avons creacuteeacute notre interface en C et la partie
lecteur pur en C++ Le code drsquoAda Player dont nous nous sommes inspireacute
eacutetait codeacute en C++ non manageacute Ce qui ne nous permettaient pas de
lrsquoutiliser directement dans notre code C Crsquoest pourquoi nous avons
trouveacute la solution de la creacuteation drsquoune dll contenant les fonctions du
lecteur et de la partie Asio Cela sest fait gracircce agrave lrsquoutilisation de lrsquoattribut
DllImport qui sert en grande majoriteacute agrave effectuer des appels agrave lAPI WIN32
gracircce agrave lrsquointeropeacuterabiliteacute du langage C++ manageacute et non manageacute Nous
non manageacutee Il nous a donc fallu creacuteer la dll du code C++ Cela est fait
21
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
avons donc creacuteeacute un nouveau projet Dll en C++ dans lequel nous appelons
s fonctions du lecteur et drsquoAsio
mple ci-dessus est appeleacute en C de la
ing SystemRuntimeInteropServices
le
bull La fonction Play de lexe
maniegravere suivante
us
[DllImport(TestDLLdll)]
public static extern void Play(String media)
Etude dune solution pour le support de skins
Nous avons beaucoup reacutefleacutechi quant agrave la maniegravere de geacuterer nos skins Nous
avons enfin opteacute pour lrsquoutilisation drsquoun fichier Xml de configuration Dans
ur les boutons les barres et
les zones de textes du lecteur et de la playlist Le choix drsquoun fichier Xml
agrave lrsquoutilisateur si sont fichier est correctement formeacute
Il e ment skinnable
Ils ont t s
lrsquoaction attr ssant la
position de leacuteleacutement ainsi que Width et Height qui deacutefinissent la taille du
bouton
Les Bu
ier donne le nom du fichier image
contient le fichier image
olice utiliseacutee
ce fichier est indiqueacute toutes les informations s
viens du fait que le code C contient des classes facilement utilisables
pour traiter des fichiers Xml Le choix de Xml nous a sembleacute de plus une
bonne ideacutee car cela permettait via une Dtd et drsquoun petit programme
drsquoindiquer
xiste diffeacuterent type drsquoeacuteleacute
ou en commun le nom de lrsquoeacuteleacutement qui permet de connaicirctre
ibueacutee aux boutons les coordonneacutees X et Y deacutefini
ttons et Bar
bull Fich
bull Rep donne le reacutepertoire en partant du reacutepertoire du skins qui
Les Label
bull La police utiliseacutee sa taille le style drsquoeacutecriture (Bold Italique
etchellip) et la couleur de la p
La List
bull Contient en plus des donneacutees des labels une couleur de fond
22
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Ce fichier Xml se compose de 3 eacuteleacutements principaux Player Playlist et
Videacuteo qui contiennent la taille de leur fenecirctre lrsquoextension des fichiers de
leurs fenecirctres et leur image de fond
Il est possible de veacuterifier si le ficher xml de skin est bien formeacute soit agrave
lrsquoaide du player directement soit avec le programme laquo
ValidationSkinsexe raquo Ce dernier ouvre une fenecirctre qui indique les erreurs
de conception du skin Attention Pour creacuteer un skin il est important de
placer un reacutepertoire dans le reacutepertoire laquo skin raquo Ce reacutepertoire doit contenir
le fichier xml nommeacute skinxml
Petit exemple de code
23
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Au final linterface graphique skinnable du media player ressemble agrave ca
Etude des SDK AsioVST
ne trouve pas beaucoup dexemples de sources de
VST host sur internet
pteacute pour une solution tregraves diffeacuterente de
celle que proposait Ada Player
dans les enceintes Et tout cela simultaneacutement
agrave la lecture dun meacutedia
ment en tout cas selon
Mr buffa pour se rendre compte de la difficulteacute
Pour mener agrave bien notre projet et faire de Xtram un VST Host tout comme
leacutetait ADA Player nous avons du eacutetudier comment utiliser les plugins de
traitement sonore et les drivers au format ASIO ce qui nest pas une
mince affaire Dieu que cest compliqueacute Les SDKs de Steinberg ne sont
pas tregraves explicites et on
Finalement nous avons reacuteussi XTram apregraves de longs jours de
programmation remplit enfin sa deuxiegraveme fonction ecirctre un VST Host
Nous verrons que nous avons o
XTram peut donc comme le faisait ADA Player traiter le son provenant de
lentreacutee micro agrave travers une chaicircne deffets (plugins VST) et le ressortir
(presque) instantaneacutement
Cependant sur un conseil de Mr Buffa nous avons choisi de ne pas
recoder tout un gestionnaire de plugins tacircche tregraves complexe qui avait eacuteteacute
partiellement reacutealiseacutee dans ADA Player suffisam
Une autre raison pour ne pas recoder un gestionnaire de plugins complet
est que les personnes inteacuteresseacutees par un logiciel comme XTram utilisent
deacutejagrave aujourdhui ADA Player et se plaignent de ne pouvoir utiliser avec ce
dernier des gestionnaires de plugins standards deacutejagrave preacutesents sur le
marcheacute comme le logiciel Chainer de Xluptop Les gens ont leurs
habitudes pour geacuterer leurs plugins Chainer est agrave la fois complet
24
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
puissant fiable sil est installeacute sur le systegraveme dune personne elle na
certainement pas envie de reconfigurer un nouveau gestionnaire de
plugins
chargent la
configuration et le traitement complexe est lagrave en deux clics
es
preacutefeacuterences utilisateur Ainsi il pourra utiliser celui dont il a lhabitude
nous occupons ensuite du mix avec le media Ce choix est
Mr Buffa nous a signaleacute que tous ces gestionnaires de plugins eacutetaient en
fait eux aussi des plugins VST Chainer peut sinseacuterer dans cubase
cest en effet ainsi quil est le plus utiliseacute Les gens preacuteparent leur
traitement complexe en chaicircnant des plugins divers dans chainer
(reacuteverbeacuteration compresseur etc) puis sauvent la configuration avec
chainer Ensuite ils insegraverent chainer dans cubase re
Nous avons donc conclu avec Mr Buffa quil eacutetait preacutefeacuterable que XTram
puisse charger un seul plugin VST que lutilisateur peut speacutecifier dans l
Lorsque dans notre logiciel on clique pour la premiegravere fois sur le bouton
correspondant agrave louverture de lunique plugin VST supporteacute nous
activons les drivers ASIO et permettons agrave lutilisateur de choisir agrave laide
dun browser le Vst Host de son choix Il peut ainsi choisir directement
dans la fenecirctre du VST Host les effets quil deacutesire utiliser pour traiter sa
voix et nous
sauvegardeacute
25
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
ASIO les diffeacuterents eacutetats dans lesquels peut se trouver le driver
Loaded lrsquoapplication peut faire appel aux fonctions drsquoinitialisations du
driver
Initialized le driver est initialiseacute et lrsquoapplication peut lui envoyer ses
requecirctes
Prepared les buffers audio sont alloueacutes et le driver est precirct a passer agrave
lrsquoeacutetat Running
Running le driver est en marche et le streaming audio est en cours
Les diffeacuterentes fonctions utiliseacutees pour passer drsquoun eacutetat agrave lrsquoautre
Init initialisation du driver pour lrsquoutilisation par lrsquoapplication (ASIOInit())
CreateBuffers allocation de lrsquoespace meacutemoire pour les buffers audio et
allocation des ressources mateacuterielles pour les pistes audio
(ASIOCreateBuffers())
Starts le traitement audio est activeacute (ASIOStart())
Stop le traitement audio est stoppeacute (ASIOStop())
DisposeBuffers deacutes alloue les ressources mateacuterielles utiliseacutees par les
channels et libegravere la meacutemoire des buffers audio (ASIODisposeBuffers())
Exit des alloue toutes les ressources utiliseacutees par le driver et le met dans
lrsquoetat uninitialized (ASIOExit())
26
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
La partie VST
Pour appliquer un effet VST il suffit de charger la dll puis drsquoappeler ses
fonctions de configuration afin de lui speacutecifier la taille des buffers que le
plugin devra traiter ainsi que la freacutequence drsquoeacutechantillonnage Plus
techniquement on lui passe un buffer drsquoentreacutee (ici des float sont requis)
et elle place le reacutesultat dans le buffer de sortie qui est lui-mecircme passeacute en
paramegravetre Et le tour est joueacute La plus grosse difficulteacute est de lui passer le
bon format en entreacutee est en sortie du coup il faut convertir agrave tout vas
Fonctionnaliteacutes ajouteacutees ou ameacutelioreacutees Une nouvelle Playlist
Lune des premiegraveres fonctionnaliteacutes que nous avons du ameacuteliorer par
rapport au projet ADA Player fut la playlist Mr Buffa nous avait preacutevenu
une playlist cest presque un sujet de TER Regardez la playlist de itune
de winamp5 (le media manager) etc Effectivement impleacutementer
proprement toutes les fonctionnaliteacutes dune playlist ce nest pas si
simple
Dragndrop
Ajout de fichiers
Ajout reacutecursif de reacutepertoires reacuteglage de la profondeur dexploration
Filtrage configurable (fichiers audio et video mais on ne connaicirct pas
les types supporteacutes agrave lavance)
Dragndrop dans la playlist dune ou plusieurs chansons (up and down)
Mode shuffle
Mode repeat
Support des tags
Raccourcis clavier delete
Crop (raccourcir la playlist)
Recherche dans la playlist si elle contient 10000 morceaux
Lecturesauvegarde
Gestion des reacutepertoires favoris
Polices couleurs
Retaillable et avec une skin bitmap ce nest pas si simple
etc
27
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Nous avons donc essayeacute drsquoimpleacutementer un maximum de ces
fonctionnaliteacutes dans le temps qui nous eacutetait imparti tout en laissant la
possibiliteacute drsquoen impleacutementer drsquoautres par la suite Ayant deacuteveloppeacute
linterface graphique en C nous nous sommes aperccedilu tregraves vite quil eacutetait
plus simple davoir une Playlist en C elle aussi En effet en laissant la
Playlist codeacutee en C++ nous aurions ducirc utiliser une DLL pour chaque appel
De plus cela nous obligeait agrave utiliser des types complexes (vector) agrave
travers la DLL qui nous aurait confronteacute agrave un problegraveme de compatibiliteacute
En reacute impleacutementant cette classe nous avons pu construire de nouvelles
fonctionnaliteacutes comme la possibiliteacute de reacutecupeacuterer les tags ID3 des meacutedias
contenant les informations de ces derniers (album artiste nom etc )
bull Impleacutementation de PlaylistInfo
La playlist est stockeacutees sous forme dune Arraylist C contenant des
instances de PlaylistInfo PlaylistInfo est une classe permettant de stocker
les informations sur les meacutedias Cette classe contient 3 attributs name
path et time les informations essentielles concernant les meacutedias Cette
classe est extensible et par la suite nous pourrons gracircce agrave une classe fille
permettre de stocker plus dinformations PlaylistInfo est une classe toute
simple contenant seulement quelques constructeurs accesseurs et
modificateurs
bull Impleacutementation de Playlist
Tout dabord nous avons limiteacute la creacuteation agrave une seule instance de Playlist
gracircce agrave un attribut static Playlist et un accesseur getPlaylist qui
renvoie cette instance ou lagrave creacuteeacutee si cela na pas deacutejagrave eacuteteacute fait
private static Playlist p
public static Playlist getPlaylist()
if(p == null)
p = new Playlist()
return p
28
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Comme nous lavons dit preacuteceacutedemment les meacutedias sont stockeacutes dans une
Arraylist Nous avons choisi cette structure qui est particuliegraverement
adapteacutee agrave la gestion des playlist puisquelle permet un accegraves direct gracircce
aux indices mais agrave la diffeacuterence dun tableau agrave une capaciteacute infinie Cela
permet dajouter facilement un meacutedia le supprimer ou le deacuteplacer Toutes
ses actions sont effectueacutees agrave partir de linterface graphique cest pourquoi
les meacutedias sont surtout identifieacutes par leur place dans lArraylist(leur
mecircme De mecircme nous avons impleacutementeacute
la fonctionnaliteacute repeat qui permet de lire le premier meacutedia apregraves que le
ar les deux logiciels preacuteceacutedemment citeacutes Bien sur le
contraire est eacutegalement possible (de Xtram vers Winamp ou Windows
eacutepertoires) Sinon tous les
ndeacute car long et peux
index)
La lecture des meacutedias seffectue lineacuteairement dans lArraylist gracircce agrave un
compteur qui permet de savoir agrave tout moment quel est le meacutedia joueacute
Cela permet davoir facilement le prochain meacutedia et le preacuteceacutedent (actions
des boutons principaux de linterface) Un mode random est aussi
disponible tout simplement gracircce agrave lutilisation de la fonction Random deacutejagrave
impleacutementeacutee en C Pour linstant un meacutedia pourra ecirctre joueacute 2 fois
successivement malencontreusement Par la suite nous pourrons
facilement eacuteviter cela en constituant une liste des x derniers meacutedias joueacutes
afin de ne pas retomber sur le
dernier de la liste ait eacuteteacute joueacute
Les playlists peuvent ecirctre sauvegardeacutees au format m3u qui est le format
le plus couramment utiliseacute pour les sauvegardes de playlist (notamment
par Winamp et Windows Media Player) Nous pouvons donc charger une
playlist creacuteeacutee p
Media Player)
Enfin il est possible de creacuteer une bibliothegraveque de meacutedia Un chargement
sera alors effectueacute agrave partir dun dossier et de tous ses sous-dossiers pour
inserer dans la playlist tous les fichiers qui ont une certaine extension Les
extensions peuvent ecirctre configureacutees par lutilisateur (on peut par exemple
ajouter tous les fichiers toto contenu dans ses r
fichiers seront inseacutereacutes Ce qui est nrsquoest pas recomma
utile Cela simpleacutemente de la faccedilon suivante
FileSystemInfo[] dirs = diGetDirectories()
foreach (DirectoryInfo diNext in dirs)
29
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
SystemWindowsFormsApplicationDoEvents()
nt ecirctre afficheacutees dans la playlist graphique sous forme
ors de la
tem s avons reacuteussit agrave impleacutementer la
teacutes des playlists les plus performantes
r (un seul ou plusieurs) reacutepertoires playlist
deacutejagrave sauvegardeacutee au format m3u
bull lecture des tags
addAllSubdirectory(diNext playListFenetre)
Voila par exemple comment parcourir un reacutepertoire afin de reacutecupeacuterer tous
ses sous reacutepertoire Cela seffectue pareillement pour les fichiers contenus
dans un reacutepertoire gracircce au type FileInfo et agrave la fonction GetFiles()
Degraves quun fichier est ajouteacute agrave la playlist on veacuterifie sil a un tag ID3 Ce tag
est en fait contenu dans les 128 premiers bits dun meacutedia On lit donc les
informations contenues dans ces tags afin de compleacuteter les informations
contenues dans linstance Playlistinfo Pour linstant seul le nom contenu
dans le tag est utiliseacute Par la suite nous pourrons collecter dautres
informations qui seront stockeacutees dans une sous classe de Playlistinfo Ces
informations pourro
dinfo bulle par exemple Il arrive parfois que ces tags soient mal formeacutes
Lorsque cest le cas ils ne sont pas lus et pour le nom du meacutedia on utilise
le nom du fichier
Pour le graphique on utilise une autre Arraylist qui contient seulement le
nom des meacutedia Cest cette liste qui est afficheacutee Toute modification
graphique entraicircne une modification dans la liste drsquoaffichage entraicircne une
modification de lrsquoArraylist contenue dans le fichier Playlistcs L
construction dune bibliothegraveque lArraylist graphique est rempli en mecircme
ps que lArraylist principale Nou
plupart des fonctionnali
bull dragrsquonrsquodrop de fichie
bull random repeat
bull lecture sauvegarde
bull raccourcis claviers
bull filtrage configurable
Certaines ne sont pas encore tout agrave fait complegravetes comme le parameacutetrage
de la profondeur de recherche reacutecursive dans les reacutepertoires mais crsquoest
assez facilement implantable Il nous a juste manqueacute un peu de temps et
cela sera deacuteveloppeacute par la suite Par contre en ce qui concerne la
recherche dans la playlist il nous faudrait nous pencher un peu plus sur le
problegraveme Pour la rendre plus efficace possible il nous faudrait peut ecirctre
30
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
revoir la structure de donneacutee contenant tous les meacutedias Mais comme
nous lrsquoavons dit plus haut avoir une playlist performante est difficile et
nous ne pouvions passer beaucoup plus de temps sur celle-ci On voit
donc bien que la playlist graphique est tregraves lieacutee agrave la playlist non
graphique Cela montre bien lrsquoutiliteacute de la coder dans le mecircme langage
C
Et voici un petit aperccedilu
Au final nous avons impleacutementeacute presque toutes les fonctionnaliteacutes
eacutenonceacutees agrave part la recherche par mot cleacutes agrave la itune
Une nouvelle interface de configuration des drivers asio
La configuration des drivers Asio peut se faire doreacutenavant agrave partir de la
fenecirctre des preacutefeacuterences onglet Audio Config
bull La fenecirctre se preacutesente de la maniegravere suivante
31
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Gestion des preacutefeacuterences utilisateur
Une fenecirctre de configuration est disponible pour que lrsquoutilisateur puisse
modifier ses preacutefeacuterences
tion se preacutesentent comme suit Les onglets de configura
bull Onglet General
bull Onglet Extension
32
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
bull Onglet Vst Advance
Inteacutegration dun gestionnaire de plugins VST externe
Suite agrave
nous mecircme le VST Host mais drsquointeacutegrer directement un plugin jouant ce
rocircle
une discussion avec Mr Buffa nous avons convenu de ne pas coder
De ce choix en reacutesulte une question essentielle a savoir la sauvegarde de
s sinon il
nrsquoy aura pas de sauvegarde de la configuration et lrsquoutilisateur devra
charger complegravetement sa configuration agrave chaque deacutemarrage
la configuration utiliseacutee
La reacuteponse deacutepend en fait du pluginhost choisi si celui-ci possegravede une
fonction de sauvegarde alors le problegraveme ne se pose mecircme plu
re
33
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Possibiliteacute de plugger une chaicircne de traitement sonore agrave plusieurs endroits
Karaokeacute les chanteurs veulent changer la hauteur des sons sans changer
la vitesse Fichiers audio = travail tregraves difficile Des plugins sont
speacutecialiseacutes comme Yamaha Pitch etc Guitaristes pour repiquer un solo
Pour ces deux besoins il faut pouvoir traiter le son en provenance du
eacutegaliser le reacutesultat du mix mettre une reverb
pour simuler le fait quon soit dans une catheacutedrale la solution consiste agrave
ignaux sonore Beaucoup de travail mais cest la fonctionnaliteacute la plus
it dans la fonction
process de la classe VoiceMangerAsio Analysons en deacutetail une partie de
nction pour comprendre son fonctionnement
ns ce vector sont stockeacute tous les effets qui vont ecirctre eacute sur le son du micro
de guitare changer la vitesse sans changer la hauteur Idem
media AVANT le mixage avec le son en provenance du micro
Sauvegarder le mix en mp3
traiter le son apregraves le mix
Nous avons ducirc isoler du code de ada player la partie geacuterant la chaicircne des
plugins de traitement pour en faire une classe instanciable Nous avons
modifieacute le code pour pouvoir agrave tout moment inseacuterer une instance de
chaicircne de plugins agrave tout endroit dans le graphe que suivent les diffeacuterents
s
importante que nous avons rajouteacute
Pour planter des effets un peu partout tout est fa
cette fo
On passe les buffers agrave chaque plugin vst chargeacute dans lordre
daappliqu
vectorltEffect gt vectEffects = ConfiggetConfig()-gtgetArrangeur()-gtgetEffectsList()
for (vectorltEffect gtconst_iterator i = vectEffects-gtbegin() i = vectEffects-gtend() i++)
34
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
ici on teste si lrsquoeffet est activeacute si il ne lrsquoest pas
Size k++)
s plugins qui
place
r
non on le fait pas parce
s eacuteteacute modifieacutes
decirctre
trInputBuffers = tmp traiteacute au
il nrsquoaura aucune incidence sur
le son donc nous nrsquoen tenons pas compte
if ((i)-gtisEnabled())
for (int j = 0 j lt 2 j++)
for (int k = 0 k lt buffer
ptrOutputBuffers[j][k] = 0 on remet les buffers output agrave 0 pour le
ne supporte pas le processre
ensuite on appel la fonction process de la classe Effect
le buffer ainsi modifier se a placeacute dans ptrOutputBuffers
if ((i)-gtprocess(ptrInputBuffers ptrOutputBuffers bufferSize))
si leffet a reacuteussi alors on inverse les buffers pour passer
agrave leffet suivant sique les buffers
nont pa
float tmp = ptrOutputBuffers on inverse les inputoutput pour
ptrOutputBuffers = ptrInputBuffers renvoyer le buffer qui vient
pplugin suivant
float tmp = ptrOutputBuffers
ptrOutputBuffers = ptrInputBuffers
ptrInputBuffers = tmp
35
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
on regravegle le volume par rapport au volume du media
for (int k = 0 k lt bufferSize k++)
on reacutecupegravere un eacuteventuel buffer contenant le son du media
opBuffer()
float fbuf = new float [2 bufferSize]
2 bufferSize)
in[0][k] = fbuf[i]
in[1][k] = fbuf[j]
rsquoeffet sur la partie media
media
media-gtisEnabled())
media-gtprocess(in out bufferSize)
for (int j = 0 j lt 2 j++)
ptrOutputBuffers[j][k] = mCoeffMicrophone
en cours
short cur_buf = PlayergetPlayer()-gtgetBufferList()-gtp
if (cur_buf)
si on en a un on le converti en float (cest du int16 agrave lorigine)
ToFloat16 (cur_buf fbuf
conversion en float
for(int i = 0 int j = 1 int k = 0 i lt bufferSize2 i+=2 j+=2 k++)
ici on applique l
ex ralentissement du
if(media = NULL)
if(
36
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
else
media
bufferSize ++c)
(ptrOutputBuffers [1][c] gt +10) ptrOutputBuffers ][c] = +10
effet sur le mix final
ltat
final-gtprocess(ptrOutputBuffers out bufferSize)
ptrOutputBuffers = out
out = in
ici on mix le son du micro et celui du
for (int c = 0 z = 0 c lt
for (int d = 0 d lt 2 ++d ++z)
on regravegle le volume
ptrOutputBuffers [0][c] += out[0][c] mCoeffMediaSound
ptrOutputBuffers [1][c] += out[1][c] mCoeffMediaSound
on veacuterifie si ccedila deacutepasse pas les valeurs limites
if (ptrOutputBuffers [0][c] lt -10) ptrOutputBuffers [0][c] = -10
if (ptrOutputBuffers [0][c] gt +10) ptrOutputBuffers [0][c] = +10
if (ptrOutputBuffers [1][c] lt -10) ptrOutputBuffers [1][c] = -10
if [1
ici on plante un
ex enregistrer le resu
if(final = NULL)
if(final-gtisEnabled())
37
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
En bref quels sont les apports de XTram
Cette question peut se poser autrement Nous dirons plutocirct
Qursquoest-ce que notre logiciel Xtram apporte de plus que le logiciel existant
r ADA Playe
Avant
bull Ada Player la totale
Travail reacutealiseacute lrsquoan dernier qui est un excellent prototype Seulement il
subsiste quelques gros deacutefauts il est extrecircmement lieacute agrave Borland C++ et
nrsquoest plus du tout maintenu (pas de mise agrave jour depuis le projet final ce
ui date pas de maintenance) q
38
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Apregraves
bull Xtram au complet
Xtram est baseacute sur la technologie NET les langages C++ et C et lrsquoIDE
Visual Studio 2003 qui permettent une extensibiliteacute et une utilisation
facile De plus notre logiciel apporte de nombreuses fonctionnaliteacutes qui ne
sont pas neacutegligeables comme par exemple la possibiliteacute drsquoappliquer des
effets non seulement sur la voix mais aussi sur le meacutedia et sur le mix des
deux Il est aussi possible drsquoenregistrer le mix au format mp3 (et non
wav) agrave lrsquoaide drsquoun plugin de sauvegarde positionneacute agrave lrsquoendroit souhaiteacute
mais malheureusement cela ne se fait pas directement Ensuite il nous
semble correct de dire que la modification de lrsquointerface graphique et de
lrsquoensemble de la partie laquo skin raquo a eacuteteacute une reacuteussite En effet il nous semble
que notre interface est plus jolie intuitive et surtout extensible que celle
du logiciel ADA Player
39
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Ce TER seacutetant plutocirct bien termineacute nous allons maintenant dresser le
lan de ces semaines de travail
ous consideacuterons tous apregraves 6 semaines de travail intensif que ce projet
ent beaucoup apporteacute que ce soit du point de vu
mme personnel
bi
Bilan N
nous a reacuteellem
professionnel co
Technique
Dun point de vu geacuteneacuteral travailler sur ce TER nous a permis de
consolider et deacutelargir consideacuterablement nos connaissances en
programmation Tout dabord ce projet nous a permis de confirmer nos
connaissances en C++ et de les approfondir Une grande partie de notre
application a eacuteteacute reacutealiseacutee dans ce langage qui nous eacutetait familier et nous
avons pu mettre agrave profit les notions que lon nous avait enseigneacute De plus
ce projet nous a permis de deacutecouvrir de nombreuses technologies et
notions que nous navions jamais abordeacute lors de notre enseignement
Premiegraverement nous avons appris agrave deacutecouvrir deux IDE qui sont tregraves
utiliseacutes de nos jours Borland C++ et Visual Studio et par ce biais la
technologie MICROSOFT NET Pour continuer ce projet a neacutecessiteacute
lapprentissage dun nouveau framework (directSound et directShow) qui
a eacuteteacute utiliseacute dans toute la conception du media player et lors du mix avec
le micro (avec lutilisation du filtre SampleGrabber) De plus la conception
de notre TER a neacutecessiteacute lutilisation du SDK de Steinberg (API de
traitement sonore utiliseacute pour la gestion des plugins VST et des drivers au
format ASIO) Ces diffeacuterentes nouvelles notions nous on demandeacute du
temps pour les assimileacutes mais ce nest pas tout Nous avons du surtout
apprendre agrave utiliser un tout nouveau langage issu de la technologie
MICROSOFT NET qui est C Ce travail a eacuteteacute fastidieux mais faciliteacute par
le fait que C se rapproche quelque peu de Java De plus C nous a
permis de creacuteer une gui bien plus rapidement et proprement que si nous
lavions fait avec C++ cest pourquoi nous ne regrettons pas notre choix
40
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Pour finir certaines notions ont eacuteteacute revues dans la conception de XTram
notamment les technologies Xml et les dtd qui ont eacuteteacute utiliseacutees dans la
conception des skins et la veacuterifications de leur forme (dans le cas ou un
utilisateur deacutesirerait en creacuteer un) Cela prouve donc que XTram a eacuteteacute
hance pour nous de revoir et dapprendre de nombreuses
giciels freacutequemment utiliseacutes de nos jours Dun point de
reacuteellement une c
techniques et lo
vue technique il est eacutevident que ce TER nous a vraiment beaucoup
apporteacute
Personnel
Dun point de vue autre que technique ce TER nous a apporteacute bien des
choses du point de vue personnel
Il semble eacutevident que dans un premier lieu un projet de lampleur du TER
na pu que nous ouvrir les yeux sur le travail que devait reacutealiser un
deacuteveloppeur ou un groupe de deacuteveloppeurs au sein dune entreprise En
effet plus que dans tout autre projet reacutealiseacute au cours de cette anneacutee
cest une reacuteelle meacutecanique de collaboration sorganisant autour de notre
cahier des charges que nous avons du mettre en place pour mener agrave bien
ce TER Travailler ensemble chaque jour sur le mecircme projet nous a
clairement montreacute les difficulteacutes que peuvent repreacutesenter la conception
dun projet en eacutequipe mecircme restreinte Tout dabord il nous est apparu
que la communication a eacuteteacute un des eacuteleacutements cleacute du bon deacuteveloppement
de notre application De plus nous avons rapidement compris quil eacutetait
indispensable quun membre de leacutequipe prenne le poste de chef de
projet (ou quelque chose qui y ressemble) En effet si dans notre cas
notre groupe ne comprenait pas reacuteellement de chef (tyrannisant ses
troupes et les mettant agrave mal) un membre posseacutedait la lourde
responsabiliteacute de controcircler une vision globale sur le projet et de
lavancement de la reacutealisation du cahier des charges Cette personne est
intervenue agrave plusieurs reprises pour harmoniser et joindre les diffeacuterentes
parties de chacun notamment au deacutebut ougrave nous avions de nombreux
problegravemes pour raccorder nos diffeacuterents travaux Dans lensemble nous
sommes donc pleinement satisfaits de notre organisation Nous en
sommes extrecircmement contents car il est eacutevident que lors de notre
commencement dans le TER nous doutions de parvenir dans les temps agrave
remplir toutes les exigences du cahier des charges De plus comme
expliqueacute preacuteceacutedemment le fait davoir agrave manipuler de nombreux outils et
technologies nous a beaucoup plu En effet nous pensons que leacutetude
dun nouveau langage et une adaptation agrave un monde orienteacute WINDOWS
41
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
(en comparaison avec le
chaque membre du grou
monde linuxfreeware) a eacuteteacute enrichissant pour
pe Dun point de vue geacuteneacuteral lensemble du
enter De plus le fait que XTram est le seul
lles tacircches(hormis ADA Player) nous
am pourrait ne pas rester inutiliseacute apregraves tout notre
r une place dans le monde de la
groupe garde un heureux avis sur la reacutealisation de ce TER qui semblait au
deacutebut un obstacle infranchissable
Conclusion Comme nous lavons expliqueacute preacuteceacutedemment nous sommes satisfait de
notre choix du sujet de TER Nous sommes tout simplement assez fiers
de nous car nous avons reacutealiseacute dans le temps cours qui nous eacutetait imparti
lensemble des directives que nous avions deacutefini dans notre cahier des
charges De plus nous avons eus mecircme le temps de rajouter quelques
fonctionnaliteacutes suppleacutementaires qui ne nous eacutetaient pas demandeacute et que
nous avons eu plaisir agrave impleacutem
logiciel du moment agrave remplir de te
fait penser que XTr
travail et quil pourrait bien se trouve
MAO LONGUE VIE A XTRAM
Annexes Webographiebibliographie
httpwwwessifr~pateyada le site dADA Player le player vst host
sur borland c++
httpmsdnmicrosoftcom Api pour le framework NET qui nous agrave
permis den apprendre un peu plus sur le C
httpwwwcsharpfrcom Pour la mecircme raison
httpwwwcppfrancecom qui nous a bien aideacute pour trouver du code
ttpwwwsteinbergnetSteinbergdefaultb0e4htmlh pour la partie
ASIO
efret bien sur httpwwwgoogl notre ami
D ve
lentretenir et faire des mises agrave jour Les fonctionnaliteacutes preacutevues sont
bull ameacutelioration de la playlist avec dans lespoir darriver agrave un reacutesultat
eacute loppement futur Nous avons preacutevu de ne pas laisser tomber ce projet et de continuer agrave
semblable agrave iTunes
42
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
bull integrer directement au lecteur la fonction denregistrement de la sortie
gestion des eacutevegravenements reacutecupeacutereacutes dun peacutedalier midi
urquoi pas
bull
et peut ecirctre dautres encore si nous en avons le courage (Poimpleacutementer un partage des meacutedias peer-to-peer)
Architecture des diffeacuterentes classesmodules
La classe xtram est la classe principale de lrsquointerface graphique Crsquoest elle
e VideoFenetre est la partie graphique de lrsquointerface videacuteo Elle fournit son laquo handle raquo agrave la DLL pour que la fenecirctre Direct Show soit
TriangleVst est la classe qui permet de preacuteciser les Vst pour les diffeacuterents
raphique de la playlist Des qursquoun changement est effectueacute dans celle-ci cela se reacutepercute sur la
laylist (sauvegarde deacuteplacement des meacutedias etchellip) Elle utilise plusieurs
stances de PlaylistInfo afin de les placer dans une Arraylist
La classe PlaylistInfo permet de stocker les informations (nom path et temps) drsquoun meacutedia qui est placeacute dans la playlist
bull Le code C Xtram
qui va initialiser tous les objets et afficher les fenecirctres ConfigDriverSon
VideoFenetre TriangleVst SkinVerification et PlaylistFenetre
La classe ConfigDriverSon est la classe de configuration en geacuteneral Elle
redistribue aux autres classes les preacutefeacuterences entreacutees par lrsquoutilisateur
La class
afficheacutee dans notre fenecirctre
flux audio On va donc creacuteer trois objets Vst (un pour le Media un pour le Micro et un autre pour le Mixe) qui vont contenir les plugins Vst que lrsquoon a choisi
SkinsVerification est une fenecirctre qui permet de choisir le skin que lrsquoon souhaite veacuterifier
La classe PlaylistFenetre correspond agrave la partie g
playlist stockeacutee en meacutemoire par lrsquointermeacutediaire de la classe Playlist
La classe Playlist contient les fonctions de gestion de la p
in
43
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
DernierE t
ta est une classe static qui permet de charger ou drsquoenregistrer au format Xml lrsquoeacutetat de la fenecirctre agrave la fermeture du programme
SkinsInfo charge les informations relatives aux boutons skinnables
bull Les classes C
edia (initialisation directshow play pause stop hellip)
er drsquoafficher leur gui et drsquoactiver le traitement du signal
ent activation
sous le coude le son du
bull Le code C++
Player classe static regroupant toutes les fonctions utiles agrave la lecture
drsquoun m
Effect classe geacuterant les effets VST permettant de les charger de les
initialis
VoiceManagerAsio Ici on traite toute la partie ASIO initialisation
chargem
GrabCallBack permet lrsquoextraction du graphe directshow (pour le passer agrave
ASIO)
Arrangeur gestion des Effects (qui seront appliqueacutes sur lrsquoentreacutee de la
carte son)
BufferList liste de buffer permettant de garder
44
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
media
Mixer composant permettant la gestion du volume geacuteneacuteral de windows
Config classe de configuration de lrsquoapplication permettant de connaicirctre
en autre quel driver est utiliseacute
Aeffect classe du SDK VST
Asio Asiodriver Asiolist classes du SDK ASIO
bull Les classes C++
Guide de deacuteveloppement de skins
Le deacuteveloppement de nouveaux skin est assez aiseacute sur Xtram
45
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
bull Exemple du contenu du fichier xml skinxml
En effet il suffit de modifier les attributs Leurs noms sont tregraves explicites
bull Rep -gt repertoire ou ce trouve limage
bull Fichier -gt le nom du fichier
bull X -gt Abscisse de limage ougrave 0 correspond au rebord gauche de la
fenecirctre
bull Y -gt Ordonneacutee de limage ougrave 0 correspond au haut de la fenecirctre
bull Width -gt largeur de limage
bull Height -gt longueur de limage
Ensuite il suffit de nommer le fichier skinxml agrave la racine du reacutepertoire
contenant tous les fichiers pour le skin Pour savoir si ce skin est bien
former on peut lancer le programme verificationSkinexe Cet utilitaire
parse le fichier de skin et indique les erreurs eventuelles avec les lignes ou
elle sont faites Mais avant cela ne pas oublier de bien mettre skindtd_gt
ougrave _skindtd est le path de la dtd Ce programme de veacuterification est aussi
accessible par xtram dans le menu skin
bull Fenetre de verification des skins (integreacute agrave Xtram)
46
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
La validation drsquoun fichier xml gracircce agrave une dtd se fait assez facilement
XmlTextReader tr = new XmlTextReader(fichier)
XmlValidatingReader vr = new XmlValidatingReader(tr)
vrValidationType = ValidationTypeDTD
vrValidationEventHandler += new ValidationEventHandler(ValidationHandler)
while(vrRead())
if(error)
thisrichTextBox1AppendText(No error found)
else
thisrichTextBox1AppendText(Validation failed)
Il suffit en effet de placer un laquo handler raquo qui va reacutecupeacuterer toutes les
erreurs entre le fichier xml et la dtd Ensuite nous lisons tout le fichier
pour deacutetecter ces erreurs et agrave chaque fois que lrsquoon en trouve une le laquo
handler raquo se deacuteclanche
public void ValidationHandler(object sender ValidationEventArgs args)
thiserror = true
thisrichTextBox1AppendText(Severity + argsSeverity + nMessage + argsMessage)
thisrichTextBox1AppendText(n)
thisrichTextBox1AppendText(n)
Ainsi agrave chaque erreur un paragraphe est reacutedigeacute indiquant la ligne ou elle
se trouve ainsi que son type
47
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Compleacutement annexe (issu du rapport dADA Player)
Qursquoest-ce que le PCM DATA Qursquoest-ce qursquoun BUFFER
Au niveau de la musique numeacuterique le son est eacutechantillonneacute et donc une
chanson numeacuterique nest rien dautre quune suite de valeurs
(couramment appeleacutees SAMPLES)
Ces valeurs peuvent avoir diffeacuterents formats
bull float (32 bits) entre -1 et +1
bull char (8 bits) entre -128 et +127
bull short (16 bits) entre -32768 et +32767
Bien eacutevidemment des eacutechantillons codeacutes sur 32 bits sont plus preacutecis que
des eacutechantillons codeacutes sur 8 bits (il y a une plus grande possibiliteacutes de
valeurs) mais pour loreille humaine il est difficile de voir une diffeacuterence
entre un son codeacute sur 16 bits et un son codeacute sur 32 bits
Lorsquon parle de buffer de donneacutees il faut comprendre quil ne sagit
que dun tableau de valeurs eacutechantillonneacutees Il ne sagit que dune suite
de valeurs Ce tableau peut ecirctre agrave une dimension ou agrave 2 dimensions si le
son est mono ou steacutereacuteo et peut ecirctre de taille variable (4608 pour un
buffer DirectSound 64 pour un buffer ASIO par exemple nous y
reviendrons)
Un autre paramegravetre entre en jeu la freacutequence deacutechantillonnage Il est
bien beau de savoir quil faut eacutechantillonner le son mais encore faut-il
prendre des valeurs du signal agrave intervalles de temps reacuteguliers En audio
classique la freacutequence utiliseacutee est 44100Hz cest agrave dire quon regarde la
valeur du signal tous les 44100egravemes de seconde Il y a donc 44100
samples par seconde Cette freacutequence peut bien entendu varier en
fonction de lorigine du signal
Exemple son original et son eacutechantillonneacute
48
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-
Remerciements
Un grand remerciement agrave Michel Buffa notre encadrant qui nous a suivi et
aideacute tout au long de ces 8 semaines (et plus) Une speacuteciale deacutedicace aux
membres dADA Player v2 Jeacuterome PATEY Seacutebastien PERAY Romain
PASSAGOT et Antoine PINEAU qui nous ont apporteacutes leurs conseils agrave
plusieurs reprises et qui ont fait du tregraves beau boulot sur ADA Player Nous
remercions aussi sincegraverement nos familles qui nous ont soutenu (dans les
deux sens du terme) pendant toute la dureacutee du TER
49
- Deacuteveloppement futur
-