begin process at 2010 09 03 03:12:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Multimédia

 > MOTEUR AUDIO TEMPS REEL

MOTEUR AUDIO TEMPS REEL


 Information sur la source

Note :
7 / 10 - par 2 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Multimédia Classé sous :waveinopen, waveoutopen, waveoutwrite, waveinaddbuffer, waveoutprepareheader Niveau :Initié Date de création :08/08/2003 Date de mise à jour :13/03/2007 16:18:57 Vu / téléchargé :12 114 / 4 193

Auteur : gabuzomeuh

Ecrire un message privé
Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Fonctionnement: le signal en entrée ligne du PC sort directement à la sortie avec un léger retard du au temps de rotation de tous les buffers.

Ce code permet d'effectuer du traitement de signal en temps réel en modifiant le contenu du buffer (Buffer)

Source

  • #include <windows.h>
  • #include "stdafx.h"
  • #include "resource.h"
  • #include <mmsystem.h>
  • #include <malloc.h>
  • #include <stdio.h>
  • #include <commctrl.h>
  • #define BUFFER_SIZE 16384
  • #define SAMPLERATE 44100
  • #define CANAUX 2
  • #define OCTETS 2
  • HWND DlgMain;
  • PBYTE Buffer;
  • HWAVEIN hWaveIn;
  • HWAVEOUT hWaveOut;
  • PBYTE pBufferIn1, pBufferIn2, pBufferIn3, pBufferOut1, pBufferOut2, pBufferOut3;
  • PWAVEHDR pWaveHdrIn1, pWaveHdrIn2, pWaveHdrIn3, pWaveHdrOut1, pWaveHdrOut2, pWaveHdrOut3;
  • WAVEFORMATEX waveform;
  • BOOL flag_in_open = FALSE;
  • BOOL flag_out_open = FALSE;
  • HANDLE WorkerThreadHandleIn;
  • DWORD WorkerThreadIdIn;
  • HANDLE WorkerThreadHandleOut;
  • DWORD WorkerThreadIdOut;
  • //****************************************************************************
  • DWORD WINAPI WorkerThreadProcIn (void *Arg)
  • {
  • SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
  • MSG Msg;
  • while (GetMessage (&Msg, NULL, 0, 0) == TRUE)
  • {
  • switch (Msg.message)
  • {
  • case MM_WIM_OPEN:
  • {
  • MessageBox(DlgMain,"In open","RTA",MB_OK);
  • flag_in_open = TRUE;
  • waveInAddBuffer(hWaveIn,pWaveHdrIn1,sizeof(WAVEHDR));
  • waveInAddBuffer(hWaveIn,pWaveHdrIn2,sizeof(WAVEHDR));
  • waveInAddBuffer(hWaveIn,pWaveHdrIn3,sizeof(WAVEHDR));
  • waveInStart(hWaveIn);
  • break;
  • }
  • case MM_WIM_DATA:
  • {
  • WAVEHDR *Hdr = (WAVEHDR *)Msg.lParam;
  • CopyMemory(Buffer,Hdr->lpData,BUFFER_SIZE);
  • waveInAddBuffer (hWaveIn, Hdr, sizeof (*Hdr));
  • break;
  • }
  • }
  • }
  • return 0;
  • }
  • //****************************************************************************
  • DWORD WINAPI WorkerThreadProcOut (void *Arg)
  • {
  • SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
  • MSG Msg;
  • while (GetMessage (&Msg, NULL, 0, 0) == TRUE)
  • {
  • switch (Msg.message)
  • {
  • case MM_WOM_OPEN:
  • {
  • MessageBox(DlgMain,"Out open","RTA",MB_OK);
  • flag_out_open = TRUE;
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
  • waveOutWrite(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));
  • waveOutWrite(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));
  • waveOutWrite(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));
  • break;
  • }
  • case MM_WOM_DONE:
  • {
  • WAVEHDR *Hdr = (WAVEHDR *)Msg.lParam;
  • waveOutPrepareHeader (hWaveOut, Hdr, sizeof (*Hdr));
  • waveOutWrite (hWaveOut, Hdr, sizeof (*Hdr));
  • CopyMemory(Hdr->lpData,Buffer,BUFFER_SIZE);
  • break;
  • }
  • }
  • }
  • return 0;
  • }
  • //****************************************************************************
  • BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  • {
  • static int volume_general;
  • if (msg == WM_INITDIALOG)
  • {
  • DlgMain = hWnd;
  • return 0;
  • }
  • if (msg == WM_COMMAND)
  • {
  • if (wParam == ID_START)
  • {
  • if(flag_in_open == TRUE)
  • {
  • MessageBox(hWnd,"périphérique déjà ouvert","Erreur",0);
  • return 0;
  • }
  • WorkerThreadHandleIn = CreateThread (NULL, 0, WorkerThreadProcIn, NULL, 0, &WorkerThreadIdIn );
  • WorkerThreadHandleOut = CreateThread (NULL, 0, WorkerThreadProcOut, NULL, 0, &WorkerThreadIdOut );
  • pWaveHdrIn1 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • pWaveHdrIn2 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • pWaveHdrIn3 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • pWaveHdrOut1 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • pWaveHdrOut2 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • pWaveHdrOut3 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
  • Buffer = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferIn1 = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferIn2 = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferIn3 = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferOut1 = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferOut2 = (PBYTE)malloc(BUFFER_SIZE);
  • pBufferOut3 = (PBYTE)malloc(BUFFER_SIZE);
  • if(!pBufferIn1 || !pBufferIn2 || !pBufferIn3 || !pBufferOut1 || !pBufferOut2 || !pBufferOut3)
  • {
  • if(pBufferIn1) free (pBufferIn1);
  • if(pBufferIn2) free (pBufferIn2);
  • if(pBufferIn3) free (pBufferIn3);
  • if(pBufferOut1) free (pBufferOut1);
  • if(pBufferOut2) free (pBufferOut2);
  • if(pBufferOut3) free (pBufferOut3);
  • MessageBox(hWnd,"Erreur d'allocation de mémoire","Erreur",0);
  • return TRUE;
  • }
  • waveform.nChannels = CANAUX; // 1 pour mono 2 pour stereo
  • waveform.wBitsPerSample = 8 * OCTETS; // 8 ou 16 bit
  • waveform.nAvgBytesPerSec = SAMPLERATE * waveform.nChannels * waveform.wBitsPerSample/8; // nombre d'octets par seconde
  • waveform.wFormatTag = 1; // 1 pour PCM
  • waveform.nSamplesPerSec = SAMPLERATE; // frequence d'echantillonnage
  • waveform.nBlockAlign = 1;
  • waveform.cbSize = 0;
  • if(waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)WorkerThreadIdIn,0,CALLBACK_THREAD))
  • {
  • free(pBufferIn1);
  • free(pBufferIn2);
  • free(pBufferIn3);
  • MessageBox(hWnd,"ouverture du périphérique d'entrée impossible","WARNING",MB_OK);
  • return 0;
  • }
  • pWaveHdrIn1->lpData = (LPSTR)pBufferIn1;
  • pWaveHdrIn1->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrIn1->dwBytesRecorded = 0;
  • pWaveHdrIn1->dwUser = 0;
  • pWaveHdrIn1->dwFlags = 0;
  • pWaveHdrIn1->dwLoops = 0;
  • pWaveHdrIn1->lpNext = NULL;
  • pWaveHdrIn1->reserved = 0;
  • waveInPrepareHeader(hWaveIn,pWaveHdrIn1,sizeof(WAVEHDR));
  • pWaveHdrIn2->lpData = (LPSTR)pBufferIn2;
  • pWaveHdrIn2->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrIn2->dwBytesRecorded = 0;
  • pWaveHdrIn2->dwUser = 0;
  • pWaveHdrIn2->dwFlags = 0;
  • pWaveHdrIn2->dwLoops = 0;
  • pWaveHdrIn2->lpNext = NULL;
  • pWaveHdrIn2->reserved = 0;
  • waveInPrepareHeader(hWaveIn,pWaveHdrIn2,sizeof(WAVEHDR));
  • pWaveHdrIn3->lpData = (LPSTR)pBufferIn3;
  • pWaveHdrIn3->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrIn3->dwBytesRecorded = 0;
  • pWaveHdrIn3->dwUser = 0;
  • pWaveHdrIn3->dwFlags = 0;
  • pWaveHdrIn3->dwLoops = 0;
  • pWaveHdrIn3->lpNext = NULL;
  • pWaveHdrIn3->reserved = 0;
  • waveInPrepareHeader(hWaveIn,pWaveHdrIn3,sizeof(WAVEHDR));
  • if(waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,(DWORD)WorkerThreadIdOut,0,CALLBACK_THREAD))
  • {
  • free(pBufferOut1);
  • free(pBufferOut2);
  • free(pBufferOut3);
  • MessageBox(hWnd,"ouverture du périphérique de sortie impossible","WARNING",MB_OK);
  • return 0;
  • }
  • pWaveHdrOut1->lpData = (LPSTR)pBufferOut1;
  • pWaveHdrOut1->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrOut1->dwBytesRecorded = 0;
  • pWaveHdrOut1->dwUser = 0;
  • pWaveHdrOut1->dwFlags = 0;
  • pWaveHdrOut1->dwLoops = 0;
  • pWaveHdrOut1->lpNext = NULL;
  • pWaveHdrOut1->reserved = 0;
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
  • pWaveHdrOut2->lpData = (LPSTR)pBufferOut2;
  • pWaveHdrOut2->dwBufferLength = BUFFER_SIZE;
  • pWaveHdrOut2->dwBytesRecorded = 0;
  • pWaveHdrOut2->dwUser = 0;
  • pWaveHdrOut2->dwFlags = 0;
  • pWaveHdrOut2->dwLoops = 0;
  • pWaveHdrOut2->lpNext = NULL;
  • pWaveHdrOut2->reserved = 0;
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));
  • pWaveHdrOut3->lpData =(LPSTR)pBufferOut3;
  • pWaveHdrOut3->dwBufferLength =BUFFER_SIZE;
  • pWaveHdrOut3->dwBytesRecorded =0;
  • pWaveHdrOut3->dwUser =0;
  • pWaveHdrOut3->dwFlags =0;
  • pWaveHdrOut3->dwLoops =0;
  • pWaveHdrOut3->lpNext =NULL;
  • pWaveHdrOut3->reserved =0;
  • waveOutPrepareHeader(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));
  • return 0;
  • }
  • if (wParam == IDCANCEL)
  • {
  • if(MessageBox(hWnd, "Voulez-vous vraiment arrêter l'application en cours ?", "Real Time Audio",MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2) == IDNO)
  • {
  • return TRUE;
  • }
  • EndDialog(hWnd, 0);
  • return 0;
  • }
  • }
  • return 0;
  • }
  • //****************************************************************************
  • int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  • {
  • InitCommonControls();
  • DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),HWND_DESKTOP,DlgProc);
  • return 0;
  • }
  • //****************************************************************************
