schließen audio device
-
hallo, habe eine mfc anwendung geschrieben, die gleichzeitig von line-in sound liest und diesen dann auf line-out ausgibt. (bisher ohne threads)
nach drücken des ersten buttons mache ich folgendes:
pWaveHdr1=(WAVEHDR*) malloc(sizeof(WAVEHDR)); pWaveHdr2=(WAVEHDR*) malloc(sizeof(WAVEHDR)); pWaveHdr3=(WAVEHDR*) malloc(sizeof(WAVEHDR)); //Allocate memory for the 3 transfer buffers pBuffer1 = (short *) malloc(INP_BUFFER_SIZE*sizeof(short)); pBuffer2 = (short *) malloc(INP_BUFFER_SIZE*sizeof(short)); pBuffer3 = (short *) malloc(INP_BUFFER_SIZE*sizeof(short)); waveform.wFormatTag = WAVE_FORMAT_PCM; waveform.nChannels = 1; waveform.nSamplesPerSec = SAMPLE_RATE; waveform.wBitsPerSample = 16; waveform.cbSize = 0; waveform.nBlockAlign = (waveform.wBitsPerSample >> 3) * waveform.nChannels; waveform.nAvgBytesPerSec = waveform.nBlockAlign * waveform.nSamplesPerSec; waveInOpen(&hWaveIn,0,&waveform,(DWORD)waveInProc,(DWORD) this,CALLBACK_FUNCTION); waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR)); waveInPrepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR)); waveInPrepareHeader(hWaveIn,pWaveHdr3,sizeof(WAVEHDR)); waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR)); waveInAddBuffer(hWaveIn,pWaveHdr2,sizeof(WAVEHDR)); waveInAddBuffer(hWaveIn,pWaveHdr3,sizeof(WAVEHDR)); waveInStart(hWaveIn); waveOutOpen(&hWaveOut,1,&waveform, (DWORD)waveOutProc,0,CALLBACK_FUNCTION);In der callback funktion
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2) { switch(uMsg) { case WIM_CLOSE: waveInUnprepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR)); waveInUnprepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR)); waveInUnprepareHeader(hWaveIn,pWaveHdr3,sizeof(WAVEHDR)); free(pBuffer1); free(pBuffer2); free(pBuffer3); free(pWaveHdr1); free(pWaveHdr2); free(pWaveHdr3); break; case WIM_DATA: if(bEnding) { erg_in=waveInClose(hWaveIn); } else { waveInUnprepareHeader(hWaveIn,((WAVEHDR*) dwParam1),sizeof(WAVEHDR)); //do something with samples waveOutPrepareHeader(hWaveOut,((WAVEHDR*) dwParam1),sizeof(WAVEHDR)); waveOutWrite(hWaveOut,((WAVEHDR*) dwParam1),sizeof(WAVEHDR)); } break; case WIM_OPEN: pWaveHdr1->lpData = (LPSTR) pBuffer1; pWaveHdr1->dwBufferLength = 1024*sizeof(short); pWaveHdr1->dwBytesRecorded = 0; pWaveHdr1->dwUser = 0; pWaveHdr1->dwFlags = 0; pWaveHdr1->dwLoops = 1; pWaveHdr1->lpNext = NULL; pWaveHdr1->reserved = 0; pWaveHdr2->lpData = (LPSTR) pBuffer2; pWaveHdr2->dwBufferLength = 1024*sizeof(short); pWaveHdr2->dwBytesRecorded = 0; pWaveHdr2->dwUser = 0; pWaveHdr2->dwFlags = 0; pWaveHdr2->dwLoops = 1; pWaveHdr2->lpNext = NULL; pWaveHdr2->reserved =0; pWaveHdr3->lpData = (LPSTR) pBuffer3; pWaveHdr3->dwBufferLength = 1024*sizeof(short); pWaveHdr3->dwBytesRecorded = 0; pWaveHdr3->dwUser = 0; pWaveHdr3->dwFlags = 0; pWaveHdr3->dwLoops = 1; pWaveHdr3->lpNext = NULL; pWaveHdr3->reserved =0; break; } }In der callback funktion
void CALLBACK waveOutProc(HWAVEOUT hwo,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2) { switch(uMsg) { case WOM_CLOSE: waveOutUnprepareHeader(hWaveOut,pWaveHdr1,sizeof(WAVEHDR)); waveOutUnprepareHeader(hWaveOut,pWaveHdr2,sizeof(WAVEHDR)); waveOutUnprepareHeader(hWaveOut,pWaveHdr3,sizeof(WAVEHDR)); break; case WOM_DONE: if(bEnding) { waveOutClose(hWaveOut); } else { waveOutUnprepareHeader(hWaveOut,((WAVEHDR*) dwParam1),sizeof(WAVEHDR)); waveInPrepareHeader(hWaveIn,((WAVEHDR*) dwParam1),sizeof(WAVEHDR)); waveInAddBuffer(hWaveIn,((WAVEHDR*) dwParam1),sizeof(WAVEHDR)); } break; case WOM_OPEN: break; } }beim drücken des zweiten buttons sollen beide devices ordentlich geschlossen werden
ich mache folgendes
in der onbutton2
bEnding=true; waveInReset(hWaveIn); waveOutReset(hWaveOut);das einlesen und ausgeben funzt ohne probleme, aber wenn ich auf button zwei gehe schließt er mir die devices nicht richtig, wie kann ich in/out richtig schließen ohne mit den interrupts von WIM_DATA bzw WOM_DONE in Bedrängnis zu kommen?
wäre für jeden vorschlag dankbar
-
weiß keiner einen rat?
-
kein kleiner tipp?
