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 :

Enregistrer Audio avec c++Builder 6


Sujet :

C++Builder

  1. #1
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut Enregistrer Audio avec c++Builder 6
    Est - ce que il exsite déja une classe qui me permet , d'enregistrer l'audio du microphone de mon pc.
    Ya quelqu'un qui a déja fais ce la.
    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Salut
    vois du coté de fmod , directx ou peut etre son equivalent libre ( opengl ? pas ur )

  3. #3
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut
    Merci Cedni,
    Realement j'ai vu ya la classe TMediaPlayer,, mais je ne sais pas comment faire pour detecter, le microphone (j'ai deux carte audio instaler sur mon pc)
    Ya quelq'un qui a déja fai ce la ?
    merci

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    salut,
    essayes de voir avec les activeX, peut être tu pourra en installer un qui donnera la sollution à ton problème.
    « Aucun homme ne peut rien vous révéler sinon ce qui repose déjà à demi endormi dans l'aube de votre connaissance»

    « No man can reveal to you aught but that which already lies half asleep in the dawning of your knowledge »_(¯`·.__-Alg3ri4nH4ck3r-__.·´¯)_

  5. #5
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut
    est ce que il existe des classe builder, qui detecte quand un device est active sur mon pc? example quand j'utilise mon microphone , la calsse detecte, le device avec son numero.
    merci

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 386
    Points : 1 772
    Points
    1 772
    Par défaut
    Salut !

    Pour cela, je pense qu'il faudrait passer par les API dédiées !
    Reste à savoir ce que tu comptes faire au juste !

    est ce que il existe des classe builder, qui detecte quand un device est active sur mon pc? example quand j'utilise mon microphone , la calsse detecte, le device avec son numero.
    merci
    Alors là par contre ... ???
    Normalement, on ne devrait pas procéder dans ce sens là !
    A mon avis ça reviendrait à rajouter un niveau de difficulté supplémentaire (une sombre histoire de gestion du mixer) !
    En fait, on doit se trouver dans la situation inverse : on sélectionne le dispositif, on l'ouvre, on écoute et on le ferme !

    A plus !

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    utiliser fmod c est le millieur metode pour tavallier par les son

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Alghero
    J'ai trouve un lien sur le site, j'ai teste le code donne il fonctionne bien
    Seul l'initialisation du Tchart a ete laborieuse, pour moi je n'ai pas installe de micro juste celui de la WebCam le programme va bien le recuperer sans mon intervention
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    J ai testé pour voir

    J ai corrigé quelques include pour la vcl

    Mais je ne trouve pas le composant lineseries dans bcb6

    Comment as tu fait ?

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je n'ai rien change au code, pour " LineSeries ", c'est simple dans TreeView un doubleclick sur Chart1 une fenetre s'ouvre clicker sur Add choisir le Type Lines fermer la boite de dialogue le composant qui fait parti de TChart est ajoute
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    merci bien mais rien ne se passe en utilisant le micro de la cam

  12. #12
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Pour l'audio je n'ai que la WebCam de branchee, et elle a ete detectee automatiquement.
    Je viens de modifier le code pour l'integration par code de " LineSeries "
    Le .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
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #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: // IDE-managed Components
            TChart *Chart1;
            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: // User declarations
            void    Fermer_la_capture_audio ( void );
            void    Initialize_Get_audio(void);
            void    Capure_Audio(TMessage &Msg);
    public:  // User declarations
            __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
    Le .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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include <Dialogs.hpp>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "CGAUGES"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    long ilp;
    TLineSeries *Series1;
    #define _20_msec        0.02
    #define scale  0.0030517578125  /*  100 div 32768*/
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    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);
    }
    //---------------------------------------------------------------------------
    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;
     
    // on ajoute TLineSeries deux lignes supplementaires de code
    Series1 = new TLineSeries(Chart1);
    Chart1->AddSeries(Series1);
     
    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();
    }
    //---------------------------------------------------------------------------
    Cela doit fonctionner sans intervention
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Non rien à faire

    J ai essayé avec la webcam , avec un micro sur la carte son
    Parcontre j ai egalement deux mixer possibles , il me semble sur cette carte audio integré 7.1

    Je suis aussi sur Seven .

  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je suis sous XP Pack2 et BCB6, la lecture du micro " Logitech Microphone(Pro 4000) " ca a marche de suite on voit la courbe son sur le " TChart " et le volume sur le " CGauge ", il n'y a pas de retour son dans les HP et l'enregistrement n'est pas implemente, c'est un debut
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  15. #15
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 386
    Points : 1 772
    Points
    1 772
    Par défaut
    Salut !

    Je pense qu'il faudrait détecter les dispositifs audio disponibles (vus par le système).
    Simplement pour permettre à l'utilisateur de travailler avec le bon dispositif !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WAVEINCAPS WaveInCaps;
    UINT WaveInDeviceCode=0;
     
    WAVEOUTCAPS WaveOutCaps;
    UINT WaveOutdeviceCode=0;
    Bien qu'on puisse le faire avec des menus (mainmenu ou popup), je montre au plus simple avec une TComboBox.
    La détection s'effectue dans le constructeur de la form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //REM : TComboBox *WaveInDevs1; 
    UINT Max = waveInGetNumDevs();
    UINT j;
    for(j=0; j < Max; j++)
        {
        waveInGetDevCaps(j, &WaveInCaps, sizeof(WAVEINCAPS));
        WaveInDevs1->Items->Add(WaveInCaps.szPname);
        }
    if(Max != 0)WaveInDevs1->ItemIndex = 0;
    La OnChange de la ComboBox (Enabled à false lors d'une action audio) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TForm1::WaveInDevs1Change(TObject *Sender)
    {
    if(WaveInDevs1->ItemIndex != -1)
        {
        WaveInDeviceCode = WaveInDevs1->ItemIndex;
        }
    }
    On dispose ainsi d'un WaveInDevCode valide et ciblé pour la waveInOpen.

    A noter qu'à ce stade ce qui se pense en waveIn se pense de la même manière en waveOut !



    A plus !

Discussions similaires

  1. [WD18] Enregistrement audio avec Windev
    Par Beright dans le forum WinDev
    Réponses: 4
    Dernier message: 25/06/2015, 12h30
  2. Réponses: 4
    Dernier message: 13/04/2010, 15h50
  3. Enregistrer de l'audio avec php
    Par persia dans le forum Langage
    Réponses: 9
    Dernier message: 07/12/2006, 17h16
  4. Utiliser DirectX 9 avec C++Builder
    Par Olivier Constans dans le forum DirectX
    Réponses: 2
    Dernier message: 27/06/2005, 11h30
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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