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

DirectX Discussion :

Entrée micro de la carte son


Sujet :

DirectX

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2005
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Entrée micro de la carte son
    Je fais du traitement du signal (en gros des maths) et j'ai un projet consistant à utiliser l'entrée micro de la carte son pour capter un signal, en vu de son traitement.
    Seulement, voila, si je sais bien programmer en C/C++, l'API DirectX est un domaine inconu pour moi.
    Existe-t-il une API facile d'emploi pour faire ce travail ? Faut-il absolument utiliser DirectX ? Si oui, comment l'apprendre ? Existe-t-il des codes exemples qu'il me suffirait de copier ?
    Que me conseillez-vous ?
    PS : J'ai regardé du coté de l'API Fmod ( http://www.fmod.org) mais si j'ai bien lu la doc, elle ne peut que "jouer" un son, pas le capter à partir de l'entrée micro.
    Merci de vos conseilles.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    DiretcX et plus particulièremment directSound devrait te permettre de réaliser ce que tu veux.
    Directsound et l'API qui travaille à un niveau très bas de la carte son à l'instar de directmusic ou de directshow par exemple.

    Le conseil que je peux te donner: télécharges le SDK de directX, la version pour développement C++. Ensuite tu vas trouver une section code, et là pas de miracle, tu regardes comment s'utilise cette API avec les exemples donnés et tu adaptes selon tes propres besoins.

    Si tu as un peu de chance tu peux trouver une personne qui a fait quelque chose de similaire à ton cas, et qui t'expliquera. Je sais que les exemples sur le net sont assez maigres et correspondent rarement à ce que l'on souhaite faire.

    Mais avec de la patience et beaucoup de test, directX se montre très puissant.

    Pour les autres API, Je ne sais rien.

    Si ce qui t'intéresse le plus, c'est le traitement du signal et non pas la récupération du signal, tu peux chercher sur le net. Il se peut que tu trouves une personne qui a codé une DLL ou un OCX qui te récupère le signal et tu n'as plus qu'à le traiter.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    Pas besoin de directX pour faire un truc aussi simple. ( encore heureux d'ailleurs... )

    Voir du cote de l'API Audio de base du Platform SDK.

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    il est facile de capter le son à l'entrée. En quel langage souhaiteriez vous un exemple. J'ai des exemples por BC++ et Delphi

  5. #5
    Membre du Club
    Profil pro
    dans ton cul
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : dans ton cul

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    EN JAVA SI POSSIBLE SINON TAMPIS EN C OU C++

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par screeminelle
    EN JAVA SI POSSIBLE SINON TAMPIS EN C OU C++
    Euh le premier message, c'est Jean-Michel RIVIERE qui l'a posté il y a 8 mois.

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Voici un exemple pour Borland C++ 6

    Main.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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    //---------------------------------------------------------------------------
     
    #ifndef MainH
    #define MainH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include        <mmreg.h>    //pour   WAVEFORMATEX
    #include        <mmsystem.h>
    #include "CGAUGES.h"
    #include <Chart.hpp>
    #include <ExtCtrls.hpp>
    #include <TeEngine.hpp>
    #include <TeeProcs.hpp>
    #include <Series.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
            {
    __published:	// Composants gérés par l'EDI
            TChart *Chart1;
            TLineSeries *Series1;
            TPanel *Panel1;
            TButton *Button1;
            TCGauge *CGauge1;
            TLabel *Label1;
            void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
            void __fastcall FormActivate(TObject *Sender);
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall Button1Click(TObject *Sender);
     
     
    private:	// Déclarations de l'utilisateur
            void    Fermer_la_capture_audio ( void );
            void    Initialize_Get_audio(void);
            void    Capure_Audio(TMessage &Msg);
     
     
    public:		// Déclarations de l'utilisateur
            __fastcall TForm1(TComponent* Owner);
     
            // adjonction pour capture Audio
     
            WAVEFORMATEX    waveform;               // format of received datas
            PWAVEHDR        pWaveHdr_1; 	        // header1 for buffer1
            PBYTE           pBuffer_1;  	        // buffer1...
            PWAVEHDR        pWaveHdr_2; 	        // header2 for buffer2
            PBYTE           pBuffer_2;  	        // buffer2...
     
            HWAVEIN                  h_WaveIn;    // wave mapper  for window
     
            virtual void    __fastcall      WndProc (TMessage &Msg);
            };
     
     
    #define         F_16k                   16000           /*      Get wave at 16 kHz   */
    #define         BUFFER_SIZE             6400            /*      Catch data by blocks of 6400 bytes */
    #define         _16Bits                 16              /*      16 bits per samples */
    #define         Mono                    1               /*      Record 'mono' signal */
    #define         L_Frame_16k             320             /*      Frame size */
     
    #define         max(a, b)               (((a) > (b)) ? (a) : (b))   
    #define         min(a, b)               (((a) < (b)) ? (a) : (b))
     
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Main.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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
     
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Main.h"
    #include        <Dialogs.hpp>
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "CGAUGES"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    #define _20_msec        0.02
    void TForm1::Fermer_la_capture_audio ( void )
       {
       waveInUnprepareHeader(h_WaveIn, Form1->pWaveHdr_1, sizeof(WAVEHDR));
       waveInUnprepareHeader(h_WaveIn, Form1->pWaveHdr_2, sizeof(WAVEHDR));
       }
    void    TForm1::Initialize_Get_audio(void)
       {
       short        i;
       HWND         hwnd;
     
       hwnd                                 =       Form1->Handle;
     
       Form1-> waveform.wFormatTag          =	WAVE_FORMAT_PCM;	// PCM
       Form1-> waveform.nChannels           =	Mono;			// MONO
     
       Form1-> waveform.nSamplesPerSec      =	F_16k;			// 16000 Hz
       Form1-> waveform.nAvgBytesPerSec     =	F_16k * ( _16Bits / 8 ) * Mono;// 32000 bits per sec  16K, 16bits, Mono
     
       Form1-> waveform.nBlockAlign	     	=	1;
     
       Form1-> waveform.wBitsPerSample      =	_16Bits;		// 16 BITS
       Form1-> waveform.cbSize		=	0;
       if ( waveInOpen(&h_WaveIn, WAVE_MAPPER, &Form1->waveform, (DWORD)hwnd, 0, CALLBACK_WINDOW))
          {
          MessageBox(0, "Cannot Open wave mapper in", "this demo software", MB_ICONEXCLAMATION | MB_OK);
          exit(1);
          }
       // Allocate headers
       Form1-> pWaveHdr_1 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
       Form1-> pWaveHdr_2 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
       // Allocate buffers
       Form1-> pBuffer_1 = (PBYTE) malloc(sizeof(BYTE)*BUFFER_SIZE);
       Form1-> pBuffer_2 = (PBYTE) malloc(sizeof(BYTE)*BUFFER_SIZE);
       // Setup first header
       Form1-> pWaveHdr_1->lpData			=	(CHAR*)Form1-> pBuffer_1;
       Form1-> pWaveHdr_1->dwBufferLength	        =	BUFFER_SIZE;
       Form1-> pWaveHdr_1->dwBytesRecorded	        =	0;
       Form1-> pWaveHdr_1->dwUser			=	0;
       Form1-> pWaveHdr_1->dwFlags			=	0;
       Form1-> pWaveHdr_1->dwLoops			=	1;
       Form1-> pWaveHdr_1->lpNext			=	NULL;
       Form1-> pWaveHdr_1->reserved			=	0;
     
       Form1-> pWaveHdr_2->lpData			=	(CHAR*)Form1-> pBuffer_2;
       Form1-> pWaveHdr_2->dwBufferLength	        =	BUFFER_SIZE;
       Form1-> pWaveHdr_2->dwBytesRecorded	        =	0;
       Form1-> pWaveHdr_2->dwUser			=	0;
       Form1-> pWaveHdr_2->dwFlags			=	0;
       Form1-> pWaveHdr_2->dwLoops			=	1;
       Form1-> pWaveHdr_2->lpNext			=	NULL;
       Form1-> pWaveHdr_2->reserved			=	0;
       // Add buffer
       waveInPrepareHeader(h_WaveIn, Form1-> pWaveHdr_1, sizeof(WAVEHDR));
       waveInPrepareHeader(h_WaveIn, Form1-> pWaveHdr_2, sizeof(WAVEHDR));
     
       waveInStart(Form1->h_WaveIn);
     
       }
    #define scale   0.0030517578125   /*   100 div 32768*/
    long ilp;
    void TForm1::Capure_Audio(TMessage &Msg)
       {
       unsigned long i = 0;
       while (i< ((PWAVEHDR) Msg.LParam)->dwBytesRecorded)
          {
          short  m1,m2,m;
          short* signal = (short*)&((PWAVEHDR)Msg.LParam)->lpData[i];
          i += L_Frame_16k * sizeof(short);
          m1 = 0;
          m2 = 0;
          for (short j =0; j <   L_Frame_16k; j++) // 320 data 16k => 20 ms
             {
             m =  signal[j];
             if ( m > 0 )
                m1 = max(m1, m);
             else
                m2 = min(m2, m);
             }
          CGauge1->Progress      =      max( m1,-m2)*scale;
          Series1->Delete(0);
          if ( m1+m2 >=0)
             Series1->AddXY((++ilp)*_20_msec,m1*scale);
          else
             Series1->AddXY((++ilp)*_20_msec,m2*scale);
          }
       i = waveInAddBuffer(h_WaveIn, (PWAVEHDR) Msg.LParam, sizeof(WAVEHDR));
       if ( i != 0 )
          ShowMessage("Error_Audio_Capture " + IntToStr(i) );
       }
    void __fastcall TForm1::WndProc(TMessage &Msg)
       {
       switch ( Msg.Msg )
          {
          case MM_WIM_OPEN: // on init, add both buffers to WaveIn
                    {
                    waveInAddBuffer(h_WaveIn, Form1->pWaveHdr_1, sizeof(WAVEHDR));
                    waveInAddBuffer(h_WaveIn, Form1->pWaveHdr_2, sizeof(WAVEHDR));
                    break;
                    }
     
          case MM_WIM_DATA: // We are receiving sound data...
                    {
                    Capure_Audio(Msg);
                    break;
                    }
          }
       TForm::WndProc(Msg);
       }
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
            {
            Fermer_la_capture_audio ( );
            }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
    Initialize_Get_audio();
    CGauge1->Align          =       alLeft;
    CGauge1->MinValue       =       0;
    CGauge1->MaxValue       =       100;
    Caption                 =       "DEMONSTRATION SOFTWARE INCLUDING AUDIO MESSAGE INTERCEPTION";
    Chart1->LeftAxis->Automatic     =       false;
    Chart1->LeftAxis->Maximum       =       100;
    Chart1->LeftAxis->Minimum       =       -100;
    Chart1->BottomAxis->Automatic   =       true;
    Series1->Clear();
    for ( ilp = -1000; ilp <=0 ; ilp++ )
       Series1->AddXY(ilp*_20_msec,0);
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     
    TBorderIcons tempBI = BorderIcons;
    tempBI >> biMaximize;
    tempBI >> biMinimize;
    tempBI >> biHelp;
    tempBI >> biSystemMenu;
    BorderIcons             =       tempBI;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Application->Terminate();
    }
    //---------------------------------------------------------------------------
    pour envoyer un zip de l'application ( sources, res, .. ) me fournir une adresse.

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Serait il possible d'avoir ce fichier zip svp ?

    Merci

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    ll y a OpenAL pour la faire relativement facilement.

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par fred7163
    Serait il possible d'avoir ce fichier zip svp ?

    Merci
    Salut.

    Je te conseille d'envoyer un MP pour avoir le zip, car le message date du 23/10/2005...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Il y a une solution particulièrement simple: utiliser les fonctions de l'API Windows (comme cela a été dit plus haut je pense).

    Par contre, si c'est pour du traîtement en temps réel, et s'il faut en plus la restitution du son simultanément (ou presque), je ne pense pas que ce soit la bonne solution (quoique... ça doit quand même pouvoir se faire avec cette API, à voir....)

    Enfin bon, voici quelques liens qui m'ont été bien utiles lorsque je me suis attaqué à un programme similaire. Je n'ai pas essayé d'enregistrer du son, mais d'après ce que j'ai vu, le processus est très ressemblant et pas difficile à maîtriser.

    http://msdn.microsoft.com/library/en..._functions.asp

    Regardes là-dedans, en commençant par la fonction "waveInOpen". Le reste devrait venir sans problèmes en fouillant un peu.

    bonne soirée à tous

    bybye!

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci à vous tous pour vos réponses,

    En ce qui concerne ce que je souhaite faire ce n'est pas tout à fait la même chose ....

    Je souhaite détecter des changements d'état sur l'entrée micro passage d'un niveau bas à un niveau haut et compter le nombre de chagement sur une seconde et afficher la valeur en temps réel .... en gros faire un fréquencemètre.

    Merci pour vos idées éventuelles.

    Fred

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par fred7163 Voir le message
    Merci à vous tous pour vos réponses,

    En ce qui concerne ce que je souhaite faire ce n'est pas tout à fait la même chose ....

    Je souhaite détecter des changements d'état sur l'entrée micro passage d'un niveau bas à un niveau haut et compter le nombre de chagement sur une seconde et afficher la valeur en temps réel .... en gros faire un fréquencemètre.

    Merci pour vos idées éventuelles.

    Fred

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/02/2010, 09h53
  2. Récupérer l'entrée son (microphone) de la carte son
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 17/03/2008, 22h20
  3. Réponses: 0
    Dernier message: 08/08/2007, 11h40
  4. Réponses: 6
    Dernier message: 09/04/2007, 16h52
  5. casque-micro bluetooth sans carte son
    Par le mage tophinus dans le forum Périphériques
    Réponses: 6
    Dernier message: 09/11/2005, 08h44

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