mmdevapi: Fix refcounts in IAudioClient::GetService.
This commit is contained in:
parent
f50829c36e
commit
a93efd5346
|
@ -1666,16 +1666,20 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
||||||
}
|
}
|
||||||
|
IAudioRenderClient_AddRef(&This->IAudioRenderClient_iface);
|
||||||
*ppv = &This->IAudioRenderClient_iface;
|
*ppv = &This->IAudioRenderClient_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){
|
}else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){
|
||||||
if(This->dataflow != eCapture){
|
if(This->dataflow != eCapture){
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
||||||
}
|
}
|
||||||
|
IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface);
|
||||||
*ppv = &This->IAudioCaptureClient_iface;
|
*ppv = &This->IAudioCaptureClient_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioClock)){
|
}else if(IsEqualIID(riid, &IID_IAudioClock)){
|
||||||
|
IAudioClock_AddRef(&This->IAudioClock_iface);
|
||||||
*ppv = &This->IAudioClock_iface;
|
*ppv = &This->IAudioClock_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioStreamVolume)){
|
}else if(IsEqualIID(riid, &IID_IAudioStreamVolume)){
|
||||||
|
IAudioStreamVolume_AddRef(&This->IAudioStreamVolume_iface);
|
||||||
*ppv = &This->IAudioStreamVolume_iface;
|
*ppv = &This->IAudioStreamVolume_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioSessionControl)){
|
}else if(IsEqualIID(riid, &IID_IAudioSessionControl)){
|
||||||
if(!This->session_wrapper){
|
if(!This->session_wrapper){
|
||||||
|
@ -1684,7 +1688,8 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
IAudioSessionControl2_AddRef(&This->session_wrapper->IAudioSessionControl2_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->IAudioSessionControl2_iface;
|
*ppv = &This->session_wrapper->IAudioSessionControl2_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IChannelAudioVolume)){
|
}else if(IsEqualIID(riid, &IID_IChannelAudioVolume)){
|
||||||
|
@ -1694,7 +1699,8 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
IChannelAudioVolume_AddRef(&This->session_wrapper->IChannelAudioVolume_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->IChannelAudioVolume_iface;
|
*ppv = &This->session_wrapper->IChannelAudioVolume_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_ISimpleAudioVolume)){
|
}else if(IsEqualIID(riid, &IID_ISimpleAudioVolume)){
|
||||||
|
@ -1704,13 +1710,13 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
ISimpleAudioVolume_AddRef(&This->session_wrapper->ISimpleAudioVolume_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->ISimpleAudioVolume_iface;
|
*ppv = &This->session_wrapper->ISimpleAudioVolume_iface;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*ppv){
|
if(*ppv){
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -2245,6 +2251,8 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client)
|
||||||
ret->ISimpleAudioVolume_iface.lpVtbl = &SimpleAudioVolume_Vtbl;
|
ret->ISimpleAudioVolume_iface.lpVtbl = &SimpleAudioVolume_Vtbl;
|
||||||
ret->IChannelAudioVolume_iface.lpVtbl = &ChannelAudioVolume_Vtbl;
|
ret->IChannelAudioVolume_iface.lpVtbl = &ChannelAudioVolume_Vtbl;
|
||||||
|
|
||||||
|
ret->ref = 1;
|
||||||
|
|
||||||
ret->client = client;
|
ret->client = client;
|
||||||
if(client){
|
if(client){
|
||||||
ret->session = client->session;
|
ret->session = client->session;
|
||||||
|
|
|
@ -1459,16 +1459,20 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
OSSpinLockUnlock(&This->lock);
|
OSSpinLockUnlock(&This->lock);
|
||||||
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
||||||
}
|
}
|
||||||
|
IAudioRenderClient_AddRef(&This->IAudioRenderClient_iface);
|
||||||
*ppv = &This->IAudioRenderClient_iface;
|
*ppv = &This->IAudioRenderClient_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){
|
}else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){
|
||||||
if(This->dataflow != eCapture){
|
if(This->dataflow != eCapture){
|
||||||
OSSpinLockUnlock(&This->lock);
|
OSSpinLockUnlock(&This->lock);
|
||||||
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
||||||
}
|
}
|
||||||
|
IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface);
|
||||||
*ppv = &This->IAudioCaptureClient_iface;
|
*ppv = &This->IAudioCaptureClient_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioClock)){
|
}else if(IsEqualIID(riid, &IID_IAudioClock)){
|
||||||
|
IAudioClock_AddRef(&This->IAudioClock_iface);
|
||||||
*ppv = &This->IAudioClock_iface;
|
*ppv = &This->IAudioClock_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioStreamVolume)){
|
}else if(IsEqualIID(riid, &IID_IAudioStreamVolume)){
|
||||||
|
IAudioStreamVolume_AddRef(&This->IAudioStreamVolume_iface);
|
||||||
*ppv = &This->IAudioStreamVolume_iface;
|
*ppv = &This->IAudioStreamVolume_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioSessionControl)){
|
}else if(IsEqualIID(riid, &IID_IAudioSessionControl)){
|
||||||
if(!This->session_wrapper){
|
if(!This->session_wrapper){
|
||||||
|
@ -1477,7 +1481,8 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
OSSpinLockUnlock(&This->lock);
|
OSSpinLockUnlock(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
IAudioSessionControl2_AddRef(&This->session_wrapper->IAudioSessionControl2_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->IAudioSessionControl2_iface;
|
*ppv = &This->session_wrapper->IAudioSessionControl2_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IChannelAudioVolume)){
|
}else if(IsEqualIID(riid, &IID_IChannelAudioVolume)){
|
||||||
|
@ -1487,7 +1492,8 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
OSSpinLockUnlock(&This->lock);
|
OSSpinLockUnlock(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
IChannelAudioVolume_AddRef(&This->session_wrapper->IChannelAudioVolume_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->IChannelAudioVolume_iface;
|
*ppv = &This->session_wrapper->IChannelAudioVolume_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_ISimpleAudioVolume)){
|
}else if(IsEqualIID(riid, &IID_ISimpleAudioVolume)){
|
||||||
|
@ -1497,13 +1503,13 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
OSSpinLockUnlock(&This->lock);
|
OSSpinLockUnlock(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
ISimpleAudioVolume_AddRef(&This->session_wrapper->ISimpleAudioVolume_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->ISimpleAudioVolume_iface;
|
*ppv = &This->session_wrapper->ISimpleAudioVolume_iface;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*ppv){
|
if(*ppv){
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
|
||||||
OSSpinLockUnlock(&This->lock);
|
OSSpinLockUnlock(&This->lock);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -2035,6 +2041,8 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client)
|
||||||
ret->ISimpleAudioVolume_iface.lpVtbl = &SimpleAudioVolume_Vtbl;
|
ret->ISimpleAudioVolume_iface.lpVtbl = &SimpleAudioVolume_Vtbl;
|
||||||
ret->IChannelAudioVolume_iface.lpVtbl = &ChannelAudioVolume_Vtbl;
|
ret->IChannelAudioVolume_iface.lpVtbl = &ChannelAudioVolume_Vtbl;
|
||||||
|
|
||||||
|
ret->ref = 1;
|
||||||
|
|
||||||
ret->client = client;
|
ret->client = client;
|
||||||
if(client){
|
if(client){
|
||||||
ret->session = client->session;
|
ret->session = client->session;
|
||||||
|
@ -2082,10 +2090,12 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface)
|
||||||
ref = InterlockedDecrement(&This->ref);
|
ref = InterlockedDecrement(&This->ref);
|
||||||
TRACE("(%p) Refcount now %u\n", This, ref);
|
TRACE("(%p) Refcount now %u\n", This, ref);
|
||||||
if(!ref){
|
if(!ref){
|
||||||
OSSpinLockLock(&This->client->lock);
|
if(This->client){
|
||||||
This->client->session_wrapper = NULL;
|
OSSpinLockLock(&This->client->lock);
|
||||||
OSSpinLockUnlock(&This->client->lock);
|
This->client->session_wrapper = NULL;
|
||||||
AudioClient_Release(&This->client->IAudioClient_iface);
|
OSSpinLockUnlock(&This->client->lock);
|
||||||
|
AudioClient_Release(&This->client->IAudioClient_iface);
|
||||||
|
}
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
}
|
}
|
||||||
return ref;
|
return ref;
|
||||||
|
|
|
@ -1381,16 +1381,20 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
||||||
}
|
}
|
||||||
|
IAudioRenderClient_AddRef(&This->IAudioRenderClient_iface);
|
||||||
*ppv = &This->IAudioRenderClient_iface;
|
*ppv = &This->IAudioRenderClient_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){
|
}else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){
|
||||||
if(This->dataflow != eCapture){
|
if(This->dataflow != eCapture){
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
return AUDCLNT_E_WRONG_ENDPOINT_TYPE;
|
||||||
}
|
}
|
||||||
|
IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface);
|
||||||
*ppv = &This->IAudioCaptureClient_iface;
|
*ppv = &This->IAudioCaptureClient_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioClock)){
|
}else if(IsEqualIID(riid, &IID_IAudioClock)){
|
||||||
|
IAudioClock_AddRef(&This->IAudioClock_iface);
|
||||||
*ppv = &This->IAudioClock_iface;
|
*ppv = &This->IAudioClock_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioStreamVolume)){
|
}else if(IsEqualIID(riid, &IID_IAudioStreamVolume)){
|
||||||
|
IAudioStreamVolume_AddRef(&This->IAudioStreamVolume_iface);
|
||||||
*ppv = &This->IAudioStreamVolume_iface;
|
*ppv = &This->IAudioStreamVolume_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IAudioSessionControl)){
|
}else if(IsEqualIID(riid, &IID_IAudioSessionControl)){
|
||||||
if(!This->session_wrapper){
|
if(!This->session_wrapper){
|
||||||
|
@ -1399,7 +1403,8 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
IAudioSessionControl2_AddRef(&This->session_wrapper->IAudioSessionControl2_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->IAudioSessionControl2_iface;
|
*ppv = &This->session_wrapper->IAudioSessionControl2_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_IChannelAudioVolume)){
|
}else if(IsEqualIID(riid, &IID_IChannelAudioVolume)){
|
||||||
|
@ -1409,7 +1414,8 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
IChannelAudioVolume_AddRef(&This->session_wrapper->IChannelAudioVolume_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->IChannelAudioVolume_iface;
|
*ppv = &This->session_wrapper->IChannelAudioVolume_iface;
|
||||||
}else if(IsEqualIID(riid, &IID_ISimpleAudioVolume)){
|
}else if(IsEqualIID(riid, &IID_ISimpleAudioVolume)){
|
||||||
|
@ -1419,13 +1425,13 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient *iface, REFIID riid,
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
}
|
}else
|
||||||
|
ISimpleAudioVolume_AddRef(&This->session_wrapper->ISimpleAudioVolume_iface);
|
||||||
|
|
||||||
*ppv = &This->session_wrapper->ISimpleAudioVolume_iface;
|
*ppv = &This->session_wrapper->ISimpleAudioVolume_iface;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*ppv){
|
if(*ppv){
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
|
||||||
LeaveCriticalSection(&This->lock);
|
LeaveCriticalSection(&This->lock);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -1951,6 +1957,8 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client)
|
||||||
ret->ISimpleAudioVolume_iface.lpVtbl = &SimpleAudioVolume_Vtbl;
|
ret->ISimpleAudioVolume_iface.lpVtbl = &SimpleAudioVolume_Vtbl;
|
||||||
ret->IChannelAudioVolume_iface.lpVtbl = &ChannelAudioVolume_Vtbl;
|
ret->IChannelAudioVolume_iface.lpVtbl = &ChannelAudioVolume_Vtbl;
|
||||||
|
|
||||||
|
ret->ref = 1;
|
||||||
|
|
||||||
ret->client = client;
|
ret->client = client;
|
||||||
if(client){
|
if(client){
|
||||||
ret->session = client->session;
|
ret->session = client->session;
|
||||||
|
|
Loading…
Reference in New Issue