2 * Copyright 2009 Maarten Lankhorst
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "wine/test.h"
25 #include "mmdeviceapi.h"
29 DEFINE_GUID(GUID_NULL
,0,0,0,0,0,0,0,0,0,0,0);
31 /* Some of the QueryInterface tests are really just to check if I got the IID's right :) */
33 /* IMMDeviceCollection appears to have no QueryInterface method and instead forwards to mme */
34 static void test_collection(IMMDeviceEnumerator
*mme
, IMMDeviceCollection
*col
)
36 IMMDeviceCollection
*col2
;
37 IMMDeviceEnumerator
*mme2
;
44 /* collection doesn't keep a ref on parent */
46 ref
= IUnknown_Release(mme
);
47 ok(ref
== 2, "Reference count on parent is %u\n", ref
);
49 ref
= IUnknown_AddRef(col
);
50 IUnknown_Release(col
);
51 ok(ref
== 2, "Invalid reference count %u on collection\n", ref
);
53 hr
= IUnknown_QueryInterface(col
, &IID_IUnknown
, NULL
);
54 ok(hr
== E_POINTER
, "Null ppv returns %08x\n", hr
);
56 hr
= IUnknown_QueryInterface(col
, &IID_IUnknown
, (void**)&unk
);
57 ok(hr
== S_OK
, "Cannot query for IID_IUnknown: 0x%08x\n", hr
);
60 ok((LONG_PTR
)col
== (LONG_PTR
)unk
, "Pointers are not identical %p/%p/%p\n", col
, unk
, mme
);
61 IUnknown_Release(unk
);
64 hr
= IUnknown_QueryInterface(col
, &IID_IMMDeviceCollection
, (void**)&col2
);
65 ok(hr
== S_OK
, "Cannot query for IID_IMMDeviceCollection: 0x%08x\n", hr
);
67 IUnknown_Release(col2
);
69 hr
= IUnknown_QueryInterface(col
, &IID_IMMDeviceEnumerator
, (void**)&mme2
);
70 ok(hr
== E_NOINTERFACE
, "Query for IID_IMMDeviceEnumerator returned: 0x%08x\n", hr
);
72 IUnknown_Release(mme2
);
74 hr
= IMMDeviceCollection_GetCount(col
, NULL
);
75 ok(hr
== E_POINTER
, "GetCount returned 0x%08x\n", hr
);
77 hr
= IMMDeviceCollection_GetCount(col
, &numdev
);
78 ok(hr
== S_OK
, "GetCount returned 0x%08x\n", hr
);
80 dev
= (void*)(LONG_PTR
)0x12345678;
81 hr
= IMMDeviceCollection_Item(col
, numdev
, &dev
);
82 ok(hr
== E_INVALIDARG
, "Asking for too high device returned 0x%08x\n", hr
);
83 ok(dev
== NULL
, "Returned non-null device\n");
87 hr
= IMMDeviceCollection_Item(col
, 0, NULL
);
88 ok(hr
== E_POINTER
, "Query with null pointer returned 0x%08x\n", hr
);
90 hr
= IMMDeviceCollection_Item(col
, 0, &dev
);
91 ok(hr
== S_OK
, "Valid Item returned 0x%08x\n", hr
);
92 ok(dev
!= NULL
, "Device is null!\n");
97 if (IMMDevice_GetId(dev
, &id
) == S_OK
)
99 temp
[sizeof(temp
)-1] = 0;
100 WideCharToMultiByte(CP_ACP
, 0, id
, -1, temp
, sizeof(temp
)-1, NULL
, NULL
);
101 trace("Device found: %s\n", temp
);
106 IUnknown_Release(dev
);
108 IUnknown_Release(col
);
111 /* Only do parameter tests here, the actual MMDevice testing should be a separate test */
112 START_TEST(mmdevenum
)
115 IUnknown
*unk
= NULL
;
116 IMMDeviceEnumerator
*mme
, *mme2
;
118 IMMDeviceCollection
*col
;
120 CoInitializeEx(NULL
, COINIT_MULTITHREADED
);
121 hr
= CoCreateInstance(&CLSID_MMDeviceEnumerator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IMMDeviceEnumerator
, (void**)&mme
);
124 skip("mmdevapi not available: 0x%08x\n", hr
);
128 /* Odd behavior.. bug? */
129 ref
= IUnknown_AddRef(mme
);
130 ok(ref
== 3, "Invalid reference count after incrementing: %u\n", ref
);
131 IUnknown_Release(mme
);
133 hr
= IUnknown_QueryInterface(mme
, &IID_IUnknown
, (void**)&unk
);
134 ok(hr
== S_OK
, "returned 0x%08x\n", hr
);
135 if (hr
!= S_OK
) return;
137 ok( (LONG_PTR
)mme
== (LONG_PTR
)unk
, "Pointers are unequal %p/%p\n", unk
, mme
);
138 IUnknown_Release(unk
);
140 /* Proving that it is static.. */
141 hr
= CoCreateInstance(&CLSID_MMDeviceEnumerator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IMMDeviceEnumerator
, (void**)&mme2
);
142 IUnknown_Release(mme2
);
143 ok(mme
== mme2
, "Pointers are not equal!\n");
145 hr
= IUnknown_QueryInterface(mme
, &IID_IUnknown
, NULL
);
146 ok(hr
== E_POINTER
, "Null pointer on QueryInterface returned %08x\n", hr
);
148 hr
= IUnknown_QueryInterface(mme
, &GUID_NULL
, (void**)&unk
);
149 ok(!unk
, "Unk not reset to null after invalid QI\n");
150 ok(hr
== E_NOINTERFACE
, "Invalid hr %08x returned on IID_NULL\n", hr
);
152 col
= (void*)(LONG_PTR
)0x12345678;
153 hr
= IMMDeviceEnumerator_EnumAudioEndpoints(mme
, 0xffff, DEVICE_STATEMASK_ALL
, &col
);
154 ok(hr
== E_INVALIDARG
, "Setting invalid data flow returned 0x%08x\n", hr
);
155 ok(col
== NULL
, "Collection pointer non-null on failure\n");
157 hr
= IMMDeviceEnumerator_EnumAudioEndpoints(mme
, eAll
, DEVICE_STATEMASK_ALL
+1, &col
);
158 ok(hr
== E_INVALIDARG
, "Setting invalid mask returned 0x%08x\n", hr
);
160 hr
= IMMDeviceEnumerator_EnumAudioEndpoints(mme
, eAll
, DEVICE_STATEMASK_ALL
, NULL
);
161 ok(hr
== E_POINTER
, "Invalid pointer returned: 0x%08x\n", hr
);
163 hr
= IMMDeviceEnumerator_EnumAudioEndpoints(mme
, eAll
, DEVICE_STATEMASK_ALL
, &col
);
164 ok(hr
== S_OK
, "Valid EnumAudioEndpoints returned 0x%08x\n", hr
);
167 ok(!!col
, "Returned null pointer\n");
169 test_collection(mme
, col
);
172 IUnknown_Release(mme
);