Module: wine Branch: master Commit: b3b7616f79c30b846e4ce7a30ceba88543eb6683 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3b7616f79c30b846e4ce7a30c...
Author: Christian Costa titan.costa@gmail.com Date: Fri Sep 21 15:44:37 2012 +0200
dmsynth: Implement IKsControl_KsProperty for Synth and SynthSink objects.
---
dlls/dmsynth/synth.c | 48 ++++++++++++++++++++++++++++++++++++++++- dlls/dmsynth/synthsink.c | 28 ++++++++++++++++++++++- dlls/dmsynth/tests/dmsynth.c | 39 ++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 4 deletions(-)
diff --git a/dlls/dmsynth/synth.c b/dlls/dmsynth/synth.c index 29761d7..f34594d 100644 --- a/dlls/dmsynth/synth.c +++ b/dlls/dmsynth/synth.c @@ -2,6 +2,7 @@ * IDirectMusicSynth8 Implementation * * Copyright (C) 2003-2004 Rok Mandeljc + * Copyright (C) 2012 Christian Costa * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -415,9 +416,52 @@ static ULONG WINAPI DMSynthImpl_IKsControl_Release(IKsControl* iface) static HRESULT WINAPI DMSynthImpl_IKsControl_KsProperty(IKsControl* iface, PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned) { - FIXME("(%p)->(%p, %u, %p, %u, %p): stub\n", iface, Property, PropertyLength, PropertyData, DataLength, BytesReturned); + TRACE("(%p)->(%p, %u, %p, %u, %p)\n", iface, Property, PropertyLength, PropertyData, DataLength, BytesReturned);
- return E_NOTIMPL; + TRACE("Property = %s - %u - %u\n", debugstr_guid(&Property->Set), Property->Id, Property->Flags); + + if (Property->Flags != KSPROPERTY_TYPE_GET) + { + FIXME("Property flags %u not yet supported\n", Property->Flags); + return S_FALSE; + } + + if (DataLength < sizeof(DWORD)) + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + + if (IsEqualGUID(&Property->Set, &GUID_DMUS_PROP_INSTRUMENT2)) + { + *(DWORD*)PropertyData = TRUE; + *BytesReturned = sizeof(DWORD); + } + else if (IsEqualGUID(&Property->Set, &GUID_DMUS_PROP_DLS2)) + { + *(DWORD*)PropertyData = TRUE; + *BytesReturned = sizeof(DWORD); + } + else if (IsEqualGUID(&Property->Set, &GUID_DMUS_PROP_GM_Hardware)) + { + *(DWORD*)PropertyData = FALSE; + *BytesReturned = sizeof(DWORD); + } + else if (IsEqualGUID(&Property->Set, &GUID_DMUS_PROP_GS_Hardware)) + { + *(DWORD*)PropertyData = FALSE; + *BytesReturned = sizeof(DWORD); + } + else if (IsEqualGUID(&Property->Set, &GUID_DMUS_PROP_XG_Hardware)) + { + *(DWORD*)PropertyData = FALSE; + *BytesReturned = sizeof(DWORD); + } + else + { + FIXME("Unknown property %s\n", debugstr_guid(&Property->Set)); + *(DWORD*)PropertyData = FALSE; + *BytesReturned = sizeof(DWORD); + } + + return S_OK; }
static HRESULT WINAPI DMSynthImpl_IKsControl_KsMethod(IKsControl* iface, PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, diff --git a/dlls/dmsynth/synthsink.c b/dlls/dmsynth/synthsink.c index a63f36c..4d2001c 100644 --- a/dlls/dmsynth/synthsink.c +++ b/dlls/dmsynth/synthsink.c @@ -2,6 +2,7 @@ * IDirectMusicSynthSink Implementation * * Copyright (C) 2003-2004 Rok Mandeljc + * Copyright (C) 2012 Christian Costa * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -209,9 +210,32 @@ static ULONG WINAPI DMSynthSinkImpl_IKsControl_Release(IKsControl* iface) static HRESULT WINAPI DMSynthSinkImpl_IKsControl_KsProperty(IKsControl* iface, PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned) { - FIXME("(%p)->(%p, %u, %p, %u, %p): stub\n", iface, Property, PropertyLength, PropertyData, DataLength, BytesReturned); + TRACE("(%p)->(%p, %u, %p, %u, %p)\n", iface, Property, PropertyLength, PropertyData, DataLength, BytesReturned);
- return E_NOTIMPL; + TRACE("Property = %s - %u - %u\n", debugstr_guid(&Property->Set), Property->Id, Property->Flags); + + if (Property->Flags != KSPROPERTY_TYPE_GET) + { + FIXME("Property flags %u not yet supported\n", Property->Flags); + return S_FALSE; + } + + if (DataLength < sizeof(DWORD)) + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + + if (IsEqualGUID(&Property->Set, &GUID_DMUS_PROP_SinkUsesDSound)) + { + *(DWORD*)PropertyData = TRUE; + *BytesReturned = sizeof(DWORD); + } + else + { + FIXME("Unknown property %s\n", debugstr_guid(&Property->Set)); + *(DWORD*)PropertyData = FALSE; + *BytesReturned = sizeof(DWORD); + } + + return S_OK; }
static HRESULT WINAPI DMSynthSinkImpl_IKsControl_KsMethod(IKsControl* iface, PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, diff --git a/dlls/dmsynth/tests/dmsynth.c b/dlls/dmsynth/tests/dmsynth.c index 4ffc90c..83a0bca 100644 --- a/dlls/dmsynth/tests/dmsynth.c +++ b/dlls/dmsynth/tests/dmsynth.c @@ -39,6 +39,9 @@ static void test_dmsynth(void) IKsControl* control_synth = NULL; IKsControl* control_sink = NULL; HRESULT hr; + KSPROPERTY property; + ULONG value; + ULONG bytes;
hr = CoCreateInstance(&CLSID_DirectMusicSynth, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynth, (LPVOID*)&dmsynth); if (hr != S_OK) @@ -52,9 +55,45 @@ static void test_dmsynth(void)
hr = IDirectMusicSynth_QueryInterface(dmsynth, &IID_IKsControl, (LPVOID*)&control_synth); ok(hr == S_OK, "IDirectMusicSynth_QueryInterface returned: %x\n", hr); + + property.Id = 0; + property.Flags = KSPROPERTY_TYPE_GET; + + property.Set = GUID_DMUS_PROP_INSTRUMENT2; + hr = IKsControl_KsProperty(control_synth, &property, sizeof(property), &value, sizeof(value), &bytes); + ok(hr == S_OK, "IKsControl_KsProperty returned: %x\n", hr); + ok(bytes == sizeof(DWORD), "Returned bytes: %u, should be 4\n", bytes); + ok(value == TRUE, "Return value: %u, should be 1\n", value); + property.Set = GUID_DMUS_PROP_DLS2; + hr = IKsControl_KsProperty(control_synth, &property, sizeof(property), &value, sizeof(value), &bytes); + ok(hr == S_OK, "IKsControl_KsProperty returned: %x\n", hr); + ok(bytes == sizeof(DWORD), "Returned bytes: %u, should be 4\n", bytes); + ok(value == TRUE, "Return value: %u, should be 1\n", value); + property.Set = GUID_DMUS_PROP_GM_Hardware; + hr = IKsControl_KsProperty(control_synth, &property, sizeof(property), &value, sizeof(value), &bytes); + ok(hr == S_OK, "IKsControl_KsProperty returned: %x\n", hr); + ok(bytes == sizeof(DWORD), "Returned bytes: %u, should be 4\n", bytes); + ok(value == FALSE, "Return value: %u, should be 0\n", value); + property.Set = GUID_DMUS_PROP_GS_Hardware; + hr = IKsControl_KsProperty(control_synth, &property, sizeof(property), &value, sizeof(value), &bytes); + ok(hr == S_OK, "IKsControl_KsProperty returned: %x\n", hr); + ok(bytes == sizeof(DWORD), "Returned bytes: %u, should be 4\n", bytes); + ok(value == FALSE, "Return value: %u, should be 0\n", value); + property.Set = GUID_DMUS_PROP_XG_Hardware; + hr = IKsControl_KsProperty(control_synth, &property, sizeof(property), &value, sizeof(value), &bytes); + ok(hr == S_OK, "IKsControl_KsProperty returned: %x\n", hr); + ok(bytes == sizeof(DWORD), "Returned bytes: %u, should be 4\n", bytes); + ok(value == FALSE, "Return value: %u, should be 0\n", value); + hr = IDirectMusicSynthSink_QueryInterface(dmsynth_sink, &IID_IKsControl, (LPVOID*)&control_sink); ok(hr == S_OK, "IDirectMusicSynthSink_QueryInterface returned: %x\n", hr);
+ property.Set = GUID_DMUS_PROP_SinkUsesDSound; + hr = IKsControl_KsProperty(control_sink, &property, sizeof(property), &value, sizeof(value), &bytes); + ok(hr == S_OK, "IKsControl_KsProperty returned: %x\n", hr); + ok(bytes == sizeof(DWORD), "Returned bytes: %u, should be 4\n", bytes); + ok(value == TRUE, "Return value: %u, should be 1\n", value); + /* Synth has no default clock */ hr = IDirectMusicSynth_GetLatencyClock(dmsynth, &clock_synth); ok(hr == DMUS_E_NOSYNTHSINK, "IDirectMusicSynth_GetLatencyClock returned: %x\n", hr);