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

Langage C++ Discussion :

Gestion de l'audio


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut Gestion de l'audio
    Bonjour a tous,
    Je voudrais que les appels que je reçois chez moi sur mon fixe puisse étre transférer sur le pc a mon bureau.
    Je voudrais l'avis d'expert pour réaliser une partie de mon programme.
    J'ai donc commencé par la réception des appels avec un modem et j'ai réalisé un mini winphone.
    Ensuite j'ai créé une socket qui permet de faire communiquer les deux pc.
    Maintenant il me reste a récupérer le son des enceintes du pc de chez moi pour l'envoyer via la socket au pc bureau et le réinjecter a la carte audio du pc pour entendre mon interlocuteur.
    Inversement pour le micro du pc de mon bureau.

    C'est donc pour la partie de la gestion du son que je me tourne vers vous, car aprés des recherches sur le net j'ai trouvé quelques solutions mais je ne sais pas laquelle serais la plus adapté a mon probléme, et je voudrais savoir comment vous vous feriez.
    Je n'ai pas trouver grand chose a ce sujet a la Faq

    Merci d'avance
    cordialement charléne

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Personne n'a d'idée ou une piste a exploité car je ne vois pas vraiment comment réaliser la capture audio.
    svp

  3. #3
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Le son que tu envoies aux enceintes de ton PC, il doit s'agir d'un flux, que tu récupères pour le transférer via socket (TCP ou UDP, à toi de voir). Ensuite tu utilises une bibliothèque de traitement de son (FMOD, DirectShow, ...) à laquelle tu passes ce flux.
    Le point le plus compliqué là dedans est certainement de récupérer le flux avant de l'envoyer
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Bonjour dragonjoker59,
    Merci d'avoir pris le temps de me répondre.
    Le point le plus compliqué là dedans est certainement de récupérer le flux avant de l'envoyer
    il est certain que se n'es pas simple, c'est pour cela que je voulais l'avis d'experts.
    Mais visiblement la gestion de l'audio est un sujet tabou je ne trouve pas grand chose.
    j'ai commencé avec waveIn mais j'ai quelques souci.
    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
     
    #include "mmsystem.h"
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //handle sur la carte son (entrée)
    HWAVEIN m_hWaveIn;
    //structure Wave
    WAVEFORMATEX m_WaveFormat;
     
    static const int NB_BUFFER = 32;
    static const int TAILLE_BUFFER = 4096;
    //buffers d'entrée
    WAVEHDR m_WaveInHeader[NB_BUFFER];
    BYTE m_pWaveInBuffer[NB_BUFFER * TAILLE_BUFFER];
     
     
    if(waveInOpen(&m_hWaveIn,WAVE_MAPPER,&m_WaveFormat,NULL,NULL,CALLBACK_FUNCTION) == MMSYSERR_NOERROR)
      {
      //initialiser chaque buffer d'entrée
      for(int j=0;j<NB_BUFFER;j++)
        {
        //initialisations
        memset(&m_WaveInHeader[j],0,sizeof(WAVEHDR));
        m_WaveInHeader[j].lpData = (LPSTR)&m_pWaveInBuffer[j * TAILLE_BUFFER];
        m_WaveInHeader[j].dwBufferLength = TAILLE_BUFFER;
        m_WaveInHeader[j].dwUser =(DWORD)this;
        //préparer le buffer
        if(waveInPrepareHeader(m_hWaveIn,&m_WaveInHeader[j],sizeof(WAVEHDR)) == MMSYSERR_NOERROR)
          {
          //ajouter le buffer dans la queue
          waveInAddBuffer(m_hWaveIn,&m_WaveInHeader[j],sizeof(WAVEHDR));
          }
        }
      //commencer l'acquisition
      if(waveInStart(m_hWaveIn)==MMSYSERR_NOERROR);
        {
        Memo1->Lines->Add("\nAcquisition OK");
        }
      }
    }
    J'ai mis NULL pour le 4em et 5em argument de waveInOpen car j'ai pas bien compris sur msdn , et du coup j'ai une erreur de classe d'exception ...

    Merci d'avance pour votre aide

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Bonjour,
    j'ai perfectionné le code mais il y a toujours quelques truck qui ne vont pas
    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
     
    // ********************************************************
    // Déclaration des variables Globales
    // ********************************************************
    // Handle de la carte son
    static HWAVEIN hwi = NULL;
    // Structure pour les functions waveIn
    static WAVEFORMATEX wfx;
    static WAVEHDR wh[NB_BUFFER];
    // Buffers de capture
    static short Buffer[NB_BUFFER][TAILLE_BUFFER / 2], BufferTmp[TAILLE_BUFFER / 2] = {0};
    int Enregistrement=0;
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int i;
    Enregistrement = 1;
     
    // On regarde s'il y a au moins une carte son
    if ( waveInGetNumDevs() <= 0)
      {
      Memo3->Lines->Add("ERREUR\r\nIl n'y a pas de carte son");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nCarte son détectée");
      }
     
    // Preparation des formats pour la carte son
    wfx.wFormatTag = WAVE_FORMAT_PCM;
    wfx.nChannels = 1;                  // Mono
    wfx.nSamplesPerSec = 44100;         // Frequence d'echantillonnage
    wfx.wBitsPerSample = 16;            // Dynamique
    wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample) / 8; // C'est MSDN qui l'a dit
    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; // Ca aussi
     
    // Ouverture de la carte son
    if ( waveInOpen(&hwi, 0, &wfx, 0, 0,   WAVE_MAPPED) != MMSYSERR_NOERROR )
      {
      Memo3->Lines->Add("ERREUR\r\nProblème a l'ouverture de la carte son");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nCarte son ouverte");
      }
     
    // Pour chaque buffer
    for(i=0; i<NB_BUFFER; i++)
      {
      // Preparation de la structure
      wh[i].lpData = (char*)Buffer[i];
      wh[i].dwBufferLength = TAILLE_BUFFER;
      wh[i].dwBytesRecorded = 0;
      wh[i].dwUser = 0;
      wh[i].dwFlags = 0;
      wh[i].dwLoops = 0;
      wh[i].lpNext = 0;
      wh[i].reserved = 0;
      // Preparation des entetes
      if ( waveInPrepareHeader(hwi, &wh[i], sizeof(wh[i])) == MMSYSERR_NOERROR)
        {
        Memo3->Lines->Add("OK\r\nPréparation des buffers ok");
        }
      else
        {
        Memo3->Lines->Add("ERREUR\r\nImpossible de préparer les buffers");
        }
      // Ajout
      if ( waveInAddBuffer(hwi, &wh[i], sizeof(wh[i])) == MMSYSERR_NOERROR)
        {
        Memo3->Lines->Add("OK\r\nAjout des buffers");
        }
      else
        {
        Memo3->Lines->Add("ERREUR\r\nImpossible d'ajouter les buffers");
        }
      }
    //commencer l'acquisition
    if ( waveInStart(hwi) != MMSYSERR_NOERROR )
      {
    Memo3->Lines->Add("ERREUR\r\nProblème d'acquisition");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nEn cours d'acquisition");
      }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Enregistrement=0;
    //arréter l'acquisition
     
    if ( waveInReset(hwi) != MMSYSERR_NOERROR )
      {
    Memo3->Lines->Add("ERREUR\r\nImpossible de reset la carte son");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nReset de la carte son");
      }
    if ( waveInStop(hwi) != MMSYSERR_NOERROR )
      {
    Memo3->Lines->Add("ERREUR\r\nImpossible d'arréter l'acquisition");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nAcquisition arréter");
      }
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    int i = 0;
    if ( Enregistrement == 1 )
      {
      for (i=0; i<NB_BUFFER; i++)
        {
        if ( wh[i].dwFlags == 3 ) //normalement if ( wh[i].dwFlags == WHDR_DONE )
          {
          Memo4->Lines->Add(wh[i].lpData);
          wh[i].lpData="";
          wh[i].dwFlags = 0;
          waveInAddBuffer(hwi, &wh[i], sizeof(wh[i]));
          }
        }
      }
    }
    //---------------------------------------------------------------------------
    Lors de la préparation de la structure j'ai réglé le flag des buffers a 0 " wh[i].dwFlags = 0;" comme indiqué par msdn pour le réaliser waveInPrepareHeader. Msdn dit aussi que lorsque le tampon est plein le flag passe a WHDR_DONE, Pour ma part ils ne passe jamais par cette valeur (1er probléme).
    En mode pas a pas j'ai remarque que lorsqu'il y avais des donnée dans le buffer le flag passe a 3 c'est pour cela que pour les tests lors de l'événement timer j'ai mis cette valeur .
    J'affiche les données des buffers sur le memo 1 fois uniquement et ensuite plus rien. Je pensais qu'aprés la lecture du buffer avec la commande "waveInAddBuffer" le buffer se remettrer a l'écoute mais ce n'es pas le cas (2em probléme).
    Je pense que cela est du a la commande "waveInOpen", je n'ai pas définis de Callback , car je n'ai pas bien compris les explications de msdn et je ne vois pas comment faire .
    Je me pose aussi une autre question, comment sont rempli les buffers. On rempli le premier que l'on a posé sur le flux, une fois qu'il est plein on rempli le deuxiéme, le temp du remplissage du 2em on a eu le temp de traiter les données du 1er et on l'a remis sur le flux.
    Pour le code ici j'utilise 3 buffers car j'ai lu que pour le son en mono il en fallais au moin 2.
    Bon bah voila... cela fait beaucoup de question mais je me suis pris la téte la dessus toute la soirée d'hier et un petit coup de pouce serai le bienvenu.

    Merci d'avance pour votre aide.
    Cordialement charléne

Discussions similaires

  1. [Audio] Gestion du temps et du volume d'un fichier audio
    Par N1c0l@s dans le forum Multimédia
    Réponses: 3
    Dernier message: 01/11/2011, 13h35
  2. [Joomla!] Cherche composant de gestion de fichiers Audio
    Par Alcius dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 22/07/2009, 13h44
  3. [Galerie] Recherche Script de gestion Audio (play/FWD/RWD/RECORD)
    Par zanyth dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 24/11/2008, 13h43
  4. Gestion de fichiers audio
    Par AureK dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 01/11/2007, 23h32
  5. gestion flux audio en reseau
    Par acnalbasac dans le forum Développement
    Réponses: 1
    Dernier message: 18/04/2007, 10h29

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