Rapport du projet Media Player VST -...

49
Media Player Vst Host TER Master 1 Année 2004/2005 Etudiants : De Georges Adrien Jorcin Rémi Roche Michaël Scalabre Térence Encadré par : Mr Michel Buffa

Transcript of Rapport du projet Media Player VST -...

Page 1: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 2: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 3: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 4: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 5: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 6: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 7: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 8: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 9: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 10: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 11: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 12: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 13: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 14: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 15: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 16: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 17: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 18: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 19: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 20: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 21: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 22: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 23: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 24: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 25: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 26: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 27: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 28: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 29: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 30: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 31: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 32: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 33: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 34: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 35: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 36: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 37: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 38: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 39: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 40: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 41: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 42: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

(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
Page 43: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 44: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 45: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 46: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 47: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 48: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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
Page 49: Rapport du projet Media Player VST - unice.frdeptinfo.unice.fr/twiki/pub/Minfo04/SoutenancesFinales/... · 2005. 6. 10. · •Introduction (p. 4) o Préface o Rappel du travail demandé

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