#include <windows.h>
#include "stdafx.h"
#include "resource.h"
#include <mmsystem.h>
#include <malloc.h>
#include <stdio.h>
#include <commctrl.h>

#define BUFFER_SIZE 16384
#define SAMPLERATE 44100
#define CANAUX 2
#define OCTETS 2

HWND DlgMain;
PBYTE Buffer;
HWAVEIN hWaveIn;
HWAVEOUT hWaveOut;
PBYTE pBufferIn1, pBufferIn2, pBufferIn3, pBufferOut1, pBufferOut2, pBufferOut3;
PWAVEHDR pWaveHdrIn1, pWaveHdrIn2, pWaveHdrIn3, pWaveHdrOut1, pWaveHdrOut2, pWaveHdrOut3;
WAVEFORMATEX waveform;
BOOL flag_in_open = FALSE;
BOOL flag_out_open = FALSE;

HANDLE WorkerThreadHandleIn;
DWORD WorkerThreadIdIn;
HANDLE WorkerThreadHandleOut;
DWORD WorkerThreadIdOut;

//****************************************************************************

DWORD WINAPI WorkerThreadProcIn (void *Arg)
{
  SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
  MSG Msg;

  while (GetMessage (&Msg, NULL, 0, 0) == TRUE)
   {
    switch (Msg.message)
     {
      case MM_WIM_OPEN:
       {
        MessageBox(DlgMain,"In open","RTA",MB_OK);
        flag_in_open = TRUE;
        waveInAddBuffer(hWaveIn,pWaveHdrIn1,sizeof(WAVEHDR));
        waveInAddBuffer(hWaveIn,pWaveHdrIn2,sizeof(WAVEHDR));
        waveInAddBuffer(hWaveIn,pWaveHdrIn3,sizeof(WAVEHDR));
        waveInStart(hWaveIn);  
        break;
       }

      case MM_WIM_DATA:
       {
        WAVEHDR *Hdr = (WAVEHDR *)Msg.lParam;
        CopyMemory(Buffer,Hdr->lpData,BUFFER_SIZE);
        waveInAddBuffer (hWaveIn, Hdr, sizeof (*Hdr));
        break;
       }
     }
   }
  return 0; 
}

//****************************************************************************

DWORD WINAPI WorkerThreadProcOut (void *Arg)
{
  SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
  MSG Msg;

  while (GetMessage (&Msg, NULL, 0, 0) == TRUE)
   {
    switch (Msg.message)
     {
      case MM_WOM_OPEN:
       {
        MessageBox(DlgMain,"Out open","RTA",MB_OK);
        flag_out_open = TRUE;
        waveOutPrepareHeader(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
        waveOutWrite(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
        waveOutPrepareHeader(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));
        waveOutWrite(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));
        waveOutPrepareHeader(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));
        waveOutWrite(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));
        break;
       }

      case MM_WOM_DONE:
       {
        WAVEHDR *Hdr = (WAVEHDR *)Msg.lParam;
        waveOutPrepareHeader (hWaveOut, Hdr, sizeof (*Hdr));
        waveOutWrite (hWaveOut, Hdr, sizeof (*Hdr));
        CopyMemory(Hdr->lpData,Buffer,BUFFER_SIZE);
        break;
       }
     }
   }
  return 0; 
}

//****************************************************************************

BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{  


  static int volume_general;

  if (msg == WM_INITDIALOG)
   {
    DlgMain = hWnd;
    return 0;
   }







  if (msg == WM_COMMAND)
   {
    if (wParam == ID_START)
     {
      if(flag_in_open == TRUE)
       {
        MessageBox(hWnd,"périphérique déjà ouvert","Erreur",0);
        return 0;
       }
       
      WorkerThreadHandleIn = CreateThread (NULL, 0, WorkerThreadProcIn, NULL, 0, &WorkerThreadIdIn );
      WorkerThreadHandleOut = CreateThread (NULL, 0, WorkerThreadProcOut, NULL, 0, &WorkerThreadIdOut );
      pWaveHdrIn1 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      pWaveHdrIn2 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      pWaveHdrIn3 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      pWaveHdrOut1 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      pWaveHdrOut2 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      pWaveHdrOut3 = (PWAVEHDR) malloc(sizeof(WAVEHDR));
      
      Buffer   = (PBYTE)malloc(BUFFER_SIZE);
      pBufferIn1 = (PBYTE)malloc(BUFFER_SIZE);
      pBufferIn2 = (PBYTE)malloc(BUFFER_SIZE);
      pBufferIn3 = (PBYTE)malloc(BUFFER_SIZE);
      pBufferOut1 = (PBYTE)malloc(BUFFER_SIZE);
      pBufferOut2 = (PBYTE)malloc(BUFFER_SIZE);
      pBufferOut3 = (PBYTE)malloc(BUFFER_SIZE);
    
      if(!pBufferIn1 || !pBufferIn2 || !pBufferIn3 || !pBufferOut1 || !pBufferOut2 || !pBufferOut3)
       {
        if(pBufferIn1) free (pBufferIn1);
        if(pBufferIn2) free (pBufferIn2);
        if(pBufferIn3) free (pBufferIn3);
        if(pBufferOut1) free (pBufferOut1);
        if(pBufferOut2) free (pBufferOut2);
        if(pBufferOut3) free (pBufferOut3);
        MessageBox(hWnd,"Erreur d'allocation de mémoire","Erreur",0);
        return TRUE;
       }     
    
      waveform.nChannels = CANAUX; // 1 pour mono 2 pour stereo
      waveform.wBitsPerSample = 8 * OCTETS; // 8 ou 16 bit
      waveform.nAvgBytesPerSec = SAMPLERATE * waveform.nChannels * waveform.wBitsPerSample/8; // nombre d'octets par seconde
      waveform.wFormatTag = 1; // 1 pour PCM
      waveform.nSamplesPerSec = SAMPLERATE; // frequence d'echantillonnage
      waveform.nBlockAlign = 1;
      waveform.cbSize = 0;

      if(waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)WorkerThreadIdIn,0,CALLBACK_THREAD))
       {
        free(pBufferIn1);
        free(pBufferIn2);
        free(pBufferIn3);
        MessageBox(hWnd,"ouverture du périphérique d'entrée impossible","WARNING",MB_OK);
        return 0;
       }

      pWaveHdrIn1->lpData          = (LPSTR)pBufferIn1;
      pWaveHdrIn1->dwBufferLength  = BUFFER_SIZE;
      pWaveHdrIn1->dwBytesRecorded = 0;
      pWaveHdrIn1->dwUser          = 0;
      pWaveHdrIn1->dwFlags         = 0;
      pWaveHdrIn1->dwLoops         = 0;
      pWaveHdrIn1->lpNext          = NULL;
      pWaveHdrIn1->reserved        = 0;    
      waveInPrepareHeader(hWaveIn,pWaveHdrIn1,sizeof(WAVEHDR));
    
      pWaveHdrIn2->lpData          = (LPSTR)pBufferIn2;
      pWaveHdrIn2->dwBufferLength  = BUFFER_SIZE;
      pWaveHdrIn2->dwBytesRecorded = 0;
      pWaveHdrIn2->dwUser          = 0;
      pWaveHdrIn2->dwFlags         = 0;
      pWaveHdrIn2->dwLoops         = 0;
      pWaveHdrIn2->lpNext          = NULL;
      pWaveHdrIn2->reserved        = 0;    
      waveInPrepareHeader(hWaveIn,pWaveHdrIn2,sizeof(WAVEHDR));

      pWaveHdrIn3->lpData          = (LPSTR)pBufferIn3;
      pWaveHdrIn3->dwBufferLength  = BUFFER_SIZE;
      pWaveHdrIn3->dwBytesRecorded = 0;
      pWaveHdrIn3->dwUser          = 0;
      pWaveHdrIn3->dwFlags         = 0;
      pWaveHdrIn3->dwLoops         = 0;
      pWaveHdrIn3->lpNext          = NULL;
      pWaveHdrIn3->reserved        = 0;    
      waveInPrepareHeader(hWaveIn,pWaveHdrIn3,sizeof(WAVEHDR));      

      if(waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,(DWORD)WorkerThreadIdOut,0,CALLBACK_THREAD))
       {
        free(pBufferOut1);
        free(pBufferOut2);
        free(pBufferOut3);
        MessageBox(hWnd,"ouverture du périphérique de sortie impossible","WARNING",MB_OK);
        return 0;
       }    

      pWaveHdrOut1->lpData = (LPSTR)pBufferOut1;
      pWaveHdrOut1->dwBufferLength = BUFFER_SIZE;
      pWaveHdrOut1->dwBytesRecorded = 0;
      pWaveHdrOut1->dwUser = 0;
      pWaveHdrOut1->dwFlags = 0;
      pWaveHdrOut1->dwLoops = 0;
      pWaveHdrOut1->lpNext = NULL;
      pWaveHdrOut1->reserved = 0;    
      waveOutPrepareHeader(hWaveOut,pWaveHdrOut1,sizeof(WAVEHDR));
    
      pWaveHdrOut2->lpData = (LPSTR)pBufferOut2;
      pWaveHdrOut2->dwBufferLength = BUFFER_SIZE;
      pWaveHdrOut2->dwBytesRecorded = 0;
      pWaveHdrOut2->dwUser = 0;
      pWaveHdrOut2->dwFlags = 0;
      pWaveHdrOut2->dwLoops = 0;
      pWaveHdrOut2->lpNext = NULL;
      pWaveHdrOut2->reserved = 0;    
      waveOutPrepareHeader(hWaveOut,pWaveHdrOut2,sizeof(WAVEHDR));
    
      pWaveHdrOut3->lpData =(LPSTR)pBufferOut3;
      pWaveHdrOut3->dwBufferLength =BUFFER_SIZE;
      pWaveHdrOut3->dwBytesRecorded =0;
      pWaveHdrOut3->dwUser =0;
      pWaveHdrOut3->dwFlags =0;
      pWaveHdrOut3->dwLoops =0;
      pWaveHdrOut3->lpNext =NULL;
      pWaveHdrOut3->reserved =0;    
      waveOutPrepareHeader(hWaveOut,pWaveHdrOut3,sizeof(WAVEHDR));      

      return 0;
     }

    if (wParam == IDCANCEL)
     {
      if(MessageBox(hWnd, "Voulez-vous vraiment arrêter l'application en cours ?", "Real Time Audio",MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2) == IDNO)
       {
        return TRUE;
       }
      EndDialog(hWnd, 0);
      return 0;
     }
   }



  return 0;
}

//****************************************************************************
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  InitCommonControls();
  DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),HWND_DESKTOP,DlgProc);
  return 0;
}

//****************************************************************************


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

11 janvier 2005 11:59:22 :
changement de tittre
14 janvier 2005 07:10:14 :
ré-ecriture du code
14 janvier 2005 07:21:17 :
mise en page
14 janvier 2005 07:25:20 :
commentaires
22 janvier 2005 00:14:46 :
ajout capture d'écran
08 mars 2007 22:46:01 :
refonte complète du code
08 mars 2007 22:58:39 :
mise en page
13 mars 2007 16:18:58 :
séparation des procédures In et Out

 Sources du même auteur

Source avec Zip Source avec une capture MOTEUR AUDIO TEMPS REEL AVEC GESTION DU VOLUME
Source avec Zip Source avec une capture GÉNÉRATEUR DE SIGNAL BASSE FRÉQUENCE TEMPS RÉEL
Source avec Zip Source avec une capture PLUGIN ECHO POUR WINAMP
MODIFIER LA HAUTEUR DE LA BARRE DE TACHES
Source avec Zip Source avec une capture GÉNÉRATEUR DE FICHIER WAV DE RÉFÉRENCE POUR CD DE TEST

 Sources de la même categorie

Source avec Zip Source avec une capture GÉNÉRATEUR FM EXPÉRIMENTAL par tontonCD
Source avec Zip LECTEUR MULTIMÉDIA par omegatou
Source avec Zip IMPLÉMENTATION D'UN ALGORITHME DE COMPRESSION/DECOMPRESSION ... par eemikhm
Source avec Zip Source avec une capture [WIN32] EASY WAVE MIXER par ordiman85
METTRE À JOUR LE TITRE DU MORCEAU EN COURS DANS MSN LIVE par citronz1969

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [WIN32] EASY WAVE MIXER par ordiman85
Source avec Zip Source avec une capture GÉNÉRATEUR DE SIGNAL BASSE FRÉQUENCE TEMPS RÉEL par gabuzomeuh
Source avec Zip ENREGISTREMENT DE L'ENTRÉE MICRO par Arnotic

Commentaires et avis

Commentaire de Arnotic le 08/08/2003 17:35:20 administrateur CS

Salut,
Ton programme semble super bien, mais j'ai quelques petit problème. Lorsque je l'execute je clique sur start et là j'ai un msg de windows m'informant que l'insttruction 0x0040108E emploie l'adresse 0x0042301c et que la mémoire ne peut être "written".
Des explications ?

@+

Commentaire de gabuzomeuh le 08/08/2003 17:53:11

Non je ne vois pas d'explication je n'ai jamais eu ce message d'erreur le mieux est de le faire tourner en pas a pas pour voir quelle fonction genere l'erreur

A+

Commentaire de Arnotic le 08/08/2003 18:02:46 administrateur CS

c'est sur cette ligne : dst[i]=0x30+((((0x0f0000000)&gt;&gt;(i*4))&valeur)&gt;&gt;(28-i*4));

@+

Commentaire de gabuzomeuh le 08/08/2003 18:18:50

Le mieux est de remplacer la boucle

for (i=0; i&lt;8; i++)
{
  dst[i]=0x30+((((0x0f0000000)&gt;&gt;(i*4))&valeur)&gt;&gt;(28-i*4));
  if (dst[i]&gt;0x39) dst[i]=0x37+((((0x0f0000000)&gt;&gt;(i*4))&valeur)&gt;&gt;(28-i*4));
}

par:

dst[0]=0x30+((0x0f0000000 & valeur)&gt;&gt;28);
dst[1]=0x30+((0x00f000000 & valeur)&gt;&gt;24);
dst[2]=0x30+((0x000f00000 & valeur)&gt;&gt;20);
dst[3]=0x30+((0x0000f0000 & valeur)&gt;&gt;16);
dst[4]=0x30+((0x00000f000 & valeur)&gt;&gt;12);
dst[5]=0x30+((0x000000f00 & valeur)&gt;&gt;8);
dst[6]=0x30+((0x0000000f0 & valeur)&gt;&gt;4);
dst[7]=0x30+((0x00000000f & valeur));
if (dst[0]&gt;0x39) dst[0]=0x37+((0x0f0000000 & valeur)&gt;&gt;28);
if (dst[1]&gt;0x39) dst[1]=0x37+((0x00f000000 & valeur)&gt;&gt;24) ;
if (dst[2]&gt;0x39) dst[2]=0x37+((0x000f00000 & valeur)&gt;&gt;20)  ;
if (dst[3]&gt;0x39) dst[3]=0x37+((0x0000f0000 & valeur)&gt;&gt;16);
if (dst[4]&gt;0x39) dst[4]=0x37+((0x00000f000 & valeur)&gt;&gt;12) ;
if (dst[5]&gt;0x39) dst[5]=0x37+((0x000000f00 & valeur)&gt;&gt;8)  ;
if (dst[6]&gt;0x39) dst[6]=0x37+((0x0000000f0 & valeur)&gt;&gt;4)   ;
if (dst[7]&gt;0x39) dst[7]=0x37+((0x00000000f & valeur))    ;

Commentaire de Arnotic le 08/08/2003 18:22:43 administrateur CS

merci, mais ca plante toujours sur la ligne : dst[0]=0x30+((0x0f0000000 & valeur)&gt;&gt;28);

Commentaire de gabuzomeuh le 08/08/2003 18:31:35

Le but de la fonction convertir_nombre_long_ascii est de convertir un nombre de 32 bit en un chaine de caractere representant ce nombre.
Elle ne sert pas a grand chose dans le code, on peut la supprimer ou essayer de l'ecrire d'une autre facon.
Je m'en sers comme temoin de passage dans les fonctions waveinproc et waveoutproc.
Cela m'a permis de me rendre compte du decalage dans le temps entre les 2 fonctions waveinproc et waveoutproc.

Le probleme que j'essaie de resoudre est le decalage qu'il y a entre les fonctions waveinproc et waveoutproc.


A+

Commentaire de Arnotic le 08/08/2003 18:37:12 administrateur CS

j'ai bien supprimer le code en attendant, juste une question ca ne plante plus, mais par contre rien ne se passe à l'écran et je n'atends rien à part un grisillement, est-ce normal ?

merci

Commentaire de gabuzomeuh le 08/08/2003 18:46:43

On entre un signal sur l'entree ligne de la carte son et il ressort directement par l'intermediaire d'un buffer, c'est le principe d'un systeme "temps reel".

Le but de ce programme est de resoudre dans un premier temps la vitesse d'execution de la fonction waveoutproc qui est moins rapide que la fonction waveinproc.
Le grésillement provient de ce decalage.

Lorsque ce probleme sera resolu:
1°) plus de gresillement
2°) je complete le code avec la partie calcul et affichage du spectre.

A+

Commentaire de Arnotic le 08/08/2003 19:00:28 administrateur CS

oki, je vais essayer de voir comment je améliorer le problème, car c'est un truc qui m'interesse bcp (je fais de l'analyse spectrale sur DSP pour les lignes téléphonique)

@+
je te tiens au courant

Commentaire de gabuzomeuh le 09/08/2003 18:38:31

J'ai trouvé d'où vient le probleme mais il n'est pas encore résolu.

En effet, il semblerait que la routine waveouproc soit bien appelée à chaque passage mais l'index pointant le header de sortie (who) n'évolue pas.

A+

Commentaire de Arnotic le 10/08/2003 04:17:04 administrateur CS

oki je vais essayer de voir tout ca

@+

Commentaire de fkmtc le 28/05/2004 15:25:52

peut être as-tu oublié [i] ici :

            result = waveOutWrite(HWaveOut,&who,sizeof(WAVEHDR));
            if (result!= MMSYSERR_NOERROR)
                {
                    waveOutGetErrorText(result, ErrMsg, MAX_ERRMSGSIZE);
               MessageBox(NULL,ErrMsg,"erreur start_out waveoutwrite",MB_OK);
            return 1;
                }


au niveau du &who ... il faudrait mettre &who[i] ...

++

Commentaire de gabuzomeuh le 28/05/2004 17:38:42


&gt;fkmtc
c'est pas faux, j'ai corrigé le pb mais l'erreur ne venait pas de là

Commentaire de gabuzomeuh le 15/12/2004 00:55:55

y a personne qui connait un moteur audio simple ?

Commentaire de gabuzomeuh le 14/01/2005 07:29:59


essayez et laissez vos commentaires ou améliorations SVP

Commentaire de gabuzomeuh le 08/03/2007 22:47:33

Quand la fenêtre est réduite ou restaurée, il y a une courte interruption du processus.
Doit-on utiliser un thread ou un SetPriorityClass ou un EnterCriticalSection ?

Commentaire de gabuzomeuh le 13/03/2007 16:21:53

J'ai ajouté un SetThreadPriority pour chaque procédure In et Out mais ca ne change rien, quand la fenêtre est réduite ou restaurée, il y a une courte interruption du processus. Quelqu'un a une piste ?

Commentaire de ttnicolas le 20/05/2007 20:31:16

Salut gabuzomeuh. Bravo pour ta source, j'aimerai savoir pourquoi lorsque je dimminue la frequence d'echantillonage, le delai entre la lecture et la restitution est plus long ?. Sinon j'ai traduit ta source pour Borland Builder et je suis en train de la modifier pour transferer le son via ethernet, pour l'instant ca marche pendant seulement 5 secondes.

Commentaire de gabuzomeuh le 21/05/2007 08:27:56


salut TTNICOLAS,

C'est normal que le temps soit plus long, sachant que BUFFER_SIZE ne varie pas. C'est comme sur une route dont la longueur ne varie pas et la vitesse des voitures change, le temps pour faire toute la route varie en fonction de la vitesse des voitures.

Commentaire de lovmaths le 15/02/2009 21:03:21

hum... Et si un pur débutant de chez débutant souhaitait juste enregistrer le son entrant dans un genre de bloc note ?
Bon, je sais, ça ressemblerait presque à du sur mesure, mais... (et je m'explique peut-être mal, aussi, mais c'est juste pour le retoucher, j'ai envie de m'amuser à créer des programmes qui modifient les sons)
je crois que c'est beaucoup demander, quand même, du sur-mesure, mais bon... ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

waveInOpen [ par evildido ] Bonjour &#224; tous. J'ais une tite question pour vous. Pour mon projet j'utilise les MFC et j'aimerais lorsqu'on appuis sur un bouton lancer une capt compilation avec borland c++ 3 [ par Bradleyleboulet ] Bonjour, je dois actuellement developper une application sous windows 98 avec borland c++ builder 3. Je dois récuperer l'entrée micro, pour cela j'uti


Nos sponsors


Sondage...

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales