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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    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
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    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 704
    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. :bug: ___ "http://club.developpez.com/regles/#LIII-A"É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.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  4. #4
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    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 éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    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 Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    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é.

+ Répondre à la discussion
Cette discussion est résolue.

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, 22h56
  2. [Audio]Jouer un son .au
    Par Pill_S dans le forum Multimédia
    Réponses: 11
    Dernier message: 28/12/2004, 17h46
  3. DIRECT MUSIC / JOUER DEUX SONS OU PLUS..
    Par ilimo dans le forum DirectX
    Réponses: 1
    Dernier message: 12/06/2004, 18h24
  4. Jouer un son MIDI
    Par Slock dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 10h02
  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, 14h10

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