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? 🙄


Anmelden zum Antworten