• Aucun résultat trouvé

[PDF] Cours de base sur le langage C Sharp et le framework .NET | Formation informatique

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Cours de base sur le langage C Sharp et le framework .NET | Formation informatique"

Copied!
21
0
0

Texte intégral

(1)

PARTITION AUDIO

Ici je propose de concevoir un logiciel

permettant de partitionner les sé-quences Audio de type mp3.

Comme le montre la capture ci-con-tre, on charge un morceau, on lance la lecture (Jouer), on place les mar-queurs de début (<--|) et de fin (|-->). La partie verte représente le mor-ceau à conserver; on clique alors sur partitionner et on obtient la nouvelle séquence.

Pour pouvoir réaliser cet exemple le SDK DirectX doit être installé.

N

OTIONS ABORDÉES

♠ Exploitation de l’objet

Microsoft.DirectX.AudioVideoPlayback.Audio

; celui-ci permet d’écouter

et manipuler les séquences Audio pour définir les positions des coupes;

♠ Exploitation des classes

BinaryReader

et

BinaryWriter

pour reconstituer Octet par Octet les

séquences des fichiers Audio.

C

ONCEPTION DU FORMULAIRE

● Démarrer

VS.Net

,

● Créer une nouvelle

application Windows

en

C#

,

● La nommer

Partition Audio

,

● Par clic droit sur référence dans l’explorateur de solutions, ajouter les références

Microsoft.DirectX

et

Microsoft.DirectX.AudioVideoPlayback

,

Grâce à DirectX, l‛accès aux séquences Audio est très simple.

● Sélectionner le formulaire en

mode Design

et régler ses propriétés comme l’illustre le tableau page

suivante:

(2)

Propriété

Valeur

Size 640; 370

MinimumSize 640; 370 MaximumSize 640; 370

Text Partitionner les fichiers audio StartPosition CenterScreen

Je choisis ensuite de disposer un Label pour afficher le titre de la séquence Video.

● Insérer un contrôle

GroupBox

et régler ses propriétés comme suit:

Propriété

Valeur

Text Chemin d’accès

Location 8; 8

Size 616; 96

ForeColor Maroon

Font-Size 11

● Puis insérer un contrôle

Label

à l’intérieur de ce

GroupBox

,

Propriété

Valeur

Text Titre de la séquence:

Name titre

Location 8; 20

Size 600; 68

Font-Name Comic Sans MS

Font-Size 11

Je choisis ensuite d‛ajouter un contrôle TrackBar pour permettre à l‛utilisateur de naviguer dans la séquence Audio.

Propriété

Valeur

Name selecteur Location 8; 112 Size 600; 45 Maximum 100 LargeChange 1

(3)

● Ajouter un premier contrôle

Label

:

Propriété

Valeur

Name deb Text Vide Location 22; 168 BackColor Black Visible False

Ce label affichera en noir, le début de la séquence non conservée.

● Ajouter un deuxième contrôle

Label

:

Propriété

Valeur

Name milieu Text Vide Location 24; 168 BackColor PaleGreen Size 0; 23 Visible False

Ce label affichera la portion de séquence à conserver.

● Ajouter enfin un dernier contrôle

Label

:

Propriété

Valeur

Name lafin Text Vide Location 16; 168 BackColor Black Size 0; 23 Visible False

J‛ajoute ensuite les boutons d‛actions pour respectivement, ouvrir la séquence Audio, jouer la séquence Audio, poser le marqueur de début, poser le marqueur de fin, réinitialiser les découpes, partitionner le fichier et quitter l‛application.

● Ajouter tout d’abord un contrôle

GroupBox

,

(4)

Propriété

Valeur

Name groupe1 Text Actions ForeColor Maroon Font-Size 10 Location 0; 210 Size 632; 80

● Ajouter ensuite le premier

bouton

, à l’intérieur de ce

GroupBox

, comme suit:

Propriété

Valeur

Name parcourir

Text Parcourir...

Location 16; 24

Size 85; 48

● Puis, le bouton suivant:

Propriété

