CALLBACK Funktion / View Klasse
-
Hi an alle,
ich habe folgendes Problem.
Ich zeichne mit der Windows Media Lib vom Mikrofon auf bzw. ich möchte dies.Ich habe mir die Puffer und WaveHdr als globale Variablen angelegt und initialisiere diese in der View Klasse nachdem ich eine Schaltfläche angeklickt habe.
Die Methode sieht ungefähr so aus:
waveForm.wFormatTag = WAVE_FORMAT_PCM; waveForm.nChannels = 1; waveForm.nSamplesPerSec = 8000; waveForm.wBitsPerSample = 8; waveForm.cbSize = 0; waveForm.nBlockAlign = (waveForm.nChannels * waveForm.wBitsPerSample)/8; waveForm.nAvgBytesPerSec = (waveForm.nSamplesPerSec*waveForm.nBlockAlign); mmr = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveForm, (DWORD)waveInProc, 0, CALLBACK_FUNCTION); if(mmr) waveInGetErrorTextA(mmr, szErr, sizeof(szErr)); pWaveHdr1->lpData = (LPSTR)pBuffer1; pWaveHdr1->dwBufferLength = BUFFER_SIZE; mmr = waveInPrepareHeader(hWaveIn, pWaveHdr1, sizeof(WAVEHDR)); if(mmr) waveInGetErrorTextA(mmr, szErr, sizeof(szErr)); mmr = waveInAddBuffer(hWaveIn, pWaveHdr1, sizeof(WAVEHDR)); if(mmr) waveInGetErrorTextA(mmr, szErr, sizeof(szErr)); mmr = waveInStart(hWaveIn); if(mmr) waveInGetErrorTextA(mmr, szErr, sizeof(szErr)); //Callback Funktion ebenfalls Global void WINAPI CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD lParam, DWORD wParam) { pBuffer1 = (PBYTE)malloc(16384); pWaveHdr1 = (PWAVEHDR)malloc(sizeof(WAVEHDR)); ZeroMemory(pWaveHdr1, sizeof(WAVEHDR)); MMRESULT mmr; char buffer[BUFFER_SIZE]; char szErr[1024]; switch(uMsg) { case MM_WIM_OPEN: break; case MM_WIM_DATA: WAVEHDR* pWhdr = (WAVEHDR*)lParam; mmr = waveInUnprepareHeader(hwi, pWhdr, sizeof(WAVEHDR)); if(mmr) { waveInGetErrorTextA(mmr, szErr, sizeof(szErr)); break; } memcpy(buffer,pWhdr->lpData,pWhdr->dwBytesRecorded); sendData(buffer,pWhdr->dwBytesRecorded); /*waveInPrepareHeader((HWAVEIN)msg.wParam,pWhdr,sizeof(WAVEHDR)); waveInAddBuffer((HWAVEIN)msg.wParam,pWhdr,sizeof(WAVEHDR));*/ break; } }Nun möchte ich ja dass der Callback ständig abfragt aber irgendwie springt das Programm nur einmal in die Message MM_WIM_DATA und das war es.
Wie muss ich es denn machen, dass er die Nachrichten auch abfragt trotzdem die Methode des Klick Ereignisse beendet wurde?
Gruß
-
Wenn Du die Variable waveForm in der "Methode des Klick Ereignisses" instanziiert hast, dann ist die am Ende der "Methode des Klick Ereignisses" natürlich weg ("out of scope"). Zur Lebensdauer von Variablen findest Du hier im Forum bereits jede Menge Threads.
-
EDIT: die WaveForm ist auch gobal.
Also ich initialisiere WaveForm und WaveHeader in der OnInitialUpdate. In der Ereignis Behandlung führe ich nur waveInStart aus.
Da es globale Variablen sind dürften sie ja nicht out of scope sein.Falls doch wo werden sie denn dann am besten initialisert?
-
Könnte es denn auch funktionieren wenn ich die ganzen WaveIn Variablen in die View Klasse packe und dann mit PreTranslateMessage abfange?
EDIT: Ich glaube nicht, da ich nicht weiß wie ich PreTranslateMessage der Funktion waveInOpen übergebe.
Geht das überhaupt in einer SDI Anwendung die Mikrofonaufnahme im Hintergrund laufen zu lassen?
-
Vielleicht nochmal zum besseren Verständnis. Ich möchte vom Mikrofon aufzeichnen solange bis ich etwas auslöse was die Aufzeichnung beendet.
So wie ich es oben beschreibe habe ich das Problem dass er zweimal eine Nachricht bekommt. Zuerst die MM_WIM_OPEN und kurz darauf wird noch einmal die MM_WIM_DATA ausgelöst. Danach bekommt er keine Nachrichten mehr.Wie bereits gesagt der Start der Sound Aufzeichnung wird nach Klick auf Schaltfläche gemacht. Diese Methode befindet sich in der View Klasse meiner SDI Anwendung. Auch die Initialisierung der waveFormEx Struktur erfolgt hier. Die Struktur selbst wie die Callback(waveInProc) sind global.
Was muss ich hier ändern damit es so läuft wie es soll? Ich bin da gerade echt überfragt. Danke nochmal für eure Mühen.
Gruß
Karsten
-
Ok Problem bereits gelöst. Sorry:D
Nach dem in der WIM_DATA behandlung nun auch nochmal waveInPrepareHeader und waveInAddBuffer aufrufe dann klappt es auch:D.