Module: wine Branch: master Commit: 3e1d4028811e5b57df264ac21dd4c56b383f9da9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3e1d4028811e5b57df264ac21d... Author: Jörg Höhle <hoehle(a)users.sourceforge.net> Date: Tue Aug 2 21:49:12 2011 +0200 mmdevapi: IsFormatSupported fills closest match iff it returns S_FALSE. --- dlls/winealsa.drv/mmdevdrv.c | 12 ++++++------ dlls/wineoss.drv/mmdevdrv.c | 14 ++++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 916c247..0c47876 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -1189,6 +1189,9 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface, dump_fmt(fmt); + if(out) + *out = NULL; + EnterCriticalSection(&This->lock); if((err = snd_pcm_hw_params_any(This->pcm_handle, This->hw_params)) < 0){ @@ -1320,17 +1323,14 @@ exit: LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, formats); - if(hr == S_OK || !out){ - CoTaskMemFree(closest); - if(out) - *out = NULL; - }else if(closest){ + if(hr == S_FALSE && out) { closest->nBlockAlign = closest->nChannels * closest->wBitsPerSample / 8; closest->nAvgBytesPerSec = closest->nBlockAlign * closest->nSamplesPerSec; *out = closest; - } + } else + CoTaskMemFree(closest); TRACE("returning: %08x\n", hr); return hr; diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 93f71cc..629f4f7 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -676,6 +676,9 @@ static HRESULT setup_oss_device(ACImpl *This, 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; @@ -689,6 +692,8 @@ static HRESULT setup_oss_device(ACImpl *This, const WAVEFORMATEX *fmt, } closest = clone_format(fmt); + if(!closest) + return E_OUTOFMEMORY; tmp = fmt->nSamplesPerSec; if(ioctl(This->fd, SNDCTL_DSP_SPEED, &tmp) < 0){ @@ -723,17 +728,14 @@ static HRESULT setup_oss_device(ACImpl *This, const WAVEFORMATEX *fmt, ret = S_FALSE; } - if(ret == S_OK || !out){ - CoTaskMemFree( closest); - if(out) - *out = NULL; - }else{ + if(ret == S_FALSE && out){ closest->nBlockAlign = closest->nChannels * closest->wBitsPerSample / 8; closest->nAvgBytesPerSec = closest->nBlockAlign * closest->nSamplesPerSec; *out = closest; - } + } else + CoTaskMemFree(closest); TRACE("returning: %08x\n", ret); return ret;