Andrew Eikum : mmdevapi: Don't fail if dwChannelMask is not set correctly.
Alexandre Julliard
julliard at winehq.org
Wed Sep 28 14:45:46 CDT 2011
Module: wine
Branch: master
Commit: f7364dfb4b203b74700eead1836e208a49872244
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f7364dfb4b203b74700eead1836e208a49872244
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Wed Sep 28 13:31:40 2011 -0500
mmdevapi: Don't fail if dwChannelMask is not set correctly.
---
dlls/mmdevapi/tests/render.c | 41 +++++++++++++++++++++++++++++++++++++
dlls/winealsa.drv/mmdevdrv.c | 1 +
dlls/winecoreaudio.drv/mmdevdrv.c | 6 +++++
dlls/wineoss.drv/mmdevdrv.c | 9 ++++---
4 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c
index ce5247d..494c00d 100644
--- a/dlls/mmdevapi/tests/render.c
+++ b/dlls/mmdevapi/tests/render.c
@@ -220,6 +220,47 @@ static void test_audioclient(void)
NULL, (void**)&ac);
ok(hr == S_OK, "Activation failed with %08x\n", hr);
+ if(pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE){
+ WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)pwfx;
+ WAVEFORMATEX *fmt2 = NULL;
+
+ ok(fmtex->dwChannelMask != 0, "Got empty dwChannelMask\n");
+
+ fmtex->dwChannelMask = 0xffff;
+
+ hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000, 0, pwfx, NULL);
+ ok(hr == S_OK, "Initialize(dwChannelMask = 0xffff) returns %08x\n", hr);
+
+ IAudioClient_Release(ac);
+
+ hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+ NULL, (void**)&ac);
+ ok(hr == S_OK, "Activation failed with %08x\n", hr);
+
+ fmtex->dwChannelMask = 0;
+
+ hr = IAudioClient_IsFormatSupported(ac, AUDCLNT_SHAREMODE_SHARED, pwfx, &fmt2);
+ ok(hr == S_OK, "IsFormatSupported(dwChannelMask = 0) call returns %08x\n", hr);
+ ok(fmtex->dwChannelMask == 0, "Passed format was modified\n");
+
+ CoTaskMemFree(fmt2);
+
+ hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000, 0, pwfx, NULL);
+ ok(hr == S_OK, "Initialize(dwChannelMask = 0) returns %08x\n", hr);
+
+ IAudioClient_Release(ac);
+
+ hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+ NULL, (void**)&ac);
+ ok(hr == S_OK, "Activation failed with %08x\n", hr);
+
+ CoTaskMemFree(pwfx);
+
+ hr = IAudioClient_GetMixFormat(ac, &pwfx);
+ ok(hr == S_OK, "Valid GetMixFormat returns %08x\n", hr);
+ }else
+ skip("Skipping dwChannelMask tests\n");
+
hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000, 0, pwfx, NULL);
ok(hr == S_OK, "Valid Initialize returns %08x\n", hr);
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index af367ba..e1f1a49 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -1383,6 +1383,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface,
((WAVEFORMATEXTENSIBLE*)closest)->dwChannelMask = mask;
if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
+ fmtex->dwChannelMask != 0 &&
fmtex->dwChannelMask != mask)
hr = S_FALSE;
}
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c
index be4ae84..26c154f 100644
--- a/dlls/winecoreaudio.drv/mmdevdrv.c
+++ b/dlls/winecoreaudio.drv/mmdevdrv.c
@@ -1118,6 +1118,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface,
WAVEFORMATEX **outpwfx)
{
ACImpl *This = impl_from_IAudioClient(iface);
+ WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)pwfx;
AudioQueueRef aqueue;
HRESULT hr;
@@ -1135,6 +1136,11 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface,
dump_fmt(pwfx);
+ if(pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
+ fmtex->dwChannelMask != 0 &&
+ fmtex->dwChannelMask != get_channel_mask(pwfx->nChannels))
+ return AUDCLNT_E_UNSUPPORTED_FORMAT;
+
OSSpinLockLock(&This->lock);
hr = ca_setup_aqueue(This->adevid, This->dataflow, pwfx, NULL, &aqueue);
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index c34d809..8d1a997 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -668,7 +668,7 @@ static WAVEFORMATEX *clone_format(const WAVEFORMATEX *fmt)
}
static HRESULT setup_oss_device(ACImpl *This, const WAVEFORMATEX *fmt,
- WAVEFORMATEX **out)
+ WAVEFORMATEX **out, BOOL query)
{
int tmp, oss_format;
double tenth;
@@ -723,7 +723,8 @@ static HRESULT setup_oss_device(ACImpl *This, const WAVEFORMATEX *fmt,
((WAVEFORMATEXTENSIBLE*)closest)->dwChannelMask = mask;
- if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
+ if(query && fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
+ fmtex->dwChannelMask != 0 &&
fmtex->dwChannelMask != mask)
ret = S_FALSE;
}
@@ -861,7 +862,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient *iface,
return AUDCLNT_E_ALREADY_INITIALIZED;
}
- hr = setup_oss_device(This, fmt, NULL);
+ hr = setup_oss_device(This, fmt, NULL, FALSE);
if(hr == S_FALSE){
LeaveCriticalSection(&This->lock);
return AUDCLNT_E_UNSUPPORTED_FORMAT;
@@ -1099,7 +1100,7 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface,
EnterCriticalSection(&This->lock);
- ret = setup_oss_device(This, pwfx, outpwfx);
+ ret = setup_oss_device(This, pwfx, outpwfx, TRUE);
LeaveCriticalSection(&This->lock);
More information about the wine-cvs
mailing list