From 00684f84a550d5f4740b00f0d53a0ba5952ddc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20H=C3=B6hle?= Date: Thu, 8 Sep 2011 15:21:52 +0200 Subject: [PATCH] mmdevapi: IsFormatSupported EXCLUSIVE mode never returns S_FALSE. --- dlls/winealsa.drv/mmdevdrv.c | 8 +++++++- dlls/winecoreaudio.drv/mmdevdrv.c | 8 +++----- dlls/wineoss.drv/mmdevdrv.c | 16 +++++++++------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index ac5be34de25..25693c0d9ec 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -1204,8 +1204,11 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface, dump_fmt(fmt); - if(out) + if(out){ *out = NULL; + if(mode != AUDCLNT_SHAREMODE_SHARED) + out = NULL; + } EnterCriticalSection(&This->lock); @@ -1339,6 +1342,9 @@ exit: LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, formats); + if(hr == S_FALSE && !out) + hr = AUDCLNT_E_UNSUPPORTED_FORMAT; + if(hr == S_FALSE && out) { closest->nBlockAlign = closest->nChannels * closest->wBitsPerSample / 8; diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 79cf5e39ea0..a35f18c4fe3 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -1145,6 +1145,9 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface, dump_fmt(pwfx); + if(outpwfx) + *outpwfx = NULL; + if(pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE && fmtex->dwChannelMask != 0 && fmtex->dwChannelMask != get_channel_mask(pwfx->nChannels)) @@ -1156,17 +1159,12 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface, if(SUCCEEDED(hr)){ AudioQueueDispose(aqueue, 1); OSSpinLockUnlock(&This->lock); - if(outpwfx) - *outpwfx = NULL; TRACE("returning %08x\n", S_OK); return S_OK; } OSSpinLockUnlock(&This->lock); - if(outpwfx) - *outpwfx = NULL; - TRACE("returning %08x\n", AUDCLNT_E_UNSUPPORTED_FORMAT); return AUDCLNT_E_UNSUPPORTED_FORMAT; } diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index f8316ee0299..24cd147388d 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -714,9 +714,6 @@ static HRESULT setup_oss_device(int fd, const WAVEFORMATEX *fmt, WAVEFORMATEXTENSIBLE *fmtex = (void*)fmt; WAVEFORMATEX *closest = NULL; - if(out) - *out = NULL; - tmp = oss_format = get_oss_format(fmt); if(oss_format < 0) return AUDCLNT_E_UNSUPPORTED_FORMAT; @@ -767,6 +764,9 @@ static HRESULT setup_oss_device(int fd, const WAVEFORMATEX *fmt, ret = S_FALSE; } + if(ret == S_FALSE && !out) + ret = AUDCLNT_E_UNSUPPORTED_FORMAT; + if(ret == S_FALSE && out){ closest->nBlockAlign = closest->nChannels * closest->wBitsPerSample / 8; @@ -901,10 +901,6 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient *iface, } hr = setup_oss_device(This->fd, fmt, NULL, FALSE); - if(hr == S_FALSE){ - LeaveCriticalSection(&This->lock); - return AUDCLNT_E_UNSUPPORTED_FORMAT; - } if(FAILED(hr)){ LeaveCriticalSection(&This->lock); return hr; @@ -1137,6 +1133,12 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface, dump_fmt(pwfx); + if(outpwfx){ + *outpwfx = NULL; + if(mode != AUDCLNT_SHAREMODE_SHARED) + outpwfx = NULL; + } + if(This->dataflow == eRender) fd = open(This->devnode, O_WRONLY, 0); else if(This->dataflow == eCapture)