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 :

Lecture d'un fichier Son avec une Fréquence précise


Sujet :

C++Builder

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 930
    Points : 466
    Points
    466
    Par défaut Lecture d'un fichier Son avec une Fréquence précise
    Bonjour à tous

    Je dois dans un de mes programmes lire un son qui a une fréquence et une durée précise (réglable).

    J'ai d'abord opté pour la fonction BEEP à laquelle je passe la fréquence et la Durée.
    Mon problème c'est que le son ne se déclenchait pas à l'instant ou je le lance mais avec une certaine latence qui n'est malheureusement pas la même à chaque fois. Je dois lancer un son et envoyer un signal à une carte d'E/S National Instrument pour déclencher un autre appareil en même temps donc la latence me pause problème.

    Ma deuxième solution à été de générer un fichier waw à la fréquence que je voulais. Pour la durée, je ne peux pas avec le bou de code que j'ai, généré une durée en dessous de 1 seconde. J'ai utilisé l'objet MediaPlayer pour lire le son et l'arrêter quand j’atteins le temps voulu. (même souci de latence).

    Ma troisième solution a été de générer un fichier waw plus long et de le lancer en avance avec un volume à 0 (paramètre de MediaPlayer) et de passer le volume à 1 quand je veux lire le son. Problème, pas de son lu car le volume reste à 0.

    Ma quatrième solution aurait été d'utiliser PlaySond (API) mais il est en 32 bits, or je développe en 64 bits et je ne peux pas repasser en 32Bits à cause de la Carte d'E/S qui ne répond plus lorsque je suis en 32Bits.

    Quelqu'un aurait-il une solution à me proposer pour que je n'ai pas de latence ?

    Merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 1 035
    Points : 2 140
    Points
    2 140
    Billets dans le blog
    1
    Par défaut
    Salut
    la dll wimmdll est compatible 32 et 64 bits
    donc le code suivant
    // je te laisse traduire de Delphi en c++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure PlaySoundFile(FileName: string);
    begin
     if FileExists(FileName)
     then PlaySound(pchar(FileName), 0, SND_ASYNC or SND_FILENAME);  
     
     { Flags are:
        SND_SYNC  =0 = Start playing, and wait for the sound to finish
        SND_ASYNC =1 = Start playing, and don't wait to return
        SND_LOOP  =8 = Keep looping the sound until another sound is played  }
    end;
    devrait fonctionner sous les environnements 32 et 64 Bits

    infos sup ici:https://learn.microsoft.com/en-us/wi...sound-function

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 1 035
    Points : 2 140
    Points
    2 140
    Billets dans le blog
    1
    Par défaut
    Salut
    un petit exemple créé en 64 Bits
    j'affiche dans une barre de status le temps entre l'appel de la fonction et la sortie
    sur ma becanne de plus de 10 ans le temps est de 3 ms.
    le paramètre SND_ASYNC est important car on travaille en mode asymchrone

    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
     
    #include <vcl.h>
    #pragma hdrstop
    #include"MMSystem.h"
    #include"Main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm140 *Form140;
    //---------------------------------------------------------------------------
    __fastcall TForm140::TForm140(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm140::Button1Click(TObject *Sender)
    {
    	  TDateTime Start =Now();
    	  PlaySoundA("SYSTEMSTART", 0, SND_ASYNC);
    	  TDateTime Stop =Now();
    	  StatusBar1->Panels->operator[](1)->Text=FormatDateTime(L"hh:mm:ss.zzz",Stop-Start);    // 3 ms sur ma vieille machine
    }
    //---------------------------------------------------------------------------
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 930
    Points : 466
    Points
    466
    Par défaut
    Je vais essayé ta solution. merci beaucoup

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 930
    Points : 466
    Points
    466
    Par défaut
    Je reviens après avoir testé.

    J'ai sensiblement diminué mon temps de latence avec ta solution. ce temps est moins aléatoire qu'avec le MediaPlayer mais il reste à 60ms. par temps de latence j'entends le temps entre l'envoi de la commande de son et le moment ou le son commence à se jouer effectivement. Cela ne reste pas assez réduit pour moi quand je dois lancer dans le même temps un autre évènement qui dois être synchronisé.

    Je ne vois pas comment faire pour arriver à lancer un son en instantané ou quasiment en instantané car il y a toujours une latence mais il me faudrait qu'elle soit le plus réduite possible (de l'odre de 2 à 3 ms) et je craint que cela ne soit pas possible.

    Si vous avez une solution je suis preneur.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/02/2013, 16h21
  2. Réponses: 2
    Dernier message: 14/01/2013, 15h53
  3. Réponses: 4
    Dernier message: 24/05/2010, 13h06
  4. Fichier Wav avec une fréquence donnée
    Par azimut2 dans le forum Windows
    Réponses: 0
    Dernier message: 23/11/2009, 05h19
  5. Réponses: 2
    Dernier message: 01/05/2007, 18h50

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