| /* | |
| * Copyright 2012, 2014 Michael Stefaniuc | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #define COBJMACROS | |
| #include <stdarg.h> | |
| #include <windef.h> | |
| #include <wine/test.h> | |
| #include <dmusici.h> | |
| #include <audioclient.h> | |
| #include <guiddef.h> | |
| #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) | |
| static BOOL missing_dmime(void) | |
| { | |
| IDirectMusicSegment8 *dms; | |
| HRESULT hr = CoCreateInstance(&CLSID_DirectMusicSegment, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicSegment, (void**)&dms); | |
| if (hr == S_OK && dms) | |
| { | |
| IDirectMusicSegment_Release(dms); | |
| return FALSE; | |
| } | |
| return TRUE; | |
| } | |
| static void test_COM_audiopath(void) | |
| { | |
| IDirectMusicAudioPath *dmap; | |
| IUnknown *unk; | |
| IDirectMusicPerformance8 *performance; | |
| IDirectSoundBuffer *dsound; | |
| IDirectSoundBuffer8 *dsound8; | |
| IDirectSoundNotify *notify; | |
| IDirectSound3DBuffer *dsound3d; | |
| IKsPropertySet *propset; | |
| ULONG refcount; | |
| HRESULT hr; | |
| DWORD buffer = 0; | |
| hr = CoCreateInstance(&CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicPerformance8, (void**)&performance); | |
| ok(hr == S_OK || broken(hr == E_NOINTERFACE), | |
| "DirectMusicPerformance create failed: %08x\n", hr); | |
| if (!performance) { | |
| win_skip("IDirectMusicPerformance8 not available\n"); | |
| return; | |
| } | |
| hr = IDirectMusicPerformance8_InitAudio(performance, NULL, NULL, NULL, | |
| DMUS_APATH_SHARED_STEREOPLUSREVERB, 64, DMUS_AUDIOF_ALL, NULL); | |
| ok(hr == S_OK || hr == DSERR_NODRIVER || | |
| broken(hr == AUDCLNT_E_ENDPOINT_CREATE_FAILED), /* Win 10 testbot */ | |
| "DirectMusicPerformance_InitAudio failed: %08x\n", hr); | |
| if (FAILED(hr)) { | |
| skip("Audio failed to initialize\n"); | |
| return; | |
| } | |
| hr = IDirectMusicPerformance8_GetDefaultAudioPath(performance, &dmap); | |
| ok(hr == S_OK, "DirectMusicPerformance_GetDefaultAudioPath failed: %08x\n", hr); | |
| /* IDirectMusicObject and IPersistStream are not supported */ | |
| hr = IDirectMusicAudioPath_QueryInterface(dmap, &IID_IDirectMusicObject, (void**)&unk); | |
| todo_wine ok(FAILED(hr) && !unk, "Unexpected IDirectMusicObject interface: hr=%08x, iface=%p\n", | |
| hr, unk); | |
| if (unk) IUnknown_Release(unk); | |
| hr = IDirectMusicAudioPath_QueryInterface(dmap, &IID_IPersistStream, (void**)&unk); | |
| todo_wine ok(FAILED(hr) && !unk, "Unexpected IPersistStream interface: hr=%08x, iface=%p\n", | |
| hr, unk); | |
| if (unk) IUnknown_Release(unk); | |
| /* Same refcount for all DirectMusicAudioPath interfaces */ | |
| refcount = IDirectMusicAudioPath_AddRef(dmap); | |
| ok(refcount == 3, "refcount == %u, expected 3\n", refcount); | |
| hr = IDirectMusicAudioPath_QueryInterface(dmap, &IID_IUnknown, (void**)&unk); | |
| ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); | |
| ok(unk == (IUnknown*)dmap, "got %p, %p\n", unk, dmap); | |
| refcount = IUnknown_AddRef(unk); | |
| ok(refcount == 5, "refcount == %u, expected 5\n", refcount); | |
| refcount = IUnknown_Release(unk); | |
| hr = IDirectMusicAudioPath_GetObjectInPath(dmap, DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, buffer, &GUID_NULL, | |
| 0, &IID_IDirectSoundBuffer, (void**)&dsound); | |
| ok(hr == S_OK, "Failed: %08x\n", hr); | |
| IDirectSoundBuffer_Release(dsound); | |
| hr = IDirectMusicAudioPath_GetObjectInPath(dmap, DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, buffer, &GUID_NULL, | |
| 0, &IID_IDirectSoundBuffer8, (void**)&dsound8); | |
| ok(hr == S_OK, "Failed: %08x\n", hr); | |
| IDirectSoundBuffer8_Release(dsound8); | |
| hr = IDirectMusicAudioPath_GetObjectInPath(dmap, DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, buffer, &GUID_NULL, | |
| 0, &IID_IDirectSoundNotify, (void**)¬ify); | |
| ok(hr == E_NOINTERFACE, "Failed: %08x\n", hr); | |
| hr = IDirectMusicAudioPath_GetObjectInPath(dmap, DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, buffer, &GUID_NULL, | |
| 0, &IID_IDirectSound3DBuffer, (void**)&dsound3d); | |
| ok(hr == E_NOINTERFACE, "Failed: %08x\n", hr); | |
| hr = IDirectMusicAudioPath_GetObjectInPath(dmap, DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, buffer, &GUID_NULL, | |
| 0, &IID_IKsPropertySet, (void**)&propset); | |
| todo_wine ok(hr == S_OK, "Failed: %08x\n", hr); | |
| if (propset) | |
| IKsPropertySet_Release(propset); | |
| hr = IDirectMusicAudioPath_GetObjectInPath(dmap, DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, buffer, &GUID_NULL, | |
| 0, &IID_IUnknown, (void**)&unk); | |
| ok(hr == S_OK, "Failed: %08x\n", hr); | |
| IUnknown_Release(unk); | |
| hr = IDirectMusicAudioPath_GetObjectInPath(dmap, DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, buffer, &GUID_NULL, | |
| 0, &GUID_NULL, (void**)&unk); | |
| ok(hr == E_NOINTERFACE, "Failed: %08x\n", hr); | |
| while (IDirectMusicAudioPath_Release(dmap) > 1); /* performance has a reference too */ | |
| IDirectMusicPerformance8_CloseDown(performance); | |
| IDirectMusicPerformance8_Release(performance); | |
| } | |
| static void test_COM_audiopathconfig(void) | |
| { | |
| IDirectMusicAudioPath *dmap = (IDirectMusicAudioPath*)0xdeadbeef; | |
| IDirectMusicObject *dmo; | |
| IPersistStream *ps; | |
| IUnknown *unk; | |
| ULONG refcount; | |
| HRESULT hr; | |
| /* COM aggregation */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicAudioPathConfig, (IUnknown *)0xdeadbeef, CLSCTX_INPROC_SERVER, | |
| &IID_IUnknown, (void**)&dmap); | |
| if (hr == REGDB_E_CLASSNOTREG) { | |
| win_skip("DirectMusicAudioPathConfig not registered\n"); | |
| return; | |
| } | |
| ok(hr == CLASS_E_NOAGGREGATION, | |
| "DirectMusicAudioPathConfig create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr); | |
| ok(!dmap, "dmap = %p\n", dmap); | |
| /* IDirectMusicAudioPath not supported */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicAudioPathConfig, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicAudioPath, (void**)&dmap); | |
| todo_wine ok(FAILED(hr) && !dmap, | |
| "Unexpected IDirectMusicAudioPath interface: hr=%08x, iface=%p\n", hr, dmap); | |
| /* IDirectMusicObject and IPersistStream supported */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicAudioPathConfig, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "DirectMusicObject create failed: %08x, expected S_OK\n", hr); | |
| IPersistStream_Release(ps); | |
| hr = CoCreateInstance(&CLSID_DirectMusicAudioPathConfig, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicObject, (void**)&dmo); | |
| ok(hr == S_OK, "DirectMusicObject create failed: %08x, expected S_OK\n", hr); | |
| /* Same refcount for all DirectMusicObject interfaces */ | |
| refcount = IDirectMusicObject_AddRef(dmo); | |
| ok(refcount == 2, "refcount == %u, expected 2\n", refcount); | |
| hr = IDirectMusicObject_QueryInterface(dmo, &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| refcount = IPersistStream_AddRef(ps); | |
| ok(refcount == 4, "refcount == %u, expected 4\n", refcount); | |
| IPersistStream_Release(ps); | |
| hr = IDirectMusicObject_QueryInterface(dmo, &IID_IUnknown, (void**)&unk); | |
| ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); | |
| refcount = IUnknown_AddRef(unk); | |
| ok(refcount == 5, "refcount == %u, expected 5\n", refcount); | |
| refcount = IUnknown_Release(unk); | |
| /* IDirectMusicAudioPath still not supported */ | |
| hr = IDirectMusicObject_QueryInterface(dmo, &IID_IDirectMusicAudioPath, (void**)&dmap); | |
| todo_wine ok(FAILED(hr) && !dmap, | |
| "Unexpected IDirectMusicAudioPath interface: hr=%08x, iface=%p\n", hr, dmap); | |
| while (IDirectMusicObject_Release(dmo)); | |
| } | |
| static void test_COM_graph(void) | |
| { | |
| IDirectMusicGraph *dmg = (IDirectMusicGraph*)0xdeadbeef; | |
| IDirectMusicObject *dmo; | |
| IPersistStream *ps; | |
| IUnknown *unk; | |
| ULONG refcount; | |
| HRESULT hr; | |
| /* COM aggregation */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicGraph, (IUnknown *)0xdeadbeef, CLSCTX_INPROC_SERVER, | |
| &IID_IUnknown, (void**)&dmg); | |
| ok(hr == CLASS_E_NOAGGREGATION, | |
| "DirectMusicGraph create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr); | |
| ok(!dmg, "dmg = %p\n", dmg); | |
| /* Invalid RIID */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IClassFactory, | |
| (void**)&dmg); | |
| ok(hr == E_NOINTERFACE, "DirectMusicGraph create failed: %08x, expected E_NOINTERFACE\n", hr); | |
| /* Same refcount for all DirectMusicGraph interfaces */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicGraph, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicGraph, (void**)&dmg); | |
| ok(hr == S_OK, "DirectMusicGraph create failed: %08x, expected S_OK\n", hr); | |
| refcount = IDirectMusicGraph_AddRef(dmg); | |
| ok(refcount == 2, "refcount == %u, expected 2\n", refcount); | |
| hr = IDirectMusicGraph_QueryInterface(dmg, &IID_IDirectMusicObject, (void**)&dmo); | |
| if (hr == E_NOINTERFACE) { | |
| win_skip("DirectMusicGraph without IDirectMusicObject\n"); | |
| return; | |
| } | |
| ok(hr == S_OK, "QueryInterface for IID_IDirectMusicObject failed: %08x\n", hr); | |
| refcount = IDirectMusicObject_AddRef(dmo); | |
| ok(refcount == 4, "refcount == %u, expected 4\n", refcount); | |
| refcount = IDirectMusicObject_Release(dmo); | |
| hr = IDirectMusicGraph_QueryInterface(dmg, &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| refcount = IPersistStream_AddRef(ps); | |
| ok(refcount == 5, "refcount == %u, expected 5\n", refcount); | |
| refcount = IPersistStream_Release(ps); | |
| hr = IDirectMusicGraph_QueryInterface(dmg, &IID_IUnknown, (void**)&unk); | |
| ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); | |
| refcount = IUnknown_AddRef(unk); | |
| ok(refcount == 6, "refcount == %u, expected 6\n", refcount); | |
| refcount = IUnknown_Release(unk); | |
| while (IDirectMusicGraph_Release(dmg)); | |
| } | |
| static void test_COM_segment(void) | |
| { | |
| IDirectMusicSegment8 *dms = (IDirectMusicSegment8*)0xdeadbeef; | |
| IDirectMusicObject *dmo; | |
| IPersistStream *stream; | |
| IUnknown *unk; | |
| ULONG refcount; | |
| HRESULT hr; | |
| /* COM aggregation */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicSegment, (IUnknown *)0xdeadbeef, CLSCTX_INPROC_SERVER, | |
| &IID_IUnknown, (void**)&dms); | |
| ok(hr == CLASS_E_NOAGGREGATION, | |
| "DirectMusicSegment create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr); | |
| ok(!dms, "dms = %p\n", dms); | |
| /* Invalid RIID */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicSegment, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectSound, (void**)&dms); | |
| ok(hr == E_NOINTERFACE, | |
| "DirectMusicSegment create failed: %08x, expected E_NOINTERFACE\n", hr); | |
| /* Same refcount */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicSegment, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicSegment8, (void**)&dms); | |
| if (hr == E_NOINTERFACE) { | |
| win_skip("DirectMusicSegment without IDirectMusicSegment8\n"); | |
| return; | |
| } | |
| ok(hr == S_OK, "DirectMusicSegment create failed: %08x, expected S_OK\n", hr); | |
| refcount = IDirectMusicSegment8_AddRef(dms); | |
| ok (refcount == 2, "refcount == %u, expected 2\n", refcount); | |
| hr = IDirectMusicSegment8_QueryInterface(dms, &IID_IDirectMusicObject, (void**)&dmo); | |
| ok(hr == S_OK, "QueryInterface for IID_IDirectMusicObject failed: %08x\n", hr); | |
| IDirectMusicSegment8_AddRef(dms); | |
| refcount = IDirectMusicSegment8_Release(dms); | |
| ok (refcount == 3, "refcount == %u, expected 3\n", refcount); | |
| hr = IDirectMusicSegment8_QueryInterface(dms, &IID_IPersistStream, (void**)&stream); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| refcount = IDirectMusicSegment8_Release(dms); | |
| ok (refcount == 3, "refcount == %u, expected 3\n", refcount); | |
| hr = IDirectMusicSegment8_QueryInterface(dms, &IID_IUnknown, (void**)&unk); | |
| ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); | |
| refcount = IUnknown_Release(unk); | |
| ok (refcount == 3, "refcount == %u, expected 3\n", refcount); | |
| refcount = IDirectMusicObject_Release(dmo); | |
| ok (refcount == 2, "refcount == %u, expected 2\n", refcount); | |
| refcount = IPersistStream_Release(stream); | |
| ok (refcount == 1, "refcount == %u, expected 1\n", refcount); | |
| refcount = IDirectMusicSegment8_Release(dms); | |
| ok (refcount == 0, "refcount == %u, expected 0\n", refcount); | |
| } | |
| static void test_COM_segmentstate(void) | |
| { | |
| IDirectMusicSegmentState8 *dmss8 = (IDirectMusicSegmentState8*)0xdeadbeef; | |
| IUnknown *unk; | |
| ULONG refcount; | |
| HRESULT hr; | |
| /* COM aggregation */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicSegmentState, (IUnknown *)0xdeadbeef, CLSCTX_INPROC_SERVER, | |
| &IID_IUnknown, (void**)&dmss8); | |
| ok(hr == CLASS_E_NOAGGREGATION, | |
| "DirectMusicSegmentState8 create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr); | |
| ok(!dmss8, "dmss8 = %p\n", dmss8); | |
| /* Invalid RIID */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicSegmentState, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicObject, (void**)&dmss8); | |
| ok(hr == E_NOINTERFACE, | |
| "DirectMusicSegmentState8 create failed: %08x, expected E_NOINTERFACE\n", hr); | |
| /* Same refcount for all DirectMusicSegmentState interfaces */ | |
| hr = CoCreateInstance(&CLSID_DirectMusicSegmentState, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicSegmentState8, (void**)&dmss8); | |
| if (hr == E_NOINTERFACE) { | |
| win_skip("DirectMusicSegmentState without IDirectMusicSegmentState8\n"); | |
| return; | |
| } | |
| ok(hr == S_OK, "DirectMusicSegmentState8 create failed: %08x, expected S_OK\n", hr); | |
| refcount = IDirectMusicSegmentState8_AddRef(dmss8); | |
| ok(refcount == 2, "refcount == %u, expected 2\n", refcount); | |
| hr = IDirectMusicSegmentState8_QueryInterface(dmss8, &IID_IUnknown, (void**)&unk); | |
| ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); | |
| refcount = IUnknown_AddRef(unk); | |
| ok(refcount == 4, "refcount == %u, expected 4\n", refcount); | |
| refcount = IUnknown_Release(unk); | |
| hr = IDirectMusicSegmentState8_QueryInterface(dmss8, &IID_IUnknown, NULL); | |
| ok(hr == E_POINTER, "got %08x\n", hr); | |
| while (IDirectMusicSegmentState8_Release(dmss8)); | |
| } | |
| static void test_COM_track(void) | |
| { | |
| IDirectMusicTrack *dmt; | |
| IDirectMusicTrack8 *dmt8; | |
| IPersistStream *ps; | |
| IUnknown *unk; | |
| ULONG refcount; | |
| HRESULT hr; | |
| #define X(class) &CLSID_ ## class, #class | |
| const struct { | |
| REFCLSID clsid; | |
| const char *name; | |
| BOOL has_dmt8; | |
| } class[] = { | |
| { X(DirectMusicLyricsTrack), TRUE }, | |
| { X(DirectMusicMarkerTrack), FALSE }, | |
| { X(DirectMusicParamControlTrack), TRUE }, | |
| { X(DirectMusicSegmentTriggerTrack), TRUE }, | |
| { X(DirectMusicSeqTrack), TRUE }, | |
| { X(DirectMusicSysExTrack), TRUE }, | |
| { X(DirectMusicTempoTrack), TRUE }, | |
| { X(DirectMusicTimeSigTrack), FALSE }, | |
| { X(DirectMusicWaveTrack), TRUE } | |
| }; | |
| #undef X | |
| unsigned int i; | |
| for (i = 0; i < ARRAY_SIZE(class); i++) { | |
| trace("Testing %s\n", class[i].name); | |
| /* COM aggregation */ | |
| dmt8 = (IDirectMusicTrack8*)0xdeadbeef; | |
| hr = CoCreateInstance(class[i].clsid, (IUnknown *)0xdeadbeef, CLSCTX_INPROC_SERVER, &IID_IUnknown, | |
| (void**)&dmt8); | |
| if (hr == REGDB_E_CLASSNOTREG) { | |
| win_skip("%s not registered\n", class[i].name); | |
| continue; | |
| } | |
| ok(hr == CLASS_E_NOAGGREGATION, | |
| "%s create failed: %08x, expected CLASS_E_NOAGGREGATION\n", class[i].name, hr); | |
| ok(!dmt8, "dmt8 = %p\n", dmt8); | |
| /* Invalid RIID */ | |
| hr = CoCreateInstance(class[i].clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, | |
| (void**)&dmt8); | |
| ok(hr == E_NOINTERFACE, "%s create failed: %08x, expected E_NOINTERFACE\n", | |
| class[i].name, hr); | |
| /* Same refcount for all DirectMusicTrack interfaces */ | |
| hr = CoCreateInstance(class[i].clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicTrack, | |
| (void**)&dmt); | |
| ok(hr == S_OK, "%s create failed: %08x, expected S_OK\n", class[i].name, hr); | |
| refcount = IDirectMusicTrack_AddRef(dmt); | |
| ok(refcount == 2, "refcount == %u, expected 2\n", refcount); | |
| hr = IDirectMusicTrack_QueryInterface(dmt, &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| refcount = IPersistStream_AddRef(ps); | |
| ok(refcount == 4, "refcount == %u, expected 4\n", refcount); | |
| IPersistStream_Release(ps); | |
| hr = IDirectMusicTrack_QueryInterface(dmt, &IID_IUnknown, (void**)&unk); | |
| ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); | |
| refcount = IUnknown_AddRef(unk); | |
| ok(refcount == 5, "refcount == %u, expected 5\n", refcount); | |
| refcount = IUnknown_Release(unk); | |
| hr = IDirectMusicTrack_QueryInterface(dmt, &IID_IDirectMusicTrack8, (void**)&dmt8); | |
| if (class[i].has_dmt8) { | |
| ok(hr == S_OK, "QueryInterface for IID_IDirectMusicTrack8 failed: %08x\n", hr); | |
| refcount = IDirectMusicTrack8_AddRef(dmt8); | |
| ok(refcount == 6, "refcount == %u, expected 6\n", refcount); | |
| refcount = IDirectMusicTrack8_Release(dmt8); | |
| } else { | |
| ok(hr == E_NOINTERFACE, "QueryInterface for IID_IDirectMusicTrack8 failed: %08x\n", hr); | |
| refcount = IDirectMusicTrack_AddRef(dmt); | |
| ok(refcount == 5, "refcount == %u, expected 5\n", refcount); | |
| } | |
| while (IDirectMusicTrack_Release(dmt)); | |
| } | |
| } | |
| static void test_audiopathconfig(void) | |
| { | |
| IDirectMusicObject *dmo; | |
| IPersistStream *ps; | |
| CLSID class = { 0 }; | |
| ULARGE_INTEGER size; | |
| HRESULT hr; | |
| hr = CoCreateInstance(&CLSID_DirectMusicAudioPathConfig, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicObject, (void**)&dmo); | |
| if (hr == REGDB_E_CLASSNOTREG) { | |
| win_skip("DirectMusicAudioPathConfig not registered\n"); | |
| return; | |
| } | |
| ok(hr == S_OK, "DirectMusicAudioPathConfig create failed: %08x, expected S_OK\n", hr); | |
| /* IPersistStream */ | |
| hr = IDirectMusicObject_QueryInterface(dmo, &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| hr = IPersistStream_GetClassID(ps, &class); | |
| ok(hr == S_OK, "IPersistStream_GetClassID failed: %08x\n", hr); | |
| ok(IsEqualGUID(&class, &CLSID_DirectMusicAudioPathConfig), | |
| "Expected class CLSID_DirectMusicAudioPathConfig got %s\n", wine_dbgstr_guid(&class)); | |
| /* Unimplemented IPersistStream methods */ | |
| hr = IPersistStream_IsDirty(ps); | |
| ok(hr == S_FALSE, "IPersistStream_IsDirty failed: %08x\n", hr); | |
| hr = IPersistStream_GetSizeMax(ps, &size); | |
| ok(hr == E_NOTIMPL, "IPersistStream_GetSizeMax failed: %08x\n", hr); | |
| hr = IPersistStream_Save(ps, NULL, TRUE); | |
| ok(hr == E_NOTIMPL, "IPersistStream_Save failed: %08x\n", hr); | |
| while (IDirectMusicObject_Release(dmo)); | |
| } | |
| static void test_graph(void) | |
| { | |
| IDirectMusicGraph *dmg; | |
| IPersistStream *ps; | |
| CLSID class = { 0 }; | |
| ULARGE_INTEGER size; | |
| HRESULT hr; | |
| hr = CoCreateInstance(&CLSID_DirectMusicGraph, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicGraph, (void**)&dmg); | |
| ok(hr == S_OK, "DirectMusicGraph create failed: %08x, expected S_OK\n", hr); | |
| /* IPersistStream */ | |
| hr = IDirectMusicGraph_QueryInterface(dmg, &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| hr = IPersistStream_GetClassID(ps, &class); | |
| ok(hr == S_OK || broken(hr == E_NOTIMPL) /* win2k */, "IPersistStream_GetClassID failed: %08x\n", hr); | |
| if (hr == S_OK) | |
| ok(IsEqualGUID(&class, &CLSID_DirectMusicGraph), | |
| "Expected class CLSID_DirectMusicGraph got %s\n", wine_dbgstr_guid(&class)); | |
| /* Unimplemented IPersistStream methods */ | |
| hr = IPersistStream_IsDirty(ps); | |
| ok(hr == S_FALSE, "IPersistStream_IsDirty failed: %08x\n", hr); | |
| hr = IPersistStream_GetSizeMax(ps, &size); | |
| ok(hr == E_NOTIMPL, "IPersistStream_GetSizeMax failed: %08x\n", hr); | |
| hr = IPersistStream_Save(ps, NULL, TRUE); | |
| ok(hr == E_NOTIMPL, "IPersistStream_Save failed: %08x\n", hr); | |
| while (IDirectMusicGraph_Release(dmg)); | |
| } | |
| static void test_segment(void) | |
| { | |
| IDirectMusicSegment *dms; | |
| IPersistStream *ps; | |
| CLSID class = { 0 }; | |
| ULARGE_INTEGER size; | |
| HRESULT hr; | |
| hr = CoCreateInstance(&CLSID_DirectMusicSegment, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IDirectMusicSegment, (void**)&dms); | |
| ok(hr == S_OK, "DirectMusicSegment create failed: %08x, expected S_OK\n", hr); | |
| /* IPersistStream */ | |
| hr = IDirectMusicSegment_QueryInterface(dms, &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| hr = IPersistStream_GetClassID(ps, &class); | |
| ok(hr == S_OK || broken(hr == E_NOTIMPL) /* win2k */, "IPersistStream_GetClassID failed: %08x\n", hr); | |
| if (hr == S_OK) | |
| ok(IsEqualGUID(&class, &CLSID_DirectMusicSegment), | |
| "Expected class CLSID_DirectMusicSegment got %s\n", wine_dbgstr_guid(&class)); | |
| /* Unimplemented IPersistStream methods */ | |
| hr = IPersistStream_IsDirty(ps); | |
| ok(hr == S_FALSE, "IPersistStream_IsDirty failed: %08x\n", hr); | |
| hr = IPersistStream_GetSizeMax(ps, &size); | |
| ok(hr == E_NOTIMPL, "IPersistStream_GetSizeMax failed: %08x\n", hr); | |
| hr = IPersistStream_Save(ps, NULL, TRUE); | |
| ok(hr == E_NOTIMPL, "IPersistStream_Save failed: %08x\n", hr); | |
| while (IDirectMusicSegment_Release(dms)); | |
| } | |
| static void test_track(void) | |
| { | |
| IDirectMusicTrack *dmt; | |
| IDirectMusicTrack8 *dmt8; | |
| IPersistStream *ps; | |
| CLSID classid; | |
| ULARGE_INTEGER size; | |
| HRESULT hr; | |
| #define X(class) &CLSID_ ## class, #class | |
| const struct { | |
| REFCLSID clsid; | |
| const char *name; | |
| BOOL has_param; | |
| } class[] = { | |
| { X(DirectMusicLyricsTrack), TRUE }, | |
| { X(DirectMusicMarkerTrack), TRUE }, | |
| { X(DirectMusicParamControlTrack), TRUE }, | |
| { X(DirectMusicSegmentTriggerTrack), TRUE }, | |
| { X(DirectMusicSeqTrack), FALSE }, | |
| { X(DirectMusicSysExTrack), FALSE }, | |
| { X(DirectMusicTempoTrack), TRUE }, | |
| { X(DirectMusicTimeSigTrack), TRUE }, | |
| { X(DirectMusicWaveTrack), TRUE } | |
| }; | |
| #undef X | |
| unsigned int i; | |
| for (i = 0; i < ARRAY_SIZE(class); i++) { | |
| trace("Testing %s\n", class[i].name); | |
| hr = CoCreateInstance(class[i].clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicTrack, | |
| (void**)&dmt); | |
| ok(hr == S_OK, "%s create failed: %08x, expected S_OK\n", class[i].name, hr); | |
| /* IDirectMusicTrack */ | |
| if (!class[i].has_param) { | |
| hr = IDirectMusicTrack_GetParam(dmt, NULL, 0, NULL, NULL); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack_GetParam failed: %08x\n", hr); | |
| hr = IDirectMusicTrack_SetParam(dmt, NULL, 0, NULL); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack_SetParam failed: %08x\n", hr); | |
| hr = IDirectMusicTrack_IsParamSupported(dmt, NULL); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack_IsParamSupported failed: %08x\n", hr); | |
| } | |
| if (class[i].clsid != &CLSID_DirectMusicMarkerTrack && | |
| class[i].clsid != &CLSID_DirectMusicTimeSigTrack) { | |
| hr = IDirectMusicTrack_AddNotificationType(dmt, NULL); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack_AddNotificationType failed: %08x\n", hr); | |
| hr = IDirectMusicTrack_RemoveNotificationType(dmt, NULL); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack_RemoveNotificationType failed: %08x\n", hr); | |
| } | |
| hr = IDirectMusicTrack_Clone(dmt, 0, 0, NULL); | |
| todo_wine ok(hr == E_POINTER, "IDirectMusicTrack_Clone failed: %08x\n", hr); | |
| /* IDirectMusicTrack8 */ | |
| hr = IDirectMusicTrack_QueryInterface(dmt, &IID_IDirectMusicTrack8, (void**)&dmt8); | |
| if (hr == S_OK) { | |
| hr = IDirectMusicTrack8_PlayEx(dmt8, NULL, 0, 0, 0, 0, NULL, NULL, 0); | |
| todo_wine ok(hr == E_POINTER, "IDirectMusicTrack8_PlayEx failed: %08x\n", hr); | |
| if (!class[i].has_param) { | |
| hr = IDirectMusicTrack8_GetParamEx(dmt8, NULL, 0, NULL, NULL, NULL, 0); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack8_GetParamEx failed: %08x\n", hr); | |
| hr = IDirectMusicTrack8_SetParamEx(dmt8, NULL, 0, NULL, NULL, 0); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack8_SetParamEx failed: %08x\n", hr); | |
| } | |
| hr = IDirectMusicTrack8_Compose(dmt8, NULL, 0, NULL); | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack8_Compose failed: %08x\n", hr); | |
| hr = IDirectMusicTrack8_Join(dmt8, NULL, 0, NULL, 0, NULL); | |
| if (class[i].clsid == &CLSID_DirectMusicTempoTrack) | |
| todo_wine ok(hr == E_POINTER, "IDirectMusicTrack8_Join failed: %08x\n", hr); | |
| else | |
| ok(hr == E_NOTIMPL, "IDirectMusicTrack8_Join failed: %08x\n", hr); | |
| IDirectMusicTrack8_Release(dmt8); | |
| } | |
| /* IPersistStream */ | |
| hr = IDirectMusicTrack_QueryInterface(dmt, &IID_IPersistStream, (void**)&ps); | |
| ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); | |
| hr = IPersistStream_GetClassID(ps, &classid); | |
| ok(hr == S_OK, "IPersistStream_GetClassID failed: %08x\n", hr); | |
| ok(IsEqualGUID(&classid, class[i].clsid), | |
| "Expected class %s got %s\n", class[i].name, wine_dbgstr_guid(&classid)); | |
| hr = IPersistStream_IsDirty(ps); | |
| ok(hr == S_FALSE, "IPersistStream_IsDirty failed: %08x\n", hr); | |
| /* Unimplemented IPersistStream methods */ | |
| hr = IPersistStream_GetSizeMax(ps, &size); | |
| ok(hr == E_NOTIMPL, "IPersistStream_GetSizeMax failed: %08x\n", hr); | |
| hr = IPersistStream_Save(ps, NULL, TRUE); | |
| ok(hr == E_NOTIMPL, "IPersistStream_Save failed: %08x\n", hr); | |
| while (IDirectMusicTrack_Release(dmt)); | |
| } | |
| } | |
| START_TEST(dmime) | |
| { | |
| CoInitialize(NULL); | |
| if (missing_dmime()) | |
| { | |
| skip("dmime not available\n"); | |
| CoUninitialize(); | |
| return; | |
| } | |
| test_COM_audiopath(); | |
| test_COM_audiopathconfig(); | |
| test_COM_graph(); | |
| test_COM_segment(); | |
| test_COM_segmentstate(); | |
| test_COM_track(); | |
| test_audiopathconfig(); | |
| test_graph(); | |
| test_segment(); | |
| test_track(); | |
| CoUninitialize(); | |
| } |