From 64ee9183271b764e3fe2e5685b4e89d576273907 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 4 Aug 2011 19:01:16 -0700 Subject: [PATCH] Properly handle when the capture device is using the DSound8 interface --- capture.c | 38 ++++++++++++++++++++++++++++++++------ dsound_main.c | 4 ++-- dsound_private.h | 1 + duplex.c | 2 +- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/capture.c b/capture.c index 3fda310..a56dbbd 100644 --- a/capture.c +++ b/capture.c @@ -66,6 +66,8 @@ struct DSCImpl { IDirectSoundCapture IDirectSoundCapture_iface; LONG ref; + BOOL is_8; + ALCchar *device; DSCBuffer *buf; @@ -289,14 +291,20 @@ static HRESULT WINAPI DSCBuffer_QueryInterface(IDirectSoundCaptureBuffer8 *iface return E_POINTER; *ppv = NULL; - if (IsEqualIID(riid, &IID_IDirectSoundNotify)) - *ppv = &This->IDirectSoundNotify_iface; - else if (IsEqualIID(riid, &IID_IUnknown) || - IsEqualIID(riid, &IID_IDirectSoundCaptureBuffer) || - IsEqualIID(riid, &IID_IDirectSoundCaptureBuffer8)) + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDirectSoundCaptureBuffer)) *ppv = &This->IDirectSoundCaptureBuffer8_iface; + else if(IsEqualIID(riid, &IID_IDirectSoundCaptureBuffer8)) + { + if(This->parent->is_8) + *ppv = &This->IDirectSoundCaptureBuffer8_iface; + } + else if(IsEqualIID(riid, &IID_IDirectSoundNotify)) + *ppv = &This->IDirectSoundNotify_iface; + else + FIXME("Unhandled GUID: %s\n", debugstr_guid(riid)); - if (!*ppv) + if(!*ppv) return E_NOINTERFACE; IUnknown_AddRef((IUnknown*)*ppv); return S_OK; @@ -807,6 +815,22 @@ static inline DSCImpl *impl_from_IDirectSoundCapture(IDirectSoundCapture *iface) HRESULT DSOUND_CaptureCreate(REFIID riid, void **cap) { + HRESULT hr; + + hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture, cap); + if(SUCCEEDED(hr)) + { + DSCImpl *impl = impl_from_IDirectSoundCapture(*cap); + impl->is_8 = FALSE; + + hr = IDirectSoundCapture_QueryInterface(&impl->IDirectSoundCapture_iface, riid, cap); + IDirectSoundCapture_Release(&impl->IDirectSoundCapture_iface); + } + return hr; +} + +HRESULT DSOUND_CaptureCreate8(REFIID riid, void **cap) +{ DSCImpl *This; *cap = NULL; @@ -816,6 +840,8 @@ HRESULT DSOUND_CaptureCreate(REFIID riid, void **cap) This->IDirectSoundCapture_iface.lpVtbl = (IDirectSoundCaptureVtbl*)&DSC_Vtbl; + This->is_8 = TRUE; + InitializeCriticalSection(&This->crst); This->crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DSCImpl.crst"); diff --git a/dsound_main.c b/dsound_main.c index 31a2471..90c9bbb 100644 --- a/dsound_main.c +++ b/dsound_main.c @@ -841,7 +841,7 @@ DirectSoundCaptureCreate8(LPCGUID lpcGUID, IDirectSoundCapture8 **ppDSC8, IUnkno return DSERR_NOAGGREGATION; } - hr = DSOUND_CaptureCreate(&IID_IDirectSoundCapture8, &pDSC8); + hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture, &pDSC8); if(SUCCEEDED(hr)) { *ppDSC8 = pDSC8; @@ -947,7 +947,7 @@ static IClassFactoryImpl DSOUND_CF[] = { { {(IClassFactoryVtbl*)&DSCF_Vtbl}, 1, &CLSID_DirectSound, DSOUND_Create }, { {(IClassFactoryVtbl*)&DSCF_Vtbl}, 1, &CLSID_DirectSound8, DSOUND_Create8 }, { {(IClassFactoryVtbl*)&DSCF_Vtbl}, 1, &CLSID_DirectSoundCapture, DSOUND_CaptureCreate }, - { {(IClassFactoryVtbl*)&DSCF_Vtbl}, 1, &CLSID_DirectSoundCapture8, DSOUND_CaptureCreate }, + { {(IClassFactoryVtbl*)&DSCF_Vtbl}, 1, &CLSID_DirectSoundCapture8, DSOUND_CaptureCreate8 }, { {(IClassFactoryVtbl*)&DSCF_Vtbl}, 1, &CLSID_DirectSoundFullDuplex, DSOUND_FullDuplexCreate }, { {(IClassFactoryVtbl*)&DSCF_Vtbl}, 1, &CLSID_DirectSoundPrivate, IKsPrivatePropertySetImpl_Create }, { {NULL}, 0, NULL, NULL } diff --git a/dsound_private.h b/dsound_private.h index f47f1c0..f9c2c36 100644 --- a/dsound_private.h +++ b/dsound_private.h @@ -605,6 +605,7 @@ HRESULT DSOUND_Create8(REFIID riid, void **ppDS); HRESULT DSOUND_FullDuplexCreate(REFIID riid, void **ppDSFD); HRESULT IKsPrivatePropertySetImpl_Create(REFIID riid, void **piks); HRESULT DSOUND_CaptureCreate(REFIID riid, void **ppDSC); +HRESULT DSOUND_CaptureCreate8(REFIID riid, void **ppDSC); extern const GUID DSOUND_renderer_guid; extern const GUID DSOUND_capture_guid; diff --git a/duplex.c b/duplex.c index 7247430..02f4816 100644 --- a/duplex.c +++ b/duplex.c @@ -442,7 +442,7 @@ static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize( } *lplpDirectSoundBuffer8 = ptr; - hr = DSOUND_CaptureCreate(&IID_IDirectSoundCapture, &ptr); + hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture, &ptr); if(SUCCEEDED(hr)) { This->capture_device = ptr; -- 2.11.4.GIT