=?UTF-8?Q?J=C3=B6rg=20H=C3=B6hle=20?=: mmdevapi/tests: Add PCM format tests .

Alexandre Julliard julliard at winehq.org
Fri Nov 18 10:19:06 CST 2011


Module: wine
Branch: master
Commit: 31eb83359a2da80b90979a5251b0ad75c7eea34d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=31eb83359a2da80b90979a5251b0ad75c7eea34d

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Wed Nov 16 18:46:09 2011 +0100

mmdevapi/tests: Add PCM format tests.

---

 dlls/mmdevapi/tests/render.c |  109 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 109 insertions(+), 0 deletions(-)

diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c
index 7108815..8590abd 100644
--- a/dlls/mmdevapi/tests/render.c
+++ b/dlls/mmdevapi/tests/render.c
@@ -38,6 +38,18 @@
 #include "audioclient.h"
 #include "audiopolicy.h"
 
+static const unsigned int win_formats[][4] = {
+    { 8000,  8, 1},   { 8000,  8, 2},   { 8000, 16, 1},   { 8000, 16, 2},
+    {11025,  8, 1},   {11025,  8, 2},   {11025, 16, 1},   {11025, 16, 2},
+    {12000,  8, 1},   {12000,  8, 2},   {12000, 16, 1},   {12000, 16, 2},
+    {16000,  8, 1},   {16000,  8, 2},   {16000, 16, 1},   {16000, 16, 2},
+    {22050,  8, 1},   {22050,  8, 2},   {22050, 16, 1},   {22050, 16, 2},
+    {44100,  8, 1},   {44100,  8, 2},   {44100, 16, 1},   {44100, 16, 2},
+    {48000,  8, 1},   {48000,  8, 2},   {48000, 16, 1},   {48000, 16, 2},
+    {96000,  8, 1},   {96000,  8, 2},   {96000, 16, 1},   {96000, 16, 2}
+};
+#define NB_WIN_FORMATS (sizeof(win_formats)/sizeof(*win_formats))
+
 #define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
 
 static IMMDeviceEnumerator *mme = NULL;
@@ -328,6 +340,101 @@ static void test_audioclient(void)
     CoTaskMemFree(pwfx);
 }
 
+static void test_formats(AUDCLNT_SHAREMODE mode)
+{
+    IAudioClient *ac;
+    HRESULT hr, hrs;
+    WAVEFORMATEX fmt, *pwfx, *pwfx2;
+    int i;
+
+    fmt.wFormatTag = WAVE_FORMAT_PCM;
+    fmt.cbSize = 0;
+
+    for(i = 0; i < NB_WIN_FORMATS; i++) {
+        hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+                NULL, (void**)&ac);
+        ok(hr == S_OK, "Activation failed with %08x\n", hr);
+        if(hr != S_OK)
+            continue;
+
+        hr = IAudioClient_GetMixFormat(ac, &pwfx);
+        ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
+
+        fmt.nSamplesPerSec = win_formats[i][0];
+        fmt.wBitsPerSample = win_formats[i][1];
+        fmt.nChannels      = win_formats[i][2];
+        fmt.nBlockAlign    = fmt.nChannels * fmt.wBitsPerSample / 8;
+        fmt.nAvgBytesPerSec= fmt.nBlockAlign * fmt.nSamplesPerSec;
+
+        pwfx2 = (WAVEFORMATEX*)0xDEADF00D;
+        hr = IAudioClient_IsFormatSupported(ac, mode, &fmt, &pwfx2);
+        hrs = hr;
+        /* Only shared mode suggests something ... GetMixFormat! */
+        ok(hr == S_OK || (mode == AUDCLNT_SHAREMODE_SHARED
+           ? hr == S_FALSE || broken(hr == AUDCLNT_E_UNSUPPORTED_FORMAT &&
+               /* 5:1 card exception when asked for 1 channel at mixer rate */
+               pwfx->nChannels > 2 && fmt.nSamplesPerSec == pwfx->nSamplesPerSec)
+           : (hr == AUDCLNT_E_UNSUPPORTED_FORMAT || hr == hexcl)),
+           "IsFormatSupported(%d, %ux%2ux%u) returns %08x\n", mode,
+           fmt.nSamplesPerSec, fmt.wBitsPerSample, fmt.nChannels, hr);
+        if (hr == S_OK)
+            trace("IsSupported(%s, %ux%2ux%u)\n",
+                  mode == AUDCLNT_SHAREMODE_SHARED ? "shared " : "exclus.",
+                  fmt.nSamplesPerSec, fmt.wBitsPerSample, fmt.nChannels);
+
+        /* Change GetMixFormat wBitsPerSample only => S_OK */
+        if (mode == AUDCLNT_SHAREMODE_SHARED
+            && fmt.nSamplesPerSec == pwfx->nSamplesPerSec
+            && fmt.nChannels == pwfx->nChannels)
+            ok(hr == S_OK, "Varying BitsPerSample %u\n", fmt.wBitsPerSample);
+
+        ok((hr == S_FALSE)^(pwfx2 == NULL), "hr %x<->suggest %p\n", hr, pwfx2);
+        if (pwfx2 == (WAVEFORMATEX*)0xDEADF00D)
+            pwfx2 = NULL; /* broken in Wine < 1.3.28 */
+        if (pwfx2) {
+            ok(pwfx2->nSamplesPerSec == pwfx->nSamplesPerSec &&
+               pwfx2->nChannels      == pwfx->nChannels &&
+               pwfx2->wBitsPerSample == pwfx->wBitsPerSample,
+               "Suggestion %ux%2ux%u differs from GetMixFormat\n",
+               pwfx2->nSamplesPerSec, pwfx2->wBitsPerSample, pwfx2->nChannels);
+        }
+
+        /* Vista returns E_INVALIDARG upon AUDCLNT_STREAMFLAGS_RATEADJUST */
+        hr = IAudioClient_Initialize(ac, mode, 0, 5000000, 0, &fmt, NULL);
+        if ((hrs == S_OK) ^ (hr == S_OK))
+            trace("Initialize (%u      , %ux%2ux%u) returns %08x unlike IsFormatSupported\n",
+                  mode, fmt.nSamplesPerSec, fmt.wBitsPerSample, fmt.nChannels, hr);
+        if (mode == AUDCLNT_SHAREMODE_SHARED)
+            ok(hrs == S_OK ? hr == S_OK : hr == AUDCLNT_E_UNSUPPORTED_FORMAT,
+               "Initialize(shared,  %ux%2ux%u) returns %08x\n",
+               fmt.nSamplesPerSec, fmt.wBitsPerSample, fmt.nChannels, hr);
+        else if (hrs == AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED)
+            /* Unsupported format implies "create failed" and shadows "not allowed" */
+            ok(hrs == hexcl && (hr == AUDCLNT_E_ENDPOINT_CREATE_FAILED || hr == hrs),
+               "Initialize(noexcl., %ux%2ux%u) returns %08x(%08x)\n",
+               fmt.nSamplesPerSec, fmt.wBitsPerSample, fmt.nChannels, hr, hrs);
+        else
+            /* On testbot 48000x16x1 claims support, but does not Initialize.
+             * 5:1 cards Initialize 44100|48000x16x1 yet claim no support. */
+            ok(hrs == S_OK ? hr == S_OK || broken(hr == AUDCLNT_E_ENDPOINT_CREATE_FAILED)
+               : hr == AUDCLNT_E_ENDPOINT_CREATE_FAILED || broken(hr == S_OK &&
+                   pwfx->nChannels > 2 && fmt.nChannels == 1),
+               "Initialize(exclus., %ux%2ux%u) returns %08x\n",
+               fmt.nSamplesPerSec, fmt.wBitsPerSample, fmt.nChannels, hr);
+
+        /* Bug in native (Vista/w2k8/w7): after Initialize failed, better
+         * Release this ac and Activate a new one.
+         * A second call (with a known working format) would yield
+         * ALREADY_INITIALIZED in shared mode yet be unusable, and in exclusive
+         * mode some entity keeps a lock on the device, causing DEVICE_IN_USE to
+         * all subsequent calls until the audio engine service is restarted. */
+
+        CoTaskMemFree(pwfx2);
+        CoTaskMemFree(pwfx);
+        IAudioClient_Release(ac);
+    }
+}
+
 static void test_references(void)
 {
     IAudioClient *ac;
@@ -1447,6 +1554,8 @@ START_TEST(render)
     }
 
     test_audioclient();
+    test_formats(AUDCLNT_SHAREMODE_EXCLUSIVE);
+    test_formats(AUDCLNT_SHAREMODE_SHARED);
     test_references();
     test_event();
     test_padding();




More information about the wine-cvs mailing list