Funktionen aus mmsystem.h nutzen

Cappaja

Erfahrenes Mitglied
hallo,

dies ist ein etwas komplexeres problem wobei ich mir noch nicht einmal 100% sicher bin ob es daran überhaupt liegen könnte.

ich nutze die message MM_WOM_DONE aus der mmsystem.h. sie wird aufgerufen wenn eine audiodatei erfolgreich abgespielt wurde. jetzt habe ich bei mir eine checkbox für ein replay (endlosschleife) der audiodatei. der datenpuffer liegt in einem WAVEHDR struct bereit (lpData) und wird beim ersten start ausgeführt (funktioniert). danach sollte der zeiger auf den anfang des buffers zeigen und die daten erneut abspielen. genau da ist mein problem. irgendwie verarbeitet das MSG struct meinen zeiger auf die daten nicht richtig, ich bekomme eine vollkommen andere adresse welche nicht zum vorherigen buffer passt. ich vermute das die message nicht richtig verarbeitet wird. ich habe unter MESSAGE.message den wert 0 stehen. eigentlich sollte da doch die nachrichten nummer darin stehen. im rotmarkierten bereich wird meinem LPWAVEHDR struct die falsche adresse übergeben weswegen mir das programm aussteigt.

hat schon einmal jemand etwas mit dieser nachricht zu tun gehabt sodass er mir weiterhelfen kann? ist sie in der message map richtig eingebunden?

die anderen funktionen habe ich oft genug durch debugged, da kann der fehler definitiv nicht liegen. ich vermute eine falsche nachrichtenverarbeitung...

Code:
void CWiwoDlg::MMWOMDone(MSG &Message)
{
	// current data buffer block that has
	// completed playback, reload and requeue
	char	   mesg[MSG_LEN_S];
	LPWAVEHDR  lpwho;
	MMRESULT   rc;
	MMTIME     mmtime;
	static int deltat;

	if(!(oup_ing || io_ing))		// no output process started
		return;						// skip this WOM_DONE message

	lpwho = (LPWAVEHDR)Message.lParam;
	
	if(lpwho == NULL)
		return;
	/*-------------------------------------------*/
	mmtime.wType = TIME_SAMPLES;
	waveOutGetPosition(hwo, &mmtime, sizeof(MMTIME));
	deltat = mmtime.u.sample;

	if(iOuCnt >= GlPar.nMBuffers)
    {
		if(OutRep)
			iOuCnt = 0;
		else
        {
            SendMessage(CM_OUPCOMPLETE, (WPARAM)0, (LPARAM)0);
            return;
        }
	}
	if(oup_ing)
    {
		OutputDataProc(lpwho);
		iOuCnt++;
    }
	/*-------------------------------------------*/
	if(io_ing)
		IOOutDataProc(lpwho);    // EN8 #####

	rc = waveOutPrepareHeader(hwo, lpwho, sizeof(WAVEHDR));

	if(rc == MMSYSERR_NOERROR)
		rc = waveOutWrite(hwo, lpwho, sizeof(WAVEHDR));
	else
    {
		waveOutGetErrorText(rc, mesg, MSG_LEN_S);
		MessageBox("WMM Done", mesg, MB_OK);
		CloseWaveOutput(GetSafeHwnd());
    }

	/* used only to check processing time in output phase*/
	mmtime.wType = TIME_SAMPLES;
	waveOutGetPosition(hwo, &mmtime, sizeof(MMTIME));
}

in der message map habe ich die nachricht wie folgt integriert:
Code:
ON_MESSAGE(MM_WOM_DONE, MMWOMDone)
 

Cappaja

Erfahrenes Mitglied
habs gelöst...

seltsamerweise erhalte ich beim zugriff über das MSG STRUCT nur in wParam einen Wert, jedoch verschieden vom Buffer. ich habe die signatur der methode jetzt wie folgt geändert:
Code:
LRESULT MMWOMDone(WPARAM wParam, LPARAM lParam);

plötzlich erhalte ich in beiden Parametern Werte wobei in lParam die richtige Adresse vom Bufferende übergeben wird. die registrierung in der message map bleibt dabei unberührt.

mfg cappaja