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 |