dmusic: partial fix for bug 7064

Robert Reif reif at earthlink.net
Tue Jan 2 19:03:33 CST 2007


Implement just enough of IDirectMusicPortImpl_GetFormat to keep Direct 
Sound from crashing from unitialized data.
-------------- next part --------------
diff -p -u -r1.15 port.c
--- dlls/dmusic/port.c	12 Oct 2006 20:31:05 -0000	1.15
+++ dlls/dmusic/port.c	3 Jan 2007 00:46:04 -0000
@@ -171,7 +171,45 @@ static HRESULT WINAPI IDirectMusicPortIm
 
 static HRESULT WINAPI IDirectMusicPortImpl_GetFormat (LPDIRECTMUSICPORT iface, LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize, LPDWORD pdwBufferSize) {
 	IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface;
+	WAVEFORMATEX format;
 	FIXME("(%p, %p, %p, %p): stub\n", This, pWaveFormatEx, pdwWaveFormatExSize, pdwBufferSize);
+
+	if (pWaveFormatEx == NULL)
+	{
+		if (pdwWaveFormatExSize)
+			*pdwWaveFormatExSize = sizeof(format);
+		else
+			return E_POINTER;
+	}
+	else
+	{
+		if (pdwWaveFormatExSize == NULL)
+			return E_POINTER;
+
+		/* Just fill this in with something that will not crash Direct Sound for now. */
+		/* It won't be used anyway until Performances are completed */
+		format.wFormatTag = WAVE_FORMAT_PCM;
+		format.nChannels = 2; /* This->params.dwAudioChannels; */
+		format.nSamplesPerSec = 44100; /* This->params.dwSampleRate; */
+		format.wBitsPerSample = 16;	/* FIXME: check this */
+		format.nBlockAlign = (format.wBitsPerSample * format.nChannels) / 8;
+		format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
+		format.cbSize = 0;
+
+		if (*pdwWaveFormatExSize >= sizeof(format))
+		{
+			CopyMemory(pWaveFormatEx, &format, min(sizeof(format), *pdwWaveFormatExSize));
+			*pdwWaveFormatExSize = sizeof(format);	/* FIXME check if this is set */
+		}
+		else
+			return E_POINTER;	/* FIXME find right error */
+	}
+
+	if (pdwBufferSize)
+		*pdwBufferSize = 44100 * 2 * 2;
+	else
+		return E_POINTER;
+
 	return S_OK;
 }
 


More information about the wine-patches mailing list