[PATCH (try 3) 2/2] dpvoice: Turn GetCompressionTypes into a semi-stub.
Alex Henrie
alexhenrie24 at gmail.com
Fri Jan 16 01:44:24 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 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
More information about the wine-patches
mailing list