mirror of
https://github.com/reactos/wine.git
synced 2025-02-16 10:59:45 +00:00
dmime: COM cleanup of IDirectMusicGraph interface.
This commit is contained in:
parent
0eb626587b
commit
91ee56769c
@ -137,23 +137,6 @@ struct IDirectMusicSegment8Impl {
|
||||
struct list Tracks;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectMusicGraphImpl implementation structure
|
||||
*/
|
||||
struct IDirectMusicGraphImpl {
|
||||
/* IUnknown fields */
|
||||
const IUnknownVtbl *UnknownVtbl;
|
||||
const IDirectMusicGraphVtbl *GraphVtbl;
|
||||
const IDirectMusicObjectVtbl *ObjectVtbl;
|
||||
const IPersistStreamVtbl *PersistStreamVtbl;
|
||||
LONG ref;
|
||||
|
||||
/* IDirectMusicGraphImpl fields */
|
||||
LPDMUS_OBJECTDESC pDesc;
|
||||
WORD num_tools;
|
||||
struct list Tools;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectMusicAudioPathImpl implementation structure
|
||||
*/
|
||||
|
@ -22,242 +22,251 @@
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
|
||||
WINE_DECLARE_DEBUG_CHANNEL(dmfile);
|
||||
|
||||
/*****************************************************************************
|
||||
* IDirectMusicGraphImpl implementation
|
||||
*/
|
||||
/* IDirectMusicGraphImpl IUnknown part: */
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, UnknownVtbl, iface);
|
||||
TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj);
|
||||
|
||||
if (IsEqualIID (riid, &IID_IUnknown)) {
|
||||
*ppobj = &This->UnknownVtbl;
|
||||
IUnknown_AddRef (iface);
|
||||
return S_OK;
|
||||
} else if (IsEqualIID (riid, &IID_IDirectMusicGraph)) {
|
||||
*ppobj = &This->GraphVtbl;
|
||||
IUnknown_AddRef (iface);
|
||||
return S_OK;
|
||||
} else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
|
||||
*ppobj = &This->ObjectVtbl;
|
||||
IUnknown_AddRef (iface);
|
||||
return S_OK;
|
||||
} else if (IsEqualIID (riid, &IID_IPersistStream)) {
|
||||
*ppobj = &This->PersistStreamVtbl;
|
||||
IUnknown_AddRef (iface);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
WARN("(%p, %s, %p): not found\n", This, debugstr_guid(riid), ppobj);
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
struct IDirectMusicGraphImpl {
|
||||
IDirectMusicGraph IDirectMusicGraph_iface;
|
||||
IDirectMusicObject IDirectMusicObject_iface;
|
||||
IPersistStream IPersistStream_iface;
|
||||
LONG ref;
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IUnknown_AddRef (LPUNKNOWN iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, UnknownVtbl, iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("(%p): AddRef from %d\n", This, ref - 1);
|
||||
|
||||
DMIME_LockModule();
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IUnknown_Release (LPUNKNOWN iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, UnknownVtbl, iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
TRACE("(%p): ReleaseRef to %d\n", This, ref);
|
||||
|
||||
if (ref == 0) {
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
DMIME_UnlockModule();
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
||||
static const IUnknownVtbl DirectMusicGraph_Unknown_Vtbl = {
|
||||
IDirectMusicGraphImpl_IUnknown_QueryInterface,
|
||||
IDirectMusicGraphImpl_IUnknown_AddRef,
|
||||
IDirectMusicGraphImpl_IUnknown_Release
|
||||
/* IDirectMusicGraphImpl fields */
|
||||
LPDMUS_OBJECTDESC pDesc;
|
||||
WORD num_tools;
|
||||
struct list Tools;
|
||||
};
|
||||
|
||||
/* IDirectMusicGraphImpl IDirectMusicGraph part: */
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicGraph_QueryInterface (LPDIRECTMUSICGRAPH iface, REFIID riid, LPVOID *ppobj) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, GraphVtbl, iface);
|
||||
return IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
|
||||
static inline IDirectMusicGraphImpl *impl_from_IDirectMusicGraph(IDirectMusicGraph *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectMusicGraphImpl, IDirectMusicGraph_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IDirectMusicGraph_AddRef (LPDIRECTMUSICGRAPH iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, GraphVtbl, iface);
|
||||
return IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
|
||||
static inline IDirectMusicGraphImpl *impl_from_IDirectMusicObject(IDirectMusicObject *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectMusicGraphImpl, IDirectMusicObject_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IDirectMusicGraph_Release (LPDIRECTMUSICGRAPH iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, GraphVtbl, iface);
|
||||
return IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
|
||||
static inline IDirectMusicGraphImpl *impl_from_IPersistStream(IPersistStream *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectMusicGraphImpl, IPersistStream_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicGraph_StampPMsg (LPDIRECTMUSICGRAPH iface, DMUS_PMSG* pPMSG) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, GraphVtbl, iface);
|
||||
FIXME("(%p, %p): stub\n", This, pPMSG);
|
||||
return S_OK;
|
||||
}
|
||||
static HRESULT WINAPI DirectMusicGraph_QueryInterface(IDirectMusicGraph *iface, REFIID riid, void **ret_iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicGraph(iface);
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicGraph_InsertTool (LPDIRECTMUSICGRAPH iface, IDirectMusicTool* pTool, DWORD* pdwPChannels, DWORD cPChannels, LONG lIndex) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, GraphVtbl, iface);
|
||||
TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ret_iface);
|
||||
|
||||
struct list* pEntry = NULL;
|
||||
struct list* pPrevEntry = NULL;
|
||||
LPDMUS_PRIVATE_GRAPH_TOOL pIt = NULL;
|
||||
LPDMUS_PRIVATE_GRAPH_TOOL pNewTool = NULL;
|
||||
*ret_iface = NULL;
|
||||
|
||||
|
||||
FIXME("(%p, %p, %p, %d, %i): use of pdwPChannels\n", This, pTool, pdwPChannels, cPChannels, lIndex);
|
||||
|
||||
if (NULL == pTool) {
|
||||
return E_POINTER;
|
||||
}
|
||||
|
||||
if (0 > lIndex) {
|
||||
lIndex = This->num_tools + lIndex;
|
||||
}
|
||||
|
||||
pPrevEntry = &This->Tools;
|
||||
LIST_FOR_EACH (pEntry, &This->Tools) {
|
||||
pIt = LIST_ENTRY(pEntry, DMUS_PRIVATE_GRAPH_TOOL, entry);
|
||||
if (pIt->dwIndex == lIndex) {
|
||||
return DMUS_E_ALREADY_EXISTS;
|
||||
if (IsEqualIID(riid, &IID_IUnknown) ||
|
||||
IsEqualIID(riid, &IID_IDirectMusicGraph))
|
||||
{
|
||||
*ret_iface = &This->IDirectMusicGraph_iface;
|
||||
}
|
||||
if (pIt->dwIndex > lIndex) {
|
||||
break ;
|
||||
}
|
||||
pPrevEntry = pEntry;
|
||||
}
|
||||
else if (IsEqualIID(riid, &IID_IDirectMusicObject))
|
||||
*ret_iface = &This->IDirectMusicObject_iface;
|
||||
else if (IsEqualIID(riid, &IID_IPersistStream))
|
||||
*ret_iface = &This->IPersistStream_iface;
|
||||
|
||||
++This->num_tools;
|
||||
pNewTool = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_GRAPH_TOOL));
|
||||
pNewTool->pTool = pTool;
|
||||
pNewTool->dwIndex = lIndex;
|
||||
IDirectMusicTool8_AddRef(pTool);
|
||||
IDirectMusicTool8_Init(pTool, iface);
|
||||
list_add_tail (pPrevEntry->next, &pNewTool->entry);
|
||||
if (*ret_iface)
|
||||
{
|
||||
IDirectMusicGraph_AddRef(iface);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
WARN("(%p, %s, %p): not found\n", This, debugstr_guid(riid), ret_iface);
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI DirectMusicGraph_AddRef(IDirectMusicGraph *iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicGraph(iface);
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
||||
TRACE("(%p): %d\n", This, ref);
|
||||
|
||||
DMIME_LockModule();
|
||||
return ref;
|
||||
}
|
||||
|
||||
static ULONG WINAPI DirectMusicGraph_Release(IDirectMusicGraph *iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicGraph(iface);
|
||||
ULONG ref = InterlockedDecrement(&This->ref);
|
||||
|
||||
TRACE("(%p): %d\n", This, ref);
|
||||
|
||||
if (ref == 0)
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
|
||||
DMIME_UnlockModule();
|
||||
return ref;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI DirectMusicGraph_StampPMsg(IDirectMusicGraph *iface, DMUS_PMSG *msg)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicGraph(iface);
|
||||
FIXME("(%p, %p): stub\n", This, msg);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI DirectMusicGraph_InsertTool(IDirectMusicGraph *iface, IDirectMusicTool* pTool, DWORD* pdwPChannels, DWORD cPChannels, LONG lIndex)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicGraph(iface);
|
||||
struct list* pEntry = NULL;
|
||||
struct list* pPrevEntry = NULL;
|
||||
LPDMUS_PRIVATE_GRAPH_TOOL pIt = NULL;
|
||||
LPDMUS_PRIVATE_GRAPH_TOOL pNewTool = NULL;
|
||||
|
||||
FIXME("(%p, %p, %p, %d, %i): use of pdwPChannels\n", This, pTool, pdwPChannels, cPChannels, lIndex);
|
||||
|
||||
if (!pTool)
|
||||
return E_POINTER;
|
||||
|
||||
if (lIndex < 0)
|
||||
lIndex = This->num_tools + lIndex;
|
||||
|
||||
pPrevEntry = &This->Tools;
|
||||
LIST_FOR_EACH(pEntry, &This->Tools)
|
||||
{
|
||||
pIt = LIST_ENTRY(pEntry, DMUS_PRIVATE_GRAPH_TOOL, entry);
|
||||
if (pIt->dwIndex == lIndex)
|
||||
return DMUS_E_ALREADY_EXISTS;
|
||||
|
||||
if (pIt->dwIndex > lIndex)
|
||||
break ;
|
||||
pPrevEntry = pEntry;
|
||||
}
|
||||
|
||||
++This->num_tools;
|
||||
pNewTool = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_GRAPH_TOOL));
|
||||
pNewTool->pTool = pTool;
|
||||
pNewTool->dwIndex = lIndex;
|
||||
IDirectMusicTool8_AddRef(pTool);
|
||||
IDirectMusicTool8_Init(pTool, iface);
|
||||
list_add_tail (pPrevEntry->next, &pNewTool->entry);
|
||||
|
||||
#if 0
|
||||
DWORD dwNum = 0;
|
||||
IDirectMusicTool8_GetMediaTypes(pTool, &dwNum);
|
||||
#endif
|
||||
|
||||
return DS_OK;
|
||||
return DS_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicGraph_GetTool (LPDIRECTMUSICGRAPH iface, DWORD dwIndex, IDirectMusicTool** ppTool) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, GraphVtbl, iface);
|
||||
struct list* pEntry = NULL;
|
||||
LPDMUS_PRIVATE_GRAPH_TOOL pIt = NULL;
|
||||
static HRESULT WINAPI DirectMusicGraph_GetTool(IDirectMusicGraph *iface, DWORD dwIndex, IDirectMusicTool** ppTool)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicGraph(iface);
|
||||
struct list* pEntry = NULL;
|
||||
LPDMUS_PRIVATE_GRAPH_TOOL pIt = NULL;
|
||||
|
||||
FIXME("(%p, %d, %p): stub\n", This, dwIndex, ppTool);
|
||||
FIXME("(%p, %d, %p): stub\n", This, dwIndex, ppTool);
|
||||
|
||||
LIST_FOR_EACH (pEntry, &This->Tools) {
|
||||
pIt = LIST_ENTRY(pEntry, DMUS_PRIVATE_GRAPH_TOOL, entry);
|
||||
if (pIt->dwIndex == dwIndex) {
|
||||
*ppTool = pIt->pTool;
|
||||
if (NULL != *ppTool) {
|
||||
IDirectMusicTool8_AddRef((LPDIRECTMUSICTOOL8) *ppTool);
|
||||
}
|
||||
return S_OK;
|
||||
LIST_FOR_EACH (pEntry, &This->Tools)
|
||||
{
|
||||
pIt = LIST_ENTRY(pEntry, DMUS_PRIVATE_GRAPH_TOOL, entry);
|
||||
if (pIt->dwIndex == dwIndex)
|
||||
{
|
||||
*ppTool = pIt->pTool;
|
||||
if (*ppTool)
|
||||
IDirectMusicTool_AddRef(*ppTool);
|
||||
return S_OK;
|
||||
}
|
||||
if (pIt->dwIndex > dwIndex)
|
||||
break ;
|
||||
}
|
||||
if (pIt->dwIndex > dwIndex) {
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
return DMUS_E_NOT_FOUND;
|
||||
return DMUS_E_NOT_FOUND;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicGraph_RemoveTool (LPDIRECTMUSICGRAPH iface, IDirectMusicTool* pTool) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, GraphVtbl, iface);
|
||||
FIXME("(%p, %p): stub\n", This, pTool);
|
||||
return S_OK;
|
||||
static HRESULT WINAPI DirectMusicGraph_RemoveTool(IDirectMusicGraph *iface, IDirectMusicTool* pTool)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicGraph(iface);
|
||||
FIXME("(%p, %p): stub\n", This, pTool);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const IDirectMusicGraphVtbl DirectMusicGraph_Graph_Vtbl = {
|
||||
IDirectMusicGraphImpl_IDirectMusicGraph_QueryInterface,
|
||||
IDirectMusicGraphImpl_IDirectMusicGraph_AddRef,
|
||||
IDirectMusicGraphImpl_IDirectMusicGraph_Release,
|
||||
IDirectMusicGraphImpl_IDirectMusicGraph_StampPMsg,
|
||||
IDirectMusicGraphImpl_IDirectMusicGraph_InsertTool,
|
||||
IDirectMusicGraphImpl_IDirectMusicGraph_GetTool,
|
||||
IDirectMusicGraphImpl_IDirectMusicGraph_RemoveTool
|
||||
static const IDirectMusicGraphVtbl DirectMusicGraphVtbl =
|
||||
{
|
||||
DirectMusicGraph_QueryInterface,
|
||||
DirectMusicGraph_AddRef,
|
||||
DirectMusicGraph_Release,
|
||||
DirectMusicGraph_StampPMsg,
|
||||
DirectMusicGraph_InsertTool,
|
||||
DirectMusicGraph_GetTool,
|
||||
DirectMusicGraph_RemoveTool
|
||||
};
|
||||
|
||||
|
||||
/* IDirectMusicGraphImpl IDirectMusicObject part: */
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicObject_QueryInterface (LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ppobj) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, ObjectVtbl, iface);
|
||||
return IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
|
||||
static HRESULT WINAPI DirectMusicObject_QueryInterface(IDirectMusicObject *iface, REFIID riid, void **ret_iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicObject(iface);
|
||||
return IDirectMusicGraph_QueryInterface(&This->IDirectMusicGraph_iface, riid, ret_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, ObjectVtbl, iface);
|
||||
return IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
|
||||
static ULONG WINAPI DirectMusicObject_AddRef(IDirectMusicObject *iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicObject(iface);
|
||||
return IDirectMusicGraph_AddRef(&This->IDirectMusicGraph_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IDirectMusicObject_Release (LPDIRECTMUSICOBJECT iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, ObjectVtbl, iface);
|
||||
return IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
|
||||
static ULONG WINAPI DirectMusicObject_Release(IDirectMusicObject *iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicObject(iface);
|
||||
return IDirectMusicGraph_Release(&This->IDirectMusicGraph_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicObject_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, ObjectVtbl, iface);
|
||||
TRACE("(%p, %p)\n", This, pDesc);
|
||||
/* I think we shouldn't return pointer here since then values can be changed; it'd be a mess */
|
||||
memcpy (pDesc, This->pDesc, This->pDesc->dwSize);
|
||||
return S_OK;
|
||||
static HRESULT WINAPI DirectMusicObject_GetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *desc)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicObject(iface);
|
||||
TRACE("(%p, %p)\n", This, desc);
|
||||
/* I think we shouldn't return pointer here since then values can be changed; it'd be a mess */
|
||||
memcpy(desc, This->pDesc, This->pDesc->dwSize);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicObject_SetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, ObjectVtbl, iface);
|
||||
TRACE("(%p, %p): setting descriptor:\n%s\n", This, pDesc, debugstr_DMUS_OBJECTDESC (pDesc));
|
||||
static HRESULT WINAPI DirectMusicObject_SetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *pDesc)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicObject(iface);
|
||||
|
||||
/* According to MSDN, we should copy only given values, not whole struct */
|
||||
if (pDesc->dwValidData & DMUS_OBJ_OBJECT)
|
||||
This->pDesc->guidObject = pDesc->guidObject;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_CLASS)
|
||||
This->pDesc->guidClass = pDesc->guidClass;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_NAME)
|
||||
lstrcpynW (This->pDesc->wszName, pDesc->wszName, DMUS_MAX_NAME);
|
||||
if (pDesc->dwValidData & DMUS_OBJ_CATEGORY)
|
||||
lstrcpynW (This->pDesc->wszCategory, pDesc->wszCategory, DMUS_MAX_CATEGORY);
|
||||
if (pDesc->dwValidData & DMUS_OBJ_FILENAME)
|
||||
lstrcpynW (This->pDesc->wszFileName, pDesc->wszFileName, DMUS_MAX_FILENAME);
|
||||
if (pDesc->dwValidData & DMUS_OBJ_VERSION)
|
||||
This->pDesc->vVersion = pDesc->vVersion;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_DATE)
|
||||
This->pDesc->ftDate = pDesc->ftDate;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_MEMORY) {
|
||||
This->pDesc->llMemLength = pDesc->llMemLength;
|
||||
memcpy (This->pDesc->pbMemData, pDesc->pbMemData, pDesc->llMemLength);
|
||||
}
|
||||
if (pDesc->dwValidData & DMUS_OBJ_STREAM) {
|
||||
/* according to MSDN, we copy the stream */
|
||||
IStream_Clone (pDesc->pStream, &This->pDesc->pStream);
|
||||
}
|
||||
|
||||
/* add new flags */
|
||||
This->pDesc->dwValidData |= pDesc->dwValidData;
|
||||
TRACE("(%p, %p): %s\n", This, pDesc, debugstr_DMUS_OBJECTDESC(pDesc));
|
||||
|
||||
return S_OK;
|
||||
/* According to MSDN, we should copy only given values, not whole struct */
|
||||
if (pDesc->dwValidData & DMUS_OBJ_OBJECT)
|
||||
This->pDesc->guidObject = pDesc->guidObject;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_CLASS)
|
||||
This->pDesc->guidClass = pDesc->guidClass;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_NAME)
|
||||
lstrcpynW (This->pDesc->wszName, pDesc->wszName, DMUS_MAX_NAME);
|
||||
if (pDesc->dwValidData & DMUS_OBJ_CATEGORY)
|
||||
lstrcpynW (This->pDesc->wszCategory, pDesc->wszCategory, DMUS_MAX_CATEGORY);
|
||||
if (pDesc->dwValidData & DMUS_OBJ_FILENAME)
|
||||
lstrcpynW (This->pDesc->wszFileName, pDesc->wszFileName, DMUS_MAX_FILENAME);
|
||||
if (pDesc->dwValidData & DMUS_OBJ_VERSION)
|
||||
This->pDesc->vVersion = pDesc->vVersion;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_DATE)
|
||||
This->pDesc->ftDate = pDesc->ftDate;
|
||||
if (pDesc->dwValidData & DMUS_OBJ_MEMORY)
|
||||
{
|
||||
This->pDesc->llMemLength = pDesc->llMemLength;
|
||||
memcpy(This->pDesc->pbMemData, pDesc->pbMemData, pDesc->llMemLength);
|
||||
}
|
||||
|
||||
/* according to MSDN, we copy the stream */
|
||||
if (pDesc->dwValidData & DMUS_OBJ_STREAM)
|
||||
IStream_Clone(pDesc->pStream, &This->pDesc->pStream);
|
||||
|
||||
/* add new flags */
|
||||
This->pDesc->dwValidData |= pDesc->dwValidData;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicObject_ParseDescriptor (LPDIRECTMUSICOBJECT iface, LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, ObjectVtbl, iface);
|
||||
DMUS_PRIVATE_CHUNK Chunk;
|
||||
DWORD StreamSize, StreamCount, ListSize[1], ListCount[1];
|
||||
LARGE_INTEGER liMove; /* used when skipping chunks */
|
||||
static HRESULT WINAPI DirectMusicObject_ParseDescriptor(IDirectMusicObject *iface, IStream *pStream, DMUS_OBJECTDESC *pDesc)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IDirectMusicObject(iface);
|
||||
DMUS_PRIVATE_CHUNK Chunk;
|
||||
DWORD StreamSize, StreamCount, ListSize[1], ListCount[1];
|
||||
LARGE_INTEGER liMove; /* used when skipping chunks */
|
||||
|
||||
TRACE("(%p, %p, %p)\n", This, pStream, pDesc);
|
||||
TRACE("(%p, %p, %p)\n", This, pStream, pDesc);
|
||||
|
||||
/* FIXME: should this be determined from stream? */
|
||||
pDesc->dwValidData |= DMUS_OBJ_CLASS;
|
||||
@ -399,41 +408,51 @@ static HRESULT WINAPI IDirectMusicGraphImpl_IDirectMusicObject_ParseDescriptor (
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const IDirectMusicObjectVtbl DirectMusicGraph_Object_Vtbl = {
|
||||
IDirectMusicGraphImpl_IDirectMusicObject_QueryInterface,
|
||||
IDirectMusicGraphImpl_IDirectMusicObject_AddRef,
|
||||
IDirectMusicGraphImpl_IDirectMusicObject_Release,
|
||||
IDirectMusicGraphImpl_IDirectMusicObject_GetDescriptor,
|
||||
IDirectMusicGraphImpl_IDirectMusicObject_SetDescriptor,
|
||||
IDirectMusicGraphImpl_IDirectMusicObject_ParseDescriptor
|
||||
static const IDirectMusicObjectVtbl DirectMusicObjectVtbl =
|
||||
{
|
||||
DirectMusicObject_QueryInterface,
|
||||
DirectMusicObject_AddRef,
|
||||
DirectMusicObject_Release,
|
||||
DirectMusicObject_GetDescriptor,
|
||||
DirectMusicObject_SetDescriptor,
|
||||
DirectMusicObject_ParseDescriptor
|
||||
};
|
||||
|
||||
/* IDirectMusicGraphImpl IPersistStream part: */
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, PersistStreamVtbl, iface);
|
||||
return IDirectMusicGraphImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
|
||||
static HRESULT WINAPI PersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ret_iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
return IDirectMusicGraph_QueryInterface(&This->IDirectMusicGraph_iface, riid, ret_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, PersistStreamVtbl, iface);
|
||||
return IDirectMusicGraphImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
|
||||
static ULONG WINAPI PersistStream_AddRef(IPersistStream *iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
return IDirectMusicGraph_AddRef(&This->IDirectMusicGraph_iface);
|
||||
}
|
||||
|
||||
static ULONG WINAPI IDirectMusicGraphImpl_IPersistStream_Release (LPPERSISTSTREAM iface) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, PersistStreamVtbl, iface);
|
||||
return IDirectMusicGraphImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
|
||||
static ULONG WINAPI PersistStream_Release(IPersistStream *iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
return IDirectMusicGraph_Release(&This->IDirectMusicGraph_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) {
|
||||
return E_NOTIMPL;
|
||||
static HRESULT WINAPI PersistStream_GetClassID(IPersistStream *iface, CLSID *clsid)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
FIXME("(%p) %p: stub\n", This, clsid);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IPersistStream_IsDirty (LPPERSISTSTREAM iface) {
|
||||
return E_NOTIMPL;
|
||||
static HRESULT WINAPI PersistStream_IsDirty(IPersistStream *iface)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
FIXME("(%p): stub\n", This);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) {
|
||||
ICOM_THIS_MULTI(IDirectMusicGraphImpl, PersistStreamVtbl, iface);
|
||||
static HRESULT WINAPI PersistStream_Load(IPersistStream *iface, IStream* pStm)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
FOURCC chunkID;
|
||||
DWORD chunkSize, StreamSize, StreamCount, ListSize[3], ListCount[3];
|
||||
LARGE_INTEGER liMove; /* used when skipping chunks */
|
||||
@ -578,45 +597,56 @@ static HRESULT WINAPI IDirectMusicGraphImpl_IPersistStream_Load (LPPERSISTSTREAM
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) {
|
||||
return E_NOTIMPL;
|
||||
static HRESULT WINAPI PersistStream_Save(IPersistStream *iface, IStream *stream, BOOL clear_dirty)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
FIXME("(%p) %p %d\n", This, stream, clear_dirty);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicGraphImpl_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) {
|
||||
return E_NOTIMPL;
|
||||
static HRESULT WINAPI PersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *size)
|
||||
{
|
||||
IDirectMusicGraphImpl *This = impl_from_IPersistStream(iface);
|
||||
FIXME("(%p) %p\n", This, size);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static const IPersistStreamVtbl DirectMusicGraph_PersistStream_Vtbl = {
|
||||
IDirectMusicGraphImpl_IPersistStream_QueryInterface,
|
||||
IDirectMusicGraphImpl_IPersistStream_AddRef,
|
||||
IDirectMusicGraphImpl_IPersistStream_Release,
|
||||
IDirectMusicGraphImpl_IPersistStream_GetClassID,
|
||||
IDirectMusicGraphImpl_IPersistStream_IsDirty,
|
||||
IDirectMusicGraphImpl_IPersistStream_Load,
|
||||
IDirectMusicGraphImpl_IPersistStream_Save,
|
||||
IDirectMusicGraphImpl_IPersistStream_GetSizeMax
|
||||
static const IPersistStreamVtbl PersistStreamVtbl =
|
||||
{
|
||||
PersistStream_QueryInterface,
|
||||
PersistStream_AddRef,
|
||||
PersistStream_Release,
|
||||
PersistStream_GetClassID,
|
||||
PersistStream_IsDirty,
|
||||
PersistStream_Load,
|
||||
PersistStream_Save,
|
||||
PersistStream_GetSizeMax
|
||||
};
|
||||
|
||||
/* for ClassFactory */
|
||||
HRESULT WINAPI create_dmgraph(REFIID lpcGUID, void **ppobj)
|
||||
HRESULT WINAPI create_dmgraph(REFIID riid, void **ret_iface)
|
||||
{
|
||||
IDirectMusicGraphImpl* obj;
|
||||
|
||||
obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicGraphImpl));
|
||||
if (NULL == obj) {
|
||||
*ppobj = NULL;
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
obj->UnknownVtbl = &DirectMusicGraph_Unknown_Vtbl;
|
||||
obj->GraphVtbl = &DirectMusicGraph_Graph_Vtbl;
|
||||
obj->ObjectVtbl = &DirectMusicGraph_Object_Vtbl;
|
||||
obj->PersistStreamVtbl = &DirectMusicGraph_PersistStream_Vtbl;
|
||||
obj->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC));
|
||||
DM_STRUCT_INIT(obj->pDesc);
|
||||
obj->pDesc->dwValidData |= DMUS_OBJ_CLASS;
|
||||
obj->pDesc->guidClass = CLSID_DirectMusicGraph;
|
||||
obj->ref = 0; /* will be inited by QueryInterface */
|
||||
list_init (&obj->Tools);
|
||||
IDirectMusicGraphImpl* obj;
|
||||
HRESULT hr;
|
||||
|
||||
return IDirectMusicGraphImpl_IUnknown_QueryInterface ((LPUNKNOWN)&obj->UnknownVtbl, lpcGUID, ppobj);
|
||||
*ret_iface = NULL;
|
||||
|
||||
obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicGraphImpl));
|
||||
if (!obj)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
obj->IDirectMusicGraph_iface.lpVtbl = &DirectMusicGraphVtbl;
|
||||
obj->IDirectMusicObject_iface.lpVtbl = &DirectMusicObjectVtbl;
|
||||
obj->IPersistStream_iface.lpVtbl = &PersistStreamVtbl;
|
||||
obj->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC));
|
||||
DM_STRUCT_INIT(obj->pDesc);
|
||||
obj->pDesc->dwValidData |= DMUS_OBJ_CLASS;
|
||||
obj->pDesc->guidClass = CLSID_DirectMusicGraph;
|
||||
obj->ref = 1;
|
||||
list_init(&obj->Tools);
|
||||
|
||||
hr = IDirectMusicGraph_QueryInterface(&obj->IDirectMusicGraph_iface, riid, ret_iface);
|
||||
IDirectMusicGraph_Release(&obj->IDirectMusicGraph_iface);
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user