Valeur

Name jouer Text Jouer Location 101; 24 Size 85; 48 Enabled False

● Puis, le bouton suivant:

Propriété

Valeur

Name debut Text <--| Location 186; 24 Size 85; 48 Enabled False

● Puis, le bouton suivant:

Propriété

Valeur

Name fin Text |-->| Location 271; 24 Size 85; 48 Enabled False

(5)

● Puis, le bouton suivant:

Propriété

Valeur

Name reinitialiser Text Réinitialiser Location 356; 24 Size 85; 48 Enabled False

● Puis, le bouton suivant:

Propriété

Valeur

Name partitionner Text Partitionner Location 441; 24 Size 85; 48 Enabled False

● Puis, le bouton suivant:

Propriété

Valeur

Name quitter

Text Quitter

Location 526; 24

Size 85; 48

Je choisis ensuite d‛ajouter une barre de progression pour indiquer l‛avancement de la partition ainsi qu‛une barre d‛état pour afficher diverses informations comme la taille initiale du fichier, la durée de la séquence, et la taille finale du fichier après partition.

● Ajouter un contrôle

ProgressBar

comme suit:

Propriété

Valeur

Name progression Maximum 100 Minimum 0 Location 0; 292 Size 632; 23 Step 1

● Ajouter ensuite un contrôle

StatusBar

,

(6)

Propriété

Valeur

Name etat

ShowPanels True

Text Vide

Je choisis de répartir les informations dans différents panneau de la barre d‛état (4). Pour ajou-ter des Panels au StatusBar:

● Cliquer sur le bouton à trois points de sa propriété

Panels

,

Cette action a pour effet d‛afficher la boîte de dialogue Editeur de Collections StatusBarPanel.

● Cliquer sur le bouton

Ajouter

pour ajouter un premier

panneau

:

Propriété

Valeur

Name tailleO

Width 160

Text Taille originale:

● Cliquer de nouveau sur

Ajouter

pour un nouveau

panneau

:

Propriété

Valeur

Name dureeO

Width 160

Text Durée originale:

● Cliquer de nouveau sur

Ajouter

pour un nouveau

panneau

:

Propriété

Valeur

Name tailleF

Width 160

Text Taille finale:

● Cliquer de nouveau sur

Ajouter

pour un nouveau

panneau

:

Propriété

Valeur

Name dureeF

Width 160

Text Vide

Il ne reste plus qu‛à ajouter un Timer et un OpenFileDialog pour permettre à l‛utilisateur de sé-lectionner la séquence Audio.

(7)

● Ajouter un contrôle

OpenFileDialog

et le nommer

ouvrir

,

● Ajouter un contrôle

Timer

et le nommer

horloge

, puis régler sa propriété

Interval

à

500

(ms).

L

E CODE

L

ESESPACESDENOMS

Je fais référence à DirectX pour lire l‛audio et à IO pour accéder aux fichiers en lecture et en écriture.

● Ajouter les déclarations suivantes en début de code:

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using Microsoft.DirectX; using Microsoft.DirectX.AudioVideoPlayback; using System.IO;

Ensuite, il faut ajouter la déclaration de l‛objet Audio de DirectX à la classe:

---namespace _67_PartitionAudio {

public class Form1 : System.Windows.Forms.Form {

private System.Windows.Forms.StatusBar etat;

private System.Windows.Forms.StatusBarPanel tailleO; private System.Windows.Forms.StatusBarPanel dureeO; private System.Windows.Forms.StatusBarPanel tailleF; private System.Windows.Forms.StatusBarPanel dureeF; private System.Windows.Forms.ProgressBar progression;

private Microsoft.DirectX.AudioVideoPlayback.Audio monAudio;

private System.Windows.Forms.GroupBox groupe1; private System.Windows.Forms.Button parcourir;

(8)

namespace _67_PartitionAudio {

public class Form1 : System.Windows.Forms.Form {

private System.Windows.Forms.StatusBar etat;

private System.Windows.Forms.StatusBarPanel tailleO; private System.Windows.Forms.StatusBarPanel dureeO; private System.Windows.Forms.StatusBarPanel tailleF; private System.Windows.Forms.StatusBarPanel dureeF; private System.Windows.Forms.ProgressBar progression;

private Microsoft.DirectX.AudioVideoPlayback.Audio monAudio;

---private string sequence;

private double duree_Totale;

private long taille_Totale;

private int avancement;

private long position_Debut, position_Fin;

---sequence doit permettre de mémoriser le chemin et le nom de la séquence. duree_Totale doit stocker la longueur en secondes (Grâce au composant Audio DirectX) de la séquence car quelques calculs en dépendent. taille_Totale doit mémoriser la taille du fichier en Octets; là aussi plusieurs calculs s‛en suivent. avancement est une variable qui mémorise à tout instant la position dans le flux du fichier si la lecture est en cours par exemple. position_Debut et position_Fin doivent stocker (en Octets) le début et la fin de la partition en fonction des marqueurs positionnés par l‛utilisateur.

Codons maintenant les boutons en commençant par le plus simple.

● Double cliquer sur le bouton

Quitter

et saisir son code comme suit:

private void quitter_Click(object sender, System.EventArgs e) {

this.Close(); }

Nous mettons ainsi fin à l‛application.

Le bouton Parcourir doit permettre à l‛utilisateur de sélectionner la séquence MP3, de charger le composant Audio (DirectX), et de récupérer les informations sur la taille du fichier et la longueur de la séquence, tout en permettant ensuite la lecture.

(9)

private void parcourir_Click(object sender, System.EventArgs e) {

ouvrir.Title = “Sélectionnez un fichier Audio”; ouvrir.Filter = “Fichiers MP3|*.mp3”;

ouvrir.FilterIndex = 1;

if (ouvrir.ShowDialog()==DialogResult.OK) {

sequence = ouvrir.FileName;

titre.Text = “Titre de la séquence: \n” + sequence; jouer.Enabled = true; debut.Enabled = true; reinitialiser.Enabled = true; } else { return; }

//Accès IO au fichier pour récupérer sa taille

FileStream Lecteur = new FileStream(sequence,FileMode.Open);

//mémorisation publique pour usage ultérieur

taille_Totale = Lecteur.Length;

etat.Panels[0].Text = “Taille originale: “ + calc_Taille(Convert.ToDouble(Lecteur .Length));

Lecteur.Close(); try

{

//En libérant le contrôle, met fin à l’éventuelle séquence

monAudio.Dispose(); }

catch{}

//Création de l’instance de l’objet Audio pour pouvoir le piloter

monAudio = new Audio(sequence,false);

//Variable publique

duree_Totale = monAudio.Duration;

etat.Panels[1].Text = calc_Duree(monAudio.Duration); }

EXPLICATIONS: Avant d‛afficher la boîte de dialogue Ouvrir, nous définissons son titre et son filtre (seuls les fichiers Audio MP3 peuvent être traités):

ouvrir.Title = “Sélectionnez un fichier Audio”; ouvrir.Filter = “Fichiers MP3|*.mp3”;

Si l‛utilisateur clique sur OK, nous mémorisons le chemin et le nom du fichier dans la variable pu-blique sequence, affichons l‛information dans l‛étiquette titre, et rendons disponible les boutons jouer, debut et reinitialiser puisque les travaux de lecture et de découpe peuvent commencer.

(10)

if (ouvrir.ShowDialog()==DialogResult.OK) {

sequence = ouvrir.FileName;

titre.Text = “Titre de la séquence: \n” + sequence; jouer.Enabled = true;

debut.Enabled = true;

reinitialiser.Enabled = true; }

Ensuite à l‛aide de la classe FileStream (Espace de noms IO), nous pointons sur le fichier pour en récupérer la taille en Octets, à l‛aide de la propriété length. La valeur retournée est stockée dans la variable publique taille_Totale.

FileStream Lecteur = new FileStream(sequence,FileMode.Open);

//mémorisation publique pour usage ultérieur

taille_Totale = Lecteur.Length;

Puis nous affichons l‛information dans la barre d‛état après avoir traité la taille à l‛aide d‛une fonc-tion calc_Taille (à créer), et refermons le FileStream pour libérer les ressources mémoires:

etat.Panels[0].Text = «Taille originale: « + calc_Taille(Convert.ToDouble(Lecteur.Leng th));

Lecteur.Close();

On tente de libérer le contrôle Audio s‛il s‛agit d‛une seconde ouverture: try

{

//En libérant le contrôle, met fin à l’éventuelle séquence

monAudio.Dispose(); }

On crée l‛instance de l‛objet DirectX pour pouvoir écouter et manipuler la séquence: monAudio = new Audio(sequence,false);

On récupère l‛information sur la durée en secondes que l‛on affiche dans la barre d‛état après traitement par la fonction calc_Duree à créer.

duree_Totale = monAudio.Duration;

etat.Panels[1].Text = calc_Duree(monAudio.Duration); Avant de poursuivre, nous devons donc créer les deux fonctions.

- La première calc_Taille doit renvoyer l‛information dans l‛unité appropriée (Ko, Mo, Go...), - La seconde calc_Duree doit renvoyer le temps en minutes si la séquence dépasse 60s.

(11)

● Créer tout d’abord la fonction

calc_Taille()

comme suit:

private string calc_Taille(double laTaille_Fichier) {

//Convertit la taille du fichier dans l’unité appropriée

if (laTaille_Fichier > 1024000000) { return System.Math.Round(laTaille_Fichier/1024000000,2).ToString() + “ Go.”; } else if (laTaille_Fichier > 1024000) { return System.Math.Round(laTaille_Fichier/1024000,2).ToString() + “ Mo.”; } else if (laTaille_Fichier > 1024) { return System.Math.Round(laTaille_Fichier/1024,2).ToString() + “ Ko.”; } else { return System.Math.Round(laTaille_Fichier,2).ToString() + “ Octets.”; } }

Le code étant très simple, aucune explication supplémentaire n‛est nécessaire. Notons tout de même l‛emploi de la fonction Round de l‛espace de noms System.Math pour ne conserver que deux décimales ((...,2)). La fonction est de type string car le résultat du calcul est converti en chaîne de caractères, prêt à être affiché dans la barre d‛état.

● Créer ensuite la procédure calc_Durre() comme suit:

private string calc_Duree(double laLongueur) {

string[] LesTemps; //Pour mémoriser les temps coupés au niveau de la virgule

laLongueur = (laLongueur / 60);

LesTemps = laLongueur.ToString().Split(‘,’); //A gauche les minutes, à droite les secondes

LesTemps[1] = “0,” + LesTemps[1];

//Reconvertit en double, et multiplie par 60 pour obtenir les secondes

LesTemps[1] = System.Math.Round(Convert.ToDouble(LesTemps[1])*60,0).ToString(); return “Durée originale: “ +

LesTemps[0] + “ mn “ + LesTemps[1] + “ s”; }

(12)

Etant donné que la durée est stockée en secondes, nous la divisons par 60 pour connaître le nom-bre de minutes: laLongueur = (laLongueur / 60);. Nous obtenons dans la majeur partie des cas, un nombre décimal. La partie à gauche de la virgule renseigne sur le nombre de minutes tandis que la partie à droite renseigne sur le nombre de secondes. C‛est pourquoi, nous déclarons un tableau de chaînes dans lequel nous stockons ces deux informations à l‛aide de la méthode Split() de la classe string:

string[] LesTemps;

---LesTemps = laLongueur.ToString().Split(‘,’);

Le premier élément du tableau (0) concerne les minutes, le second (1), concerne les secondes. Nous leur ajoutons donc le préfixe ‘0,‛ pour pouvoir faire la conversion:

LesTemps[1] = «0,» + LesTemps[1];

En multipliant par 60, nous obtenons les secondes et ne conservons aucune décimale (Round, pa-ramètre 0).

Nous retournons enfin le résultat pour qu‛il puisse être affiché dans la barre d‛état. return “Durée originale: “ + LesTemps[0] + “ mn “ + LesTemps[1] + “ s”;

● Exécuter la

solution

pour constater à ce stade que tout fonctionne correctement.

Une fois la séquence chargée, celle-ci peut être jouée à l‛aide du composant DirectX.

● Double cliquer sur le bouton Jouer et saisir son code comme suit:

if (jouer.Text == “Jouer”) { try { monAudio.Play(); horloge.Start(); jouer.Text = “||”; } catch{MessageBox.Show(“ok”);} } else { monAudio.Pause(); horloge.Stop(); jouer.Text = “Jouer”; }

Ce bouton agit un peu comme un bouton Bascule. Lorsqu‛il affiche l‛information Jouer il lance la sé-quence et Bascule sur l‛information || (Pause). Un nouveau clique met donc la sésé-quence en pause.

(13)

Si le texte était Jouer, il devient ||, puis nous lançons la séquence à l‛aide de la méthode Play et activons l’horloge dont nous devons saisir le code:

monAudio.Play(); horloge.Start(); jouer.Text = «||»;

Dans le cas contraire, nous plaçons la séquence en pause à l‛aide de la méthode pause du compo-sant DirectX et stoppons l‛horloge à l‛aide de la méthode Stop() du Timer.

monAudio.Pause(); horloge.Stop();

jouer.Text = «Jouer»;

L’horloge doit rendre compte (dans le panel) de l‛état d‛avancement de la lecture en pourcentage et dimensionner le label de couleur verte (en fonction de l‛avancement) si le marqueur de début est déjà posé.

● Double cliquer sur le contrôle

Timer

et saisir son code comme suit:

private void horloge_Tick(object sender, System.EventArgs e) {

//Progression ramenée à 100 pour le sélecteur.

avancement = Convert.ToInt32((monAudio.CurrentPosition * 100)/duree_Totale); selecteur.Value = avancement;

etat.Panels[3].Text = avancement.ToString() + “ %”; if(!debut.Enabled)

{

position_Fin = avancement;

milieu.Width = avancement * 6 - deb.Width; }

}

Nous récupérons tout d‛abord la position dans la piste Audio à l‛aide de la propriété CurrentPosi-tion du contrôle DirectX ramenée à 100 par rapport à la durée totale:

avancement = Convert.ToInt32((monAudio.CurrentPosition * 100)/duree_Totale);

Nous positionnons régulièrement (Tous les 500 ms), le curseur du TrackBar en fonction de cette valeur, pour rendre compte visuellement et en temps réellement de la progression de la piste: selecteur.Value = avancement;

L‛information est de même affichée dans le StatusBar: etat.Panels[3].Text = avancement.ToString() + « %»;

(14)

Si le marqueur de début est posé, le Label deb est donc posé pour indiquer la portion ignorée par la partition. Dans ce cas, nous choisissons d‛afficher en temps réel (toutes les 500 ms) la progression de la piste considérée en redimensionnant le label vert (milieu):

if(!debut.Enabled) {

position_Fin = avancement;

milieu.Width = avancement * 6 - deb.Width; }

Justement, nous devons donc maintenant nous occuper du bouton debut qui a pour charge de poser le marqueur de début de sélection de piste:

● Double cliquer sur le bouton

Debut

et saisir son code comme suit:

private void debut_Click(object sender, System.EventArgs e) {

//Label, indicateur noir de position.

position_Debut = avancement; deb.Visible = true; deb.Width = avancement *6; debut.Enabled = false; fin.Enabled = true; milieu.Visible = true; milieu.Top = deb.Top;

milieu.Left = deb.Left + deb.Width; }

Nous mémorisons tout d‛abord la position de début pour la partition à venir: position_Debut = avancement;

Nous affichons le premier label (noir) indiquant la portion de piste ignorée: deb.Visible = true;

deb.Width = avancement *6;

Nous rendons ensuite le bouton Debut inaccessible puisque le marqueur de début est posé, puis rendons en revanche le bouton Fin accessible pour pouvoir placer le marqueur de fin:

debut.Enabled = false; fin.Enabled = true;

Nous ajustons ensuite la position de départ du deuxième label (vert) pour qu‛il puisse être consi-déré par le Timer et indiquer en temps réel la progression de la piste conservée:

milieu.Visible = true; milieu.Top = deb.Top;

(15)

Après avoir placé le premier marqueur, il faut pouvoir placer le marqueur de fin.

● Double cliquer sur le bouton

Fin

et saisir son code comme suit:

private void fin_Click(object sender, System.EventArgs e) {

position_Fin = avancement; lafin.Visible = true;

milieu.Width = avancement * 6 - deb.Width; lafin.Left = milieu.Left + milieu.Width; lafin.Top = milieu.Top; lafin.Width = 600 - lafin.Left; fin.Enabled = false; monAudio.Stop(); horloge.Stop(); partitionner.Enabled = true;

etat.Panels[2].Text = calc_Taille(((position_Fin - position_Debut)*taille_Totale/ 100));

}

Nous récupérons tout d‛abord la position du marqueur de fin pour savoir ou terminer la partition du fichier à venir:

position_Fin = avancement;

Nous finalisons ensuite la position définitive du Label vert et affichons le troisième Label (noir) pour indiquer visuellement la portion de fin de séquence ignorée:

lafin.Visible = true;

milieu.Width = avancement * 6 - deb.Width; lafin.Left = milieu.Left + milieu.Width; lafin.Top = milieu.Top;

lafin.Width = 600 - lafin.Left;

Le bouton Fin devient logiquement inaccessible: fin.Enabled = false;. Puis nous arrêtons la lec-ture de la séquence, ainsi que les renseignements effectués par le Timer:

monAudio.Stop(); horloge.Stop();

partitionner.Enabled = true;

(16)

A ce stade, le programme ne permet pas encore de partitionner, mais il sait lire la séquence, placer les marqueurs de début et de fin tout en affichant les informations en temps réel.

● Exécuter la soltuion pour constater que tout fonctionne à ce stade.

Le fait de déplacer le curseur du TrackBar doit permettre à l‛utilisateur de naviguer dans la piste Audio pour avancer plus vite ou reculer afin de mieux se positionner avant la partition.

● Double cliquer sur le contrôle

TrackBar

et saisir son code comme suit:

private void selecteur_Scroll(object sender, System.EventArgs e) { try { monAudio.Pause(); } catch{} try { avancement = selecteur.Value;

//Permet de se déplacer dans le flux audio

monAudio.CurrentPosition = avancement * duree_Totale / 100; if (jouer.Text == “||”)

monAudio.Play(); }

catch{selecteur.Value=0;} }

On tente tout d‛abord de mettre en pause la piste Audio (Si la lecture est en cours) pour pouvoir déplacer le curseur et en fonction réajuster la CurrentPosition:

try {

monAudio.Pause(); }

catch{}

Cette propriété CurrentPosition permet ensuite de se replacer dans le flux audio en fonction du curseur après conversion en rapport avec la taille:

avancement = selecteur.Value;

//Permet de se déplacer dans le flux audio

monAudio.CurrentPosition = avancement * duree_Totale / 100; Si la lecture est en pause, nous la relançons:

if (jouer.Text == “||”) monAudio.Play();

(17)

● Double cliquer sur le bouton

Réinitialiser

et saisir son code comme suit:

try {

monAudio.Stop(); monAudio.Dispose();

//Indispensable si l’on sort de la partition

monAudio = new Audio(sequence); } catch{} selecteur.Value = 0; debut.Enabled = true; fin.Enabled = false; partitionner.Enabled = false; deb.Visible = false; milieu.Visible = false; lafin.Visible = false; progression.Visible = false; jouer.Text = “Jouer”; }

Ce code réinitialise notamment les marqueurs pour pouvoir les positionner de nouveau.

Voilà, il ne reste plus qu‛à coder le bouton le plus important (Partitionner) permettant de créer une séquence à partir de la portion définie à l‛aide des marqueurs.

● Double cliquer sur le bouton

Partitionner

et saisir son code comme suit:

private void partitionner_Click(object sender, System.EventArgs e) {

string fichier_Seul = Path.GetFileNameWithoutExtension(sequence); string extension_seule = Path.GetExtension(sequence);

try {

//Obliger de libérer le fichier Audio pour y accéder //en BinaryReader

monAudio.Dispose(); }

catch{}

FileStream Lect = new FileStream(sequence,FileMode.Open); BinaryReader Lire = new BinaryReader(Lect);

//Accès en create et non OpenAndCreate pour le remplacer s’il existe

FileStream Graveur = new FileStream(fichier_Seul + “1” + extension_seule, FileMode.Create);

BinaryWriter Ecrire = new BinaryWriter(Graveur); position_Debut = position_Debut*taille_Totale/100;

(18)

position_Fin = position_Fin*taille_Totale/100; Lect.Seek(position_Debut,SeekOrigin.Begin); progression.Visible = true;

for (long i = position_Debut; i < position_Fin; i++) { progression.Value = Convert.ToInt32((i-position_Debut)*100/(position_Fin - position_Debut)); Ecrire.Write(Lire.ReadByte()); } Ecrire.Close(); Graveur.Close(); Lire.Close(); Lect.Close(); debut.Enabled = true; fin.Enabled = false; partitionner.Enabled = false; deb.Visible = false; milieu.Visible = false; lafin.Visible = false; jouer.Text = “Jouer”;

if (MessageBox.Show(“Souhaitez vous écouter le résultat ?”,”Message”, MessageBoxButtons.YesNo)==DialogResult.Yes)

{

monAudio = new Audio(fichier_Seul + “1” + extension_seule,true);

//Ce gestionnaire permettra d’intercepter la fin de la partition //et de rétablir le contrôle Audio du départ.

this.monAudio.Ending += new System.EventHandler(monAudio_Ending); progression.Visible = false; } else { progression.Visible = false; try { monAudio.Dispose();

//Indispensable si l’on sort de la partition

monAudio = new Audio(sequence); } catch{} selecteur.Value = 0; debut.Enabled = true; fin.Enabled = false; partitionner.Enabled = false; deb.Visible = false; milieu.Visible = false;

(19)

lafin.Visible = false;

progression.Visible = false; jouer.Text = “Jouer”;

} }

Nous mémorisons tout d‛abord le nom du fichier sans extension ainsi que l‛extension seule dans le but de recomposer le fichier selon ces informations:

string fichier_Seul = Path.GetFileNameWithoutExtension(sequence); string extension_seule = Path.GetExtension(sequence);

Le contrôle Audio doit libérer le fichier (Méthode Dispose()) pour que nous puissions y accéder en lecture et écriture binaires:

try {

//Obliger de libérer le fichier Audio pour y accéder //en BinaryReader

monAudio.Dispose(); }

catch{}

Nous créons ensuite les objets BinaryReader (Celui qui récupère les informations binaires du fi-chier source sur la portion considérée) et BinaryWriter (Celui qui recompose la section à l‛aide de ces informations binaires sur la longueur que nous souhaitons conserver).

FileStream Lect = new FileStream(sequence,FileMode.Open); BinaryReader Lire = new BinaryReader(Lect);

//Accès en create et non OpenAndCreate pour le remplacer s’il existe

FileStream Graveur = new FileStream(fichier_Seul + “1” + extension_seule, FileMode.Create);

BinaryWriter Ecrire = new BinaryWriter(Graveur);

Le BinaryWriter crée un fichier du même nom que l‛original accompagné de l‛indice 1 et dans le même dossier: fichier_Seul + «1» + extension_seule.

On récupère ensuite les positions de début et de fin en fonction des marqueurs pour découper le fichier:

position_Debut = position_Debut*taille_Totale/100; position_Fin = position_Fin*taille_Totale/100;

On utilise cette position_Debut pour s‛y placer directement dans le flux: Lect.Seek(position_Debut,SeekOrigin.Begin);

On parcourt ensuite les informations binaires du fichier d‛origine entre ces deux positions en le reconstituant automatiquement.

(20)

Tout ce qui est lu dans le fichier d‛origine (Lire.ReadByte()), est instantanément réécrit dans le fichier du même nom indicé de 1 (Ecrire.Write):

for (long i = position_Debut; i < position_Fin; i++) {

progression.Value = Convert.ToInt32((i-position_Debut)*100/ (position_Fin - position_Debut));

Ecrire.Write(Lire.ReadByte()); }

Nous libérons ensuite les ressources: Ecrire.Close();

Graveur.Close(); Lire.Close(); Lect.Close();

Nous réinitialisons ensuite les boutons: debut.Enabled = true; fin.Enabled = false; partitionner.Enabled = false; deb.Visible = false; milieu.Visible = false; lafin.Visible = false; jouer.Text = “Jouer”;

Ensuite nous demandons à l‛utilisateur s‛il souhaite écouter la séquence résultante: if (MessageBox.Show(“Souhaitez vous écouter le résultat ?”,”Message”,

MessageBoxButtons.YesNo)==DialogResult.Yes) {

monAudio = new Audio(fichier_Seul + “1” + extension_seule,true);

//Ce gestionnaire permettra d’intercepter la fin de la partition //et de rétablir le contrôle Audio du départ.

this.monAudio.Ending += new System.EventHandler(monAudio_Ending); progression.Visible = false;

}

La paramètre booléen true dans l‛instanciation de l‛objet DirectX permet en même temps que le chargement de lancer la lecture de la séquence Audio. Puis, suit une notion très importante. Nous créons le gestionnaire d‛événement suivant:

this.monAudio.Ending += new System.EventHandler(monAudio_Ending);

Cela signifie que nous sommes en mesure d‛intercepter l‛événement du à la fin de la séquence Audio.

(21)

● Créer la méthode associée à ce gestionnaire comme suit:

private void monAudio_Ending(object sender, System.EventArgs e) {

//Libère le contrôle de la partition

monAudio.Dispose();

monAudio = new Audio(sequence,false); progression.Visible = false;

}

Une fois la partition écoutée, nous recalons l‛objet DirectX sur la séquence d‛origine pour permet-tre de nouvelles découpes.

Ces documents DreamLive sont libres de droits et ouverts à tous alors, profitez, partagez et appréciez ! Pour nous retrouver sur le Web : http://www.dreamlive.fr.

Références

Documents relatifs

La seconde partie de cette thèse s'attache à construire un mécanisme de régula- tion qui minimise le dommage lié à la dégradation de la qualité de l'eau, maintienne une activité

Ces matériaux ont été développés suivant trois axes principaux : d’abord l’axe des mouvements, associés aux moyens de transport et aux centres névralgiques

Le texte de Roland Marchal dans ce dossier met ainsi l’accent sur cette génération de civils arrivée aux postes de responsabilité depuis la fin des années 1990, et qui

Or en 2004-2005, pour la première fois depuis 1992, les États-Unis plaident fortement en faveur d’une importante opération de paix (de dix mille hommes) dans un conflit africain,

Le coût des incendies de résidences lié au tabac est obtenu directement selon les chiffres publiés dans le rapport des coûts de l’abus de substance au Canada (2006) et qui sont

On peut en conclure de ce premier examen que Machiavel n’échappe pas au machiavélisme ; mais alors ce dernier ne peut plus défini comme le déchaînement de la

09 02 34 49 2018 44 فرعو لئاسو لإا لاصتلاا ينورتكل لئاسولا اهنأب وأ لسرت&#34; لاسرإ وأ لابقتسا وأ تاراشكإ وأ تك ا وأ روص وأ تاب تاوصأ وأ يأ

Mais surtout, il n’est pas le fait de quelques chercheurs qui auraient choisi d’être plus progressistes que d’autres : cette discussion, scientifiquement nécessaire, nous