[PATCH] quartz: Alloc dynamic format changing in dsound renderer
Maarten Lankhorst
maarten at codeweavers.com
Tue Oct 21 05:50:36 CDT 2008
---
dlls/quartz/dsoundrender.c | 34 ++++++++++++++++++++++++++++++++++
1 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index aae7e68..a92e866 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -238,6 +238,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
long cbSrcStream = 0;
REFERENCE_TIME tStart, tStop;
HRESULT hr;
+ AM_MEDIA_TYPE *amt;
TRACE("%p %p\n", iface, pSample);
@@ -259,6 +260,39 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
return VFW_E_WRONG_STATE;
}
+ if (IMediaSample_GetMediaType(pSample, &amt) == S_OK)
+ {
+ AM_MEDIA_TYPE *orig = &This->pInputPin->pin.mtCurrent;
+ WAVEFORMATEX *origfmt = (WAVEFORMATEX *)orig->pbFormat;
+ WAVEFORMATEX *newfmt = (WAVEFORMATEX *)amt->pbFormat;
+
+ if (origfmt->wFormatTag == newfmt->wFormatTag &&
+ origfmt->nChannels == newfmt->nChannels &&
+ origfmt->nBlockAlign == newfmt->nBlockAlign &&
+ origfmt->wBitsPerSample == newfmt->wBitsPerSample &&
+ origfmt->cbSize == newfmt->cbSize)
+ {
+ if (origfmt->nSamplesPerSec != newfmt->nSamplesPerSec)
+ {
+ hr = IDirectSoundBuffer_SetFrequency(This->dsbuffer,
+ newfmt->nSamplesPerSec);
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&This->csFilter);
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ FreeMediaType(orig);
+ CopyMediaType(orig, amt);
+ IMediaSample_SetMediaType(pSample, NULL);
+ }
+ }
+ else
+ {
+ LeaveCriticalSection(&This->csFilter);
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
+
SetEvent(This->state_change);
hr = IMediaSample_GetPointer(pSample, &pbSrcStream);
--
1.5.6.5
--------------040002080607090005010200--
More information about the wine-patches
mailing list