From: Alex Henrie Subject: [PATCH (try 3) 2/2] dpvoice: Turn GetCompressionTypes into a semi-stub. Message-Id: <1421394264-24730-2-git-send-email-alexhenrie24@gmail.com> Date: Fri, 16 Jan 2015 00:44:24 -0700 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 2d9d63e..518cc0b 100644 --- a/dlls/dpvoice/tests/voice.c +++ b/dlls/dpvoice/tests/voice.c @@ -416,12 +416,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