Problèmes boucle NotifyProc

Résolu
Signaler
Messages postés
15
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
7 juin 2007
-
Messages postés
15
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
7 juin 2007
-
Bonjour,

J'ai deux Edit qui permettent de choisir le nombre de fois où un son doit être joué pour deux sons différents.

1er problème :
La première fois que je rentre un nombre, le son est joué (x+1) fois, sauf si 1 est le premier nombre rentré, et si je rappuie sur Play le son est joué x fois comme voulu.
Si 1 est le premier chiffre rentré, le son est joué une fois, je rentre 3, le son est joué 4 fois mais si je rePlay alors il est joué 3 fois et x fois quelque soit le nombre entré.
Si 3 est le premier chiffre rentré, le son est joué 4 fois, mais aprés quelque soit le nombre entré il joue correctement.

2ème problème :
Si je rentre x, il faut que j'appuie sur stop x fois pour que le son s'arrête.

Voici le code :

var
    B : integer;
    Arretautorise : boolean;
 
procedure TForm1.btJouerClick(Sender: TObject);
begin
    Lecteur;
end;
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    if(Key <> chr(8))and((Key < '0')or(Key > '9'))then
    begin
        Key := chr(0); // Ne prend que les nombres et la touche retour
    end;
end;
 
procedure TForm1.Lecteur;
begin
 
    if RadioBtmont.Checkedthen
    begin
        Arretautorise := true;   // Evite un bug si aucun son n'est
                                    // lancé alors que nous appuyons sur Stop
        MediaPlayer1.FileName := 'C:\Sons expérience\MONTE.wav';
        MediaPlayer1.Open;
        B:= StrToInt(Edit1.Text);
        MediaPlayer1.Play;
       
        if B <> 1then
        begin
            MediaPlayer1.Notify := true;
            MediaPlayer1.OnNotify := NotifyProc1;     
        end;
    end;
 
    if RadioBtdesc.Checkedthen
    begin
        Arretautorise := true;
        MediaPlayer1.FileName := 'C:\Sons expérience\DESC.WAV';
        MediaPlayer1.Open;
        C:= StrToInt(Edit2.Text);
        MediaPlayer1.Play;
 
        if C <> 1then
        begin
            MediaPlayer1.Notify := true;
            MediaPlayer1.OnNotify := NotifyProc2;
        end;
    end;
 
end;
 
procedure TForm1.NotifyProc1(Sender: TObject);
begin
    with Sender as TMediaPlayer do
        begin
            if NotifyValue = nvSuccessful then
            begin
                if B > 0then
                begin
                    Play;   
                    Dec(B);
                end;
            end;
Notify := True;
        end;
end;
 
procedure TForm1.NotifyProc2(Sender: TObject);
begin
    with Sender as TMediaPlayer do
        begin
            if NotifyValue = nvSuccessful then
            begin
                if C > 0then
                begin
                    Play;
                    Dec(C);
                end;
            end;
Notify := True;
        end;
end;
 
procedure TForm1.btArreterClick(Sender: TObject);
begin
    if Arretautorise then
    begin
        MediaPlayer1.Stop;
    end;
end;

Merci pour vos conseils, ça fait longtemps que j'ai des problèmes avec cette partie de mon programme...<!-- / message -->

7 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Bon double post (désolé...)

Ca risque de mieux marcher comme ça :

procedure TForm1.btArreterClick(Sender: TObject);
begin
    if Arretautorise then
    begin
        B:= 0;

        C:= 0;
        MediaPlayer1.Stop;
    end;
end;

En effet, si la notifyproc est appelée par le Stop, le compteur sera pas encore à zéro avec ma première solution.

Je rajoute une remarque :

Met un ShowMessage(IntToStr(B)); audébut de NotifyProc1, pour en apprendre un peu plus sur ton problème 1.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
mmmh

Et comme ça :

procedure TForm1.NotifyProc1(Sender: TObject);
begin
    ShowMessage(IntToStr(B));
    Dec(B);
     if B > 0 then (Sender as TMediaPlayer).Play;            
end;
Messages postés
15
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
7 juin 2007

Bon j'ai résolu le 2ème problème en mettant :

procedure TForm1.Lecteur;
begin
        WaveOutSetVolume(WAVE_MAPPER, MakeLong(65535, 65535));
....................
.................... 
 
procedure TForm1.btArreterClick(Sender: TObject);
begin
    if Arretautorise then
    begin
        WaveOutSetVolume(WAVE_MAPPER, MakeLong(0, 0));
    end;
end;

Mais il me reste encore le 1er problème...<!-- / message -->
Messages postés
15
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
7 juin 2007

Ok merci pour ta réponse j'essaierai dès demain.
Pour les NotifyProc, j'en utilise deux un pour B et l'autre pour C, mais je testerai en en utilisant qu'un.
Messages postés
15
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
7 juin 2007

Ah, merci ta méthode pour arrêter le MediaPlayer fonctionne.
C'est vrai que c'est beaucoup plus propre.
Messages postés
15
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
7 juin 2007

En mettant un ShowMessage(IntToStr(B)); au début de NotifyProc1, cela me donne :
Si je mets 1 => rien (enfin ça joue 1 fois)
Si je mets un nombre différent de 1, par exemple 3, la première fois ça m'affiche : rien, 3, 2, 1, 0 (le son est joué 4 fois).
Si je mets un nombre différent de 1, par exemple 3, la deuxième fois ça m'affiche : 3, 2, 1, 0 (le son est joué 3 fois).
Je vois donc ce que j'entendais, mais je ne vois pas du tout à quoi peut être dû le problème, à part que la première fois il exécute le MediaPlayer1.Play; du RadioButton mais pas la deuxième fois...
Messages postés
15
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
7 juin 2007

En effet, ça marche comme ça !
Eh ben, on peut dire que tu sais trouver des solutions !!
Merci beaucoup pour tes deux réponses qui m'ont beaucoup aidé, et du temps que tu as consacré pour me répondre.