diff --git a/Makefile b/Makefile index 622a878..5411712 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ FILES = src/IDirect3D/IDirect3D.c \ src/IDirectDraw/IDirectDrawPalette.c \ src/IDirectDraw/IDirectDrawClipper.c \ src/IDirectDraw/IDirectDrawSurface.c \ + src/IAMMediaStream/IAMMediaStream.c \ src/dd.c \ src/ddpalette.c \ src/ddsurface.c \ diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 88502e4..71c51a1 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -36,6 +36,7 @@ + @@ -63,6 +64,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 6dacdad..151ad93 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -22,6 +22,9 @@ {e6c62066-0a71-4531-ad9a-eb428abc6f44} + + {b6d5d0fc-844e-4068-8a1e-1b0386f359fc} + @@ -138,6 +141,9 @@ Source Files\IDirect3D + + Source Files\IAMMediaStream + @@ -230,6 +236,9 @@ Header Files + + Header Files + diff --git a/inc/IAMMediaStream.h b/inc/IAMMediaStream.h new file mode 100644 index 0000000..28ab588 --- /dev/null +++ b/inc/IAMMediaStream.h @@ -0,0 +1,46 @@ +#ifndef IAMMEDIASTREAM_H +#define IAMMEDIASTREAM_H + +#define WIN32_LEAN_AND_MEAN +#include + + +DEFINE_GUID(IID_IMediaStream, 0xb502d1bd, 0x9a57, 0x11d0, 0x8f, 0xde, 0x00, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); +DEFINE_GUID(IID_IAMMediaStream, 0xbebe595d, 0x9a6f, 0x11d0, 0x8f, 0xde, 0x00, 0xc0, 0x4f, 0xd9, 0x18, 0x9d); + +extern struct IAMMediaStreamImplVtbl g_ms_vtbl; + +struct IAMMediaStreamImpl; +struct IAMMediaStreamImplVtbl; + +typedef struct IAMMediaStreamImpl +{ + struct IAMMediaStreamImplVtbl* lpVtbl; + + ULONG ref; + +} IAMMediaStreamImpl; + +typedef struct IAMMediaStreamImplVtbl IAMMediaStreamImplVtbl; + +struct IAMMediaStreamImplVtbl +{ + HRESULT(__stdcall* QueryInterface) (IAMMediaStreamImpl*, const IID* const riid, LPVOID* ppvObj); + ULONG(__stdcall* AddRef) (IAMMediaStreamImpl*); + ULONG(__stdcall* Release) (IAMMediaStreamImpl*); + // IMediaStream + HRESULT(__stdcall* GetMultiMediaStream)(IAMMediaStreamImpl* This, int a); + HRESULT(__stdcall* GetInformation)(IAMMediaStreamImpl* This, int a, int b); + HRESULT(__stdcall* SetSameFormat)(IAMMediaStreamImpl* This, int a, int b); + HRESULT(__stdcall* AllocateSample)(IAMMediaStreamImpl* This, int a, int b); + HRESULT(__stdcall* CreateSharedSample)(IAMMediaStreamImpl* This, int a, int b, int c); + HRESULT(__stdcall* SendEndOfStream)(IAMMediaStreamImpl* This, int a); + // IAMMediaStream + HRESULT(__stdcall* Initialize)(IAMMediaStreamImpl* This, int a, int b, int c, int d); + HRESULT(__stdcall* SetState)(IAMMediaStreamImpl* This, int a); + HRESULT(__stdcall* JoinAMMultiMediaStream)(IAMMediaStreamImpl* This, int a); + HRESULT(__stdcall* JoinFilter)(IAMMediaStreamImpl* This, int a); + HRESULT(__stdcall* JoinFilterGraph)(IAMMediaStreamImpl* This, int a); +}; + +#endif diff --git a/src/IAMMediaStream/IAMMediaStream.c b/src/IAMMediaStream/IAMMediaStream.c new file mode 100644 index 0000000..d16d225 --- /dev/null +++ b/src/IAMMediaStream/IAMMediaStream.c @@ -0,0 +1,145 @@ +#include "IAMMediaStream.h" +#include "debug.h" + +HRESULT __stdcall IAMMediaStream__QueryInterface(IAMMediaStreamImpl* This, REFIID riid, void** obj) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +ULONG __stdcall IAMMediaStream__AddRef(IAMMediaStreamImpl* This) +{ + dprintf("-> %s(This=%p)\n", __FUNCTION__, This); + ULONG ret = ++This->ref; + dprintf("<- %s(This ref=%u)\n", __FUNCTION__, ret); + return ret; +} + +ULONG __stdcall IAMMediaStream__Release(IAMMediaStreamImpl* This) +{ + dprintf("-> %s(This=%p)\n", __FUNCTION__, This); + + ULONG ret = --This->ref; + + if (This->ref == 0) + { + dprintf(" Released (%p)\n", This); + + HeapFree(GetProcessHeap(), 0, This); + } + + dprintf("<- %s(This ref=%u)\n", __FUNCTION__, ret); + return ret; +} + +HRESULT WINAPI IAMMediaStream__GetMultiMediaStream(IAMMediaStreamImpl* This, int a) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__GetInformation(IAMMediaStreamImpl* This, int a, int b) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__SetSameFormat(IAMMediaStreamImpl* This, int a, int b) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__AllocateSample(IAMMediaStreamImpl* This, int a, int b) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__CreateSharedSample(IAMMediaStreamImpl* This, int a, int b, int c) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__SendEndOfStream(IAMMediaStreamImpl* This, int a) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +// IAMMediaStream +HRESULT WINAPI IAMMediaStream__Initialize(IAMMediaStreamImpl* This, int a, int b, int c, int d) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__SetState(IAMMediaStreamImpl* This, int a) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__JoinAMMultiMediaStream(IAMMediaStreamImpl* This, int a) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__JoinFilter(IAMMediaStreamImpl* This, int a) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +HRESULT WINAPI IAMMediaStream__JoinFilterGraph(IAMMediaStreamImpl* This, int a) +{ + dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; + dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + return ret; +} + +struct IAMMediaStreamImplVtbl g_ms_vtbl = +{ + /* IUnknown */ + IAMMediaStream__QueryInterface, + IAMMediaStream__AddRef, + IAMMediaStream__Release, + /* IMediaStream */ + IAMMediaStream__GetMultiMediaStream, + IAMMediaStream__GetInformation, + IAMMediaStream__SetSameFormat, + IAMMediaStream__AllocateSample, + IAMMediaStream__CreateSharedSample, + IAMMediaStream__SendEndOfStream, + /* IAMMediaStream */ + IAMMediaStream__Initialize, + IAMMediaStream__SetState, + IAMMediaStream__JoinAMMultiMediaStream, + IAMMediaStream__JoinFilter, + IAMMediaStream__JoinFilterGraph, +}; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 32753d4..c161082 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,6 +1,7 @@ #include #include "IDirectDraw.h" #include "IDirect3D.h" +#include "IAMMediaStream.h" #include "dd.h" #include "ddclipper.h" #include "ddpalette.h" @@ -95,12 +96,25 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else + else if (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid)) { - dprintf(" GUID = %08X\n", ((GUID*)riid)->Data1); + IAMMediaStreamImpl* ms = (IAMMediaStreamImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMediaStreamImpl)); + + dprintf(" GUID = %08X (IID_IXXMediaStream)\n", ((GUID*)riid)->Data1); + + ms->lpVtbl = &g_ms_vtbl; + ms->lpVtbl->AddRef(ms); + + *obj = ms; ret = S_OK; } + else + { + dprintf("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + + ret = E_FAIL; + } } dprintf("<- %s\n", __FUNCTION__);