[PATCH] dmsynth: Implement IKsControl_KsProperty for Synth and SynthSink objects.

Christian Costa titan.costa at gmail.com
Fri Sep 21 08:44:37 CDT 2012


---
 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);




More information about the wine-patches mailing list