[PATCH (try 2) 2/2] dpvoice: Turn GetCompressionTypes into a semi-stub.

Alex Henrie alexhenrie24 at gmail.com
Thu Jan 15 05:55:19 CST 2015


Star Trek Armada II needs GetCompressionTypes to return at least one
value, see https://bugs.winehq.org/show_bug.cgi?id=29238

MS-PCM is guaranteed to be present on Windows XP, and it's already
implemented in Wine, so advertising this codec shouldn't cause any
trouble.
---
 dlls/dpvoice/client.c         |  5 +++--
 dlls/dpvoice/dvoice_private.h |  1 +
 dlls/dpvoice/server.c         | 43 +++++++++++++++++++++++++++++++++++++++++--
 dlls/dpvoice/tests/voice.c    |  6 ------
 4 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/dlls/dpvoice/client.c b/dlls/dpvoice/client.c
index 29b5336..bdae160 100644
--- a/dlls/dpvoice/client.c
+++ b/dlls/dpvoice/client.c
@@ -32,6 +32,7 @@
 #include "wine/debug.h"
 
 #include "dvoice.h"
+#include "dvoice_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dpvoice);
 
@@ -149,8 +150,8 @@ static HRESULT WINAPI dpvclient_GetCompressionTypes(IDirectPlayVoiceClient *ifac
                                 DWORD *pdwDataSize, DWORD *pdwNumElements, DWORD dwFlags)
 {
     IDirectPlayVoiceClientImpl *This = impl_from_IDirectPlayVoiceClient(iface);
-    FIXME("%p %p %p %p %d\n", This, pData, pdwDataSize, pdwNumElements, dwFlags);
-    return E_NOTIMPL;
+    FIXME("%p %p %p %p %d semi-stub\n", This, pData, pdwDataSize, pdwNumElements, dwFlags);
+    return DPVOICE_GetCompressionTypes(pData, pdwDataSize, pdwNumElements, dwFlags);
 }
 
 static HRESULT WINAPI dpvclient_SetTransmitTargets(IDirectPlayVoiceClient *iface, PDVID pdvIDTargets,
diff --git a/dlls/dpvoice/dvoice_private.h b/dlls/dpvoice/dvoice_private.h
index 5b0e57d..ededeab 100644
--- a/dlls/dpvoice/dvoice_private.h
+++ b/dlls/dpvoice/dvoice_private.h
@@ -23,5 +23,6 @@
 extern HRESULT DPVOICE_CreateDirectPlayVoiceClient(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppobj) DECLSPEC_HIDDEN;
 extern HRESULT DPVOICE_CreateDirectPlayVoiceServer(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppobj) DECLSPEC_HIDDEN;
 extern HRESULT DPVOICE_CreateDirectPlayVoiceTest(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppobj) DECLSPEC_HIDDEN;
+extern HRESULT DPVOICE_GetCompressionTypes(DVCOMPRESSIONINFO *pData, DWORD *pdwDataSize, DWORD *pdwNumElements, DWORD dwFlags) DECLSPEC_HIDDEN;
 
 #endif
diff --git a/dlls/dpvoice/server.c b/dlls/dpvoice/server.c
index e9291e2..80ef199 100644
--- a/dlls/dpvoice/server.c
+++ b/dlls/dpvoice/server.c
@@ -41,6 +41,45 @@ typedef struct IDirectPlayVoiceServerImpl
     LONG ref;
 } IDirectPlayVoiceServerImpl;
 
+HRESULT DPVOICE_GetCompressionTypes(DVCOMPRESSIONINFO *pData, DWORD *pdwDataSize, DWORD *pdwNumElements, DWORD dwFlags)
+{
+    static const DVCOMPRESSIONINFO pcm_type =
+        {80, {0x8de12fd4,0x7cb3,0x48ce,{0xa7,0xe8,0x9c,0x47,0xa2,0x2e,0x8a,0xc5}}, NULL, NULL, 0, 64000};
+    static const WCHAR pcm_name[] =
+        {'M','S','-','P','C','M',' ','6','4',' ','k','b','i','t','/','s',0};
+
+    HRESULT ret;
+    LPWSTR string_loc;
+
+    if (!pdwDataSize || !pdwNumElements)
+        return DVERR_INVALIDPOINTER;
+
+    if (dwFlags)
+        return DVERR_INVALIDFLAGS;
+
+    *pdwNumElements = 1;
+
+    if (*pdwDataSize < sizeof(pcm_type) + sizeof(pcm_name))
+    {
+        ret = DVERR_BUFFERTOOSMALL;
+    }
+    else if (!pData)
+    {
+        ret = DVERR_INVALIDPOINTER;
+    }
+    else
+    {
+        string_loc = (LPWSTR)((char*)pData + sizeof(pcm_type));
+        memcpy(pData, &pcm_type, sizeof(pcm_type));
+        memcpy(string_loc, pcm_name, sizeof(pcm_name));
+        pData->lpszName = string_loc;
+        ret = DV_OK;
+    }
+
+    *pdwDataSize = sizeof(pcm_type) + sizeof(pcm_name);
+    return ret;
+}
+
 static inline IDirectPlayVoiceServerImpl *impl_from_IDirectPlayVoiceServer(IDirectPlayVoiceServer *iface)
 {
     return CONTAINING_RECORD(iface, IDirectPlayVoiceServerImpl, IDirectPlayVoiceServer_iface);
@@ -130,8 +169,8 @@ static HRESULT WINAPI dpvserver_GetCompressionTypes(IDirectPlayVoiceServer *ifac
                                 DWORD *pdwNumElements, DWORD dwFlags)
 {
     IDirectPlayVoiceServerImpl *This = impl_from_IDirectPlayVoiceServer(iface);
-    FIXME("%p %p %p %p %d\n", This, pData, pdwDataSize, pdwNumElements, dwFlags);
-    return E_NOTIMPL;
+    FIXME("%p %p %p %p %d semi-stub\n", This, pData, pdwDataSize, pdwNumElements, dwFlags);
+    return DPVOICE_GetCompressionTypes(pData, pdwDataSize, pdwNumElements, dwFlags);
 }
 
 static HRESULT WINAPI dpvserver_SetTransmitTargets(IDirectPlayVoiceServer *iface, DVID dvSource, PDVID pdvIDTargets,
diff --git a/dlls/dpvoice/tests/voice.c b/dlls/dpvoice/tests/voice.c
index 44cac27..5ae4af2 100644
--- a/dlls/dpvoice/tests/voice.c
+++ b/dlls/dpvoice/tests/voice.c
@@ -417,12 +417,6 @@ static void test_GetCompressionTypes(HRESULT (__stdcall *GetCompressionTypes)(vo
         { 0 /* initialized later */, 0, 0, DV_OK }
     };
 
-    if(GetCompressionTypes(iface, NULL, NULL, NULL, 0) == E_NOTIMPL)
-    {
-        skip("%s: GetCompressionTypes not implemented\n", name);
-        return;
-    }
-
     data_size = 0;
     ret = GetCompressionTypes(iface, NULL, &data_size, &num_elements, 0);
     ok(ret == DVERR_BUFFERTOOSMALL,
-- 
2.2.2




More information about the wine-patches mailing list