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 �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 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 Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    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 044
    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 Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    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 044
    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 �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 vais essay� ta solution. merci beaucoup

  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 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.

  6. #6
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    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 044
    Billets dans le blog
    1
    Par d�faut
    Salut
    Ce temps de latence est il toujours le m�me ?
    Pour rappel Windows n�est pas un syst�me en temps r�el
    Ce que tu appel temps de latence d�pend de la charge de ta 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

  7. #7
    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
    C'est extactement �a.

    J'ai essay� de m'en affranchir en lan�ant le son avec MediaPlayer avec un volume � 0 et de passer le volume � 1 au moment ou je dois lancer le son mais cela ne change pas le volume.

    Ai-je oublier quelque chose je ne sais pas

  8. #8
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    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 044
    Billets dans le blog
    1
    Par d�faut
    Salut
    comme windows ne sait pas faire du temps r�el
    je te proposer d'utiliser une technique utilis�e dans les mesures � savoir �chantillonnage
    cad tu envoie la commande de son, dans un thread secondaire tu contr�le si un son a �t� �mis,ce dernier Thread pourra alors d�clencher la mesure et une notification � ton app
    cordialement
    Images attach�es Images attach�es  
    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

  9. #9
    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 ta r�ponse

    J'utilise d�j� un Thread pour envoyer le son et cela ne change rien puisque le son part avant.
    Moi il faut absolument que mon son parte en m�me temps qu'une stimulation ou alors que la stimulation soit d�cal� d'un temps que je peux r�gler.

    C'est pour cela que je voulais lancer le son par anticipation avec un volume � 0 et de monter le volume au moment ou le son doit v�ritablement commencer dans les enceintes. Mais cela ne fonctionne pas avec le MediaPlayer, le volume ne change pas.

    Une autre id�e que je suis en train de tenter de mettre en place. J'utilise une carte d'E/S National Instruments pour envoyer mes stimulations et j'ai vu qu'on pouvait via cette carte envoyer des formes d'onde sur un canal analogique. Je vais essay� de me passer de la carte son de l'ordinateur et g�n�rer le signal de mon son via ce canal analogique de la carte pour voir si cela fonctionne.

    le fichier son, c'est moi qui le g�n�re donc il me suffit de le balancer directement sur le canal de la carte l'onde du son sans l'enregistrer dans un fichier wav.

    Je reviendrais ici quand j'aurais termin� cette solution pour faire un retour

  10. #10
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par d�faut Make room, make room !
    Bonjour,

    Il est possible d'augmenter la priorit� des traitements sous Windows � deux niveaux : priorit� syst�me donn�e � l'application et au sein m�me de l'application. Les modifications au sein de l'application (SetPriorityClass() avec HIGH_PRIORITY_CLASS ou mieux - pire ? - REALTIME_PRIORITY_CLASS) sont encadr�es par la priorit� donn�e � l'application par le syst�me.

    La priorit� syst�me s'applique � toute l'application m�me quand elle passe son temps � attendre une r�action de l'utilisateur.

    Les modifications au sein de l'application peuvent �tre circonscrites aux seules op�rations critiques.

    Le mode temps r�el n'est pas vraiment pr�emptif, il peut donc �tre interrompu, m�me si c'est rare d'autant plus que le nombre de c�urs physiques est �lev�. En jouant sur les deux niveaux de changement de priorit�, il est possible de diminuer sensiblement les latences. Les applications qui jouent des sons utilisent souvent le HIGH_PRIORITY_CLASS.

    La REALTIME_PRIORITY_CLASS tend � bloquer les traitements des propres messages � destination du syst�me de l'application rendue prioritaire. Elle est donc � manipuler avec pr�caution.

    Salutations

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Il faut rester au plus pres de la machine et ne pas utiliser le Mediaplayer qui a ses propres protocoles !

    Mais m�me dans ce cas on ne peut pas s'affranchir d'une latence, b�tement par ce que lecture et enregistrement se font par buffers !
    En lecture, le temps du remplissage d�pend de la fr�quence d'�chantillonnage et du nombre d'�chantillons � capturer.
    On peut toujours essayer de r�duire au minimum la taille de ces buffers ...

    Si on a un buffer de 128 �chantillons (16 bits mono donc 256 octets)
    44,1kHz => 22,6us par �chantillon => 2,9 ms pour le buffer de 128 samples (c'est aussi le temps max limite pour le tra�temnt)
    96 kHz => 10,4us idem => 1,3 ms idem
    L'id�e serait alors d'utiliser un enregistrement sans fin tant que ...
    On travaille alors avec 2 buffers : pendant que l'un est rempli l'autre est trait� et qu'on repasse au dispositif apr�s traitement ...

    En flux continu on proc�derait par blocs m�moire contig�es successifs de plus grande taille...

    Donc consulter le mmedia ... waveInOpen, waveInAddBuffer, WAVEHDR et tout ce qui conerne le waveIn avec la plus grande attention !

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