IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Jouer un Son jusqu'à un évènement OnMouseDown


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 905
    Points : 460
    Points
    460
    Par défaut Jouer un Son jusqu'à un évènement OnMouseDown
    Bonjour à tous

    Pour un programme que je développe, je dois jouer un son à une certaine fréquence jusqu'à ce que l'on clique sur le bouton Gauche de la souris.

    La fonction BEEP permet de jouer un son de fréquence passé en paramètre ainsi qu'une durée.
    Je ne peux donc pas l'utiliser en état car moi c'est un évènement souris qui arrête le son et non une durée.

    J'ai donc créé un Thread dans lequel je lance le son avec une durée suffisamment grande pour ne pas que le son se coupe trop tôt.

    Et donc quand mon évènement souris se déclenche, je termine le Thread pour arrêter le son.

    Or le son ne s'arrête pas quand je clique sur la souris, il continu jusqu'à son terme avant d'effectuer ce qu'il y a dans la fonction de l'évènement souris.

    Auriez-vous une solution à mon problème.

    Voici mon code simplifié

    ThreadSon.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    //---------------------------------------------------------------------------
     
    #ifndef ThreadSonH
    #define ThreadSonH
     
    //---------------------------------------------------------------------------
     
    #include <System.Classes.hpp>
     
    //---------------------------------------------------------------------------
     
    class TThreadSon : public TThread
    {
    	private:
     
    		// Frequence
    		int Frequence;
     
    		// Duree
    		int Duree;
     
    	protected:
     
    		void __fastcall Execute();
     
     
    	public:
     
    		__fastcall TThreadSon(bool CreateSuspended, int F, int D);
    };
     
    //---------------------------------------------------------------------------
     
    #endif


    ThreadSon.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    //---------------------------------------------------------------------------
     
    #include <System.hpp>
    #pragma hdrstop
     
    #include "ThreadSon.h"
     
    #include "Principale.h"
     
     
    #pragma package(smart_init)
     
    //---------------------------------------------------------------------------
     
    //   Important : Les méthodes et les propriétés des objets de la VCL peuvent seulement être
    //   utilisées dans une méthode appelée avec Synchronize, par exemple :
    //
    //      Synchronize(&UpdateCaption);
    //
    //   où UpdateCaption pourrait ressembler à :
    //
    //      void __fastcall TThreadSon::UpdateCaption()
    //      {
    //        Form1->Caption = "Mis à jour dans un thread";
    //      }
    //---------------------------------------------------------------------------
     
    __fastcall TThreadSon::TThreadSon(bool CreateSuspended, int F, int D)
    	: TThread(CreateSuspended), Frequence(F), Duree(D)
    {
    	// on marque que le Thread se détruit tout seul
    	FreeOnTerminate = true;
    }
     
    //---------------------------------------------------------------------------
     
    void __fastcall TThreadSon::Execute()
    {
    	//---- Placer le code du thread ici ----
    	// On joue le Son
    	Beep(Frequence, Duree);
    }
     
    //---------------------------------------------------------------------------
    Code Principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    // Voici comment je lance mon Son
    ThreadSon = new TThreadSon(false, Frequence, 10000);
     
    // Méthode déclenchée lorsqu'on appuie sur le bouton de la Souris
    void __fastcall TAffichageForm::OnMouseDown(TObject *Sender, TMouseButton Button,
    		  TShiftState Shift, float X, float Y)
    {
    	// Si le bouton Gauche est enfoncé
    	if(Button == TMouseButton::mbLeft)
    	{
    		// Si le Thread son est en route
    		if(ThreadSon)
    		{
    			// on termine le Thread
    			ThreadSon->Terminate();
    		}
    	}
    }
    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 380
    Points : 6 676
    Points
    6 676
    Par défaut
    Bonjour,

    Dans le code que tu as écrit, le thread ne fait pas grand chose. Il lance le beep() et se termine immédiatement, quand après tu appelles Terminate() il est déjà fini depuis longtemps. Quant au beep, il continue son boulot!
    Tu a besoin d'une commande pour stopper le beep(). Peut-être qu'un nouveau beep() de durée 0 pourrait le préempter? Je ne connais pas C++Builder pour t'aider.

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    mai 2002
    Messages
    2 621
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 2 621
    Points : 6 335
    Points
    6 335
    Par défaut
    Pas sûr qu'il soit possible d'interrompre l'exécution de la fonction Beep une fois lancée ...

    Si la liste des fréquences que tu dois jouer n'est pas trop grande, moi je me tournerais plutôt vers la lecture de fichiers son avec un TMediaPlayer.
    Sinon, peut-être les commandes MIDI ... ou l'utilisation d'une bibliothèque de gestion audio (https://www.un4seen.com/) ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Interbase (7 - XE) - PostgreSQL 11.6

  4. #4
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 905
    Points : 460
    Points
    460
    Par défaut
    Merci pour vos réponse.

    Mon souci c'est que je ne sais pas à l'avance quelle fréquence sera utilisée car c'est un paramètre que les utilisateurs doivent rentrer.

    Pour le Thread, je pensais qu'il se terminait quand le Beep avait fini son temps (FreeOnTerminate dans le constructeur). Du coup effectivement s'il est terminé, c'est normal que le beep continu.

    Je vais regarder ce que cela donne en envoyant un nouveau Beep de 0

    Après construire des son, cela va me demander beaucoup de temps et je n'en ai pas car je dois livrer le logiciel rapidement

  5. #5
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 905
    Points : 460
    Points
    460
    Par défaut
    Je reviens vers vous car ta solution dalfab fonctionne.

    Effectivement un Beep de 0 arrête l'autre beep du coup cela fait exactement ce que je veux.

    Par contre je laisse bien le Beep dans le Thread car sinon cela bloque mon programme si je le met direct.

    Merci à vous deux pour avoir répondu

  6. #6
    Membre éclairé
    Femme Profil pro
    ..
    Inscrit en
    décembre 2019
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 92
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : décembre 2019
    Messages : 389
    Points : 882
    Points
    882
    Par défaut
    Salut,

    Si c'est un programme que tu dois livrer, il faut faire attention car s'il est lancé sur un Windows 64bits, la fonction Beep() risque de ne pas produire le résultat escompté, ou ne rien produire du tout.

    @dalfab, la fonction Beep() est bloquante. Si le thread ne répond pas immédiatement au Terminate() c'est parce qu'il n'y est pas obligé, en plus du fait que c'est le genre de fonction dont l'usage doit être absolument évité.

  7. #7
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 905
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Salut,
    Si c'est un programme que tu dois livrer, il faut faire attention car s'il est lancé sur un Windows 64bits, la fonction Beep() risque de ne pas produire le résultat escompté, ou ne rien produire du tout.
    C'est un programme en Win32 donc pas de souci de ce côté là.

    Citation Envoyé par kaitlyn Voir le message
    @dalfab, la fonction Beep() est bloquante. Si le thread ne répond pas immédiatement au Terminate() c'est parce qu'il n'y est pas obligé, en plus du fait que c'est le genre de fonction dont l'usage doit être absolument évité.
    Effectivement et c'est là que finalement je croyais avoir résolu mon problème mais en fait non. Le beep de 0 annule bien le beep au niveau sonore mais n'arrête pas le Thread pour autant. du coup les Threads s'empilent et s'arrêtent quand ils ont terminés le temps du Beep et du coup au bou d'un moment, et bien cela arrête les beep suivants avant qu'ils soient terminés, ce qui me pose problème.

    J'ai essayé en appelant terminate sur le Thread mais aucun effet étant donné que le beep est bloquant.
    J'ai aussi essayé en tuant directement le thread par un delete, cela arrête bien le Thread mais ça bloque mon programme ensuite.

    Du coup je ne sais pas comment faire car la durée du beep n'est pas fixe, le beep doit s'arrêter par un clic de souris.

    Avez-vous des idées ?

  8. #8
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    août 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2005
    Messages : 207
    Points : 241
    Points
    241
    Par défaut
    Perso je créerai au moment du choix de la fréquence par l'utilisateur un fichier .WAV avec une sinusoidale dedans ( très facile à en calculer les points ) et après je jouerai ce fichier avec un TMediaPlayer.
    Et là tu peux faire un stop quand tu veux.
    Et peut-etre même plus besoin de thread non plus.
    Désolé, on savait pas que c'était impossible, alors on l'a fait

Discussions similaires

  1. [C#] Créer son journal d'évènement perso
    Par globeriding dans le forum ASP.NET
    Réponses: 17
    Dernier message: 16/01/2006, 23h56
  2. [Audio]Jouer un son .au
    Par Pill_S dans le forum Multimédia
    Réponses: 11
    Dernier message: 28/12/2004, 18h46
  3. DIRECT MUSIC / JOUER DEUX SONS OU PLUS..
    Par ilimo dans le forum DirectX
    Réponses: 1
    Dernier message: 12/06/2004, 19h24
  4. Jouer un son MIDI
    Par Slock dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 11h02
  5. Existe t'il un composant permettant de jouer un son wav?
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/06/2002, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo