Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » in/out gleichzeitig

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.08.2007, 17:29 Uhr
~fragender
Gast


hallo,
ich möchte gleichzeitig vom micro eingang sound aufnehmen und den dann auf line-out ausgeben.

Beim Drücken eines buttons in meiner mfc anwendung

mache ich folgendes

C++:
             pWaveHdr1=(wavehdr_tag*) malloc(sizeof(WAVEHDR));
    pWaveHdr2=(wavehdr_tag*) malloc(sizeof(WAVEHDR));

    //Speicher für Transferbuffer
    pBuffer1 = (unsigned char *) malloc(INP_BUFFER_SIZE);
    pBuffer2 = (unsigned char *) malloc(INP_BUFFER_SIZE);

    if(!pBuffer1 || !pBuffer2)
    {
        if(pBuffer1) free (pBuffer1);
        if(pBuffer2) free (pBuffer2);

        MessageBox("No memory for pBuffer","Memory error",MB_OK);
    }

    //Audio-Gerät für die Aufnahme öffnen
    waveform.wFormatTag            = WAVE_FORMAT_PCM;
    waveform.nChannels            = 1;
    waveform.nSamplesPerSec                     = 44100;
    waveform.nAvgBytesPerSec                             = 44100;
    waveform.nBlockAlign                    = 1;
    waveform.wBitsPerSample                    = 8;
    waveform.cbSize                 = 0;
    


    pWaveHdr1->lpData            = (char*) pBuffer1;
    pWaveHdr1->dwBufferLength                 = INP_BUFFER_SIZE;
    pWaveHdr1->dwBytesRecorded                 = 0;
    pWaveHdr1->dwUser            = 0;
    pWaveHdr1->dwFlags            = 0;
    pWaveHdr1->dwLoops            = 1;
    pWaveHdr1->lpNext            = NULL;
    pWaveHdr1->reserved            =0;
    waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));

    pWaveHdr2->lpData            = (char*) pBuffer2;
    pWaveHdr2->dwBufferLength                 = INP_BUFFER_SIZE;
    pWaveHdr2->dwBytesRecorded                 = 0;
    pWaveHdr2->dwUser            = 0;
    pWaveHdr2->dwFlags            = 0;
    pWaveHdr2->dwLoops            = 1;
    pWaveHdr2->lpNext            = NULL;
    pWaveHdr2->reserved            =0;
    waveInPrepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));

if(waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)waveInProc,0,CALLBACK_FUNCTION))
    {
        free(pBuffer1);
        free(pBuffer2);
        MessageBox("Error with waveInOpen","Error",MB_OK);
    }

if(waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform, (DWORD)waveOutProc,0,CALLBACK_FUNCTION))
    {
        MessageBox("Error with waveOutOpen","Error",MB_OK);
    
    }




und


C++:

void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
    switch(uMsg)
    {
    case WIM_CLOSE:
        
        break;
    case WIM_DATA:
        waveOutWrite(hWaveOut,pWaveHdr1,sizeof(WAVEHDR));
        break;
    case WIM_OPEN:
        //AfxMessageBox("hallo");

        waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
        waveInAddBuffer(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));
        dwDataLength=0;
        waveInStart(hWaveIn);
        break;    
    
    }
}

void CALLBACK waveOutProc(HWAVEOUT hwo,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
    switch(uMsg)        
    {
    case WOM_CLOSE:

        break;
    case WOM_DONE:
        waveOutWrite(hWaveOut,pWaveHdr1,sizeof(WAVEHDR));
        
        break;
    case WOM_OPEN:
        pWaveHdr1->lpData            = (char*) pBuffer1;
        pWaveHdr1->dwBufferLength                 = INP_BUFFER_SIZE;
        pWaveHdr1->dwBytesRecorded                 = 0;
        pWaveHdr1->dwUser            = 0;
        pWaveHdr1->dwFlags            = 0;
        pWaveHdr1->dwLoops            = 1;
        pWaveHdr1->lpNext            = NULL;
        pWaveHdr1->reserved            = 0;

        waveOutPrepareHeader(hWaveOut,pWaveHdr1,sizeof(WAVEHDR));
        
        break;    
    }

}



wobei folgendes global definiert ist



C++:

#define INP_BUFFER_SIZE 8192


static WAVEFORMATEX        waveform;
static PBYTE            pBuffer1,pBuffer2;
static HWAVEIN            hWaveIn;
static HWAVEOUT            hWaveOut;
static PWAVEHDR            pWaveHdr1,pWaveHdr2;
static DWORD            dwDataLength;



funzt leider nicht. kann ich das einlesen und ausgeben nicht gleichzeitig machen oder brauche ich da getrennte threads?
aber vom ablauf her müsste es doch gehen, oder? waveInOpen erzeugt WIM_OPEN, nach vollem einlesen wird WIM_DATA erzeugt, der das schreiben freigibt. bei vollständigem schreiben wird WOM_DONE erzeugt und erneut geschrieben.

hat jmd ne idee?

danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.08.2007, 22:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
evtl unterstützt deine Soundkarte keinen vollduplexbetrieb (aufnehmen/ausgeben gleichzeitig)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.08.2007, 08:45 Uhr
~fragender
Gast


unterstützt sie schon, habs mit nem anderen programm ausprobiert, klappt aber bei mir rührt sich bislang nix. wie handle ich das am besten mit den zwei buffern das quasi keine pause entsteht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: