- Better loading of IDirectMusicSegTriggerTrack (internal list of
subtracks) - Better stubs for IDirectMusicTempoTrack::InitPlay and IDirectMusicTempoTrack::EndPlay (InitPlay should return a valid memory pointer so allocate it). Should be extended for all IDirectMusicTrack objects.
This commit is contained in:
parent
df93f2eeee
commit
dfbf36d3e8
@ -158,6 +158,16 @@ typedef struct _DMUS_PRIVATE_TEMPO_ITEM {
|
|||||||
DMUS_IO_TEMPO_ITEM item;
|
DMUS_IO_TEMPO_ITEM item;
|
||||||
} DMUS_PRIVATE_TEMPO_ITEM, *LPDMUS_PRIVATE_TEMPO_ITEM;
|
} DMUS_PRIVATE_TEMPO_ITEM, *LPDMUS_PRIVATE_TEMPO_ITEM;
|
||||||
|
|
||||||
|
typedef struct _DMUS_PRIVATE_SEGMENT_ITEM {
|
||||||
|
struct list entry; /* for listing elements */
|
||||||
|
DMUS_IO_SEGMENT_ITEM_HEADER header;
|
||||||
|
IDirectMusicObject* pObject;
|
||||||
|
WCHAR wszName[DMUS_MAX_NAME];
|
||||||
|
} DMUS_PRIVATE_SEGMENT_ITEM, *LPDMUS_PRIVATE_SEGMENT_ITEM;
|
||||||
|
|
||||||
|
typedef struct _DMUS_PRIVATE_TEMPO_PLAY_STATE {
|
||||||
|
DWORD dummy;
|
||||||
|
} DMUS_PRIVATE_TEMPO_PLAY_STATE, *LPDMUS_PRIVATE_TEMPO_PLAY_STATE;
|
||||||
|
|
||||||
/* some sort of aux. performance channel: as far as i can understand, these are
|
/* some sort of aux. performance channel: as far as i can understand, these are
|
||||||
used to represent a particular midi channel in particular group at particular
|
used to represent a particular midi channel in particular group at particular
|
||||||
@ -659,8 +669,8 @@ struct IDirectMusicSegTriggerTrack {
|
|||||||
|
|
||||||
/* IDirectMusicSegTriggerTrack fields */
|
/* IDirectMusicSegTriggerTrack fields */
|
||||||
LPDMUS_OBJECTDESC pDesc;
|
LPDMUS_OBJECTDESC pDesc;
|
||||||
DMUS_IO_SEGMENT_ITEM_HEADER header;
|
|
||||||
WCHAR wszName[DMUS_MAX_NAME];
|
struct list Items;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* IUnknown: */
|
/* IUnknown: */
|
||||||
|
@ -245,6 +245,7 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSIS
|
|||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
IDirectMusicObject* pObject = NULL;
|
IDirectMusicObject* pObject = NULL;
|
||||||
|
LPDMUS_PRIVATE_SEGMENT_ITEM pNewItem = NULL;
|
||||||
|
|
||||||
if (pChunk->fccID != DMUS_FOURCC_SEGMENT_LIST) {
|
if (pChunk->fccID != DMUS_FOURCC_SEGMENT_LIST) {
|
||||||
ERR_(dmfile)(": %s chunk should be a SEGMENT list\n", debugstr_fourcc (pChunk->fccID));
|
ERR_(dmfile)(": %s chunk should be a SEGMENT list\n", debugstr_fourcc (pChunk->fccID));
|
||||||
@ -261,17 +262,24 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSIS
|
|||||||
switch (Chunk.fccID) {
|
switch (Chunk.fccID) {
|
||||||
case DMUS_FOURCC_SEGMENTITEM_CHUNK: {
|
case DMUS_FOURCC_SEGMENTITEM_CHUNK: {
|
||||||
TRACE_(dmfile)(": segment item chunk\n");
|
TRACE_(dmfile)(": segment item chunk\n");
|
||||||
IStream_Read (pStm, &This->header, sizeof(DMUS_IO_SEGMENT_ITEM_HEADER), NULL);
|
/** alloc new item entry */
|
||||||
TRACE_(dmfile)(" - lTimePhysical: %lu\n", This->header.lTimeLogical);
|
pNewItem = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_SEGMENT_ITEM));
|
||||||
TRACE_(dmfile)(" - lTimePhysical: %lu\n", This->header.lTimePhysical);
|
if (NULL == pNewItem) {
|
||||||
TRACE_(dmfile)(" - dwPlayFlags: 0x%08lx\n", This->header.dwPlayFlags);
|
ERR(": no more memory\n");
|
||||||
TRACE_(dmfile)(" - dwFlags: 0x%08lx\n", This->header.dwFlags);
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
IStream_Read (pStm, &pNewItem->header, sizeof(DMUS_IO_SEGMENT_ITEM_HEADER), NULL);
|
||||||
|
TRACE_(dmfile)(" - lTimePhysical: %lu\n", pNewItem->header.lTimeLogical);
|
||||||
|
TRACE_(dmfile)(" - lTimePhysical: %lu\n", pNewItem->header.lTimePhysical);
|
||||||
|
TRACE_(dmfile)(" - dwPlayFlags: 0x%08lx\n", pNewItem->header.dwPlayFlags);
|
||||||
|
TRACE_(dmfile)(" - dwFlags: 0x%08lx\n", pNewItem->header.dwFlags);
|
||||||
|
list_add_tail (&This->Items, &pNewItem->entry);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DMUS_FOURCC_SEGMENTITEMNAME_CHUNK: {
|
case DMUS_FOURCC_SEGMENTITEMNAME_CHUNK: {
|
||||||
TRACE_(dmfile)(": segment item name chunk\n");
|
TRACE_(dmfile)(": segment item name chunk\n");
|
||||||
IStream_Read (pStm, This->wszName, Chunk.dwSize, NULL);
|
IStream_Read (pStm, pNewItem->wszName, Chunk.dwSize, NULL);
|
||||||
TRACE_(dmfile)(" - name: %s \n", debugstr_w(This->wszName));
|
TRACE_(dmfile)(" - name: %s \n", debugstr_w(pNewItem->wszName));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FOURCC_LIST: {
|
case FOURCC_LIST: {
|
||||||
@ -287,10 +295,7 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSIS
|
|||||||
ERR(": could not load Reference\n");
|
ERR(": could not load Reference\n");
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
/*
|
pNewItem->pObject = pObject;
|
||||||
* TODO: what to do with the new pObject ?
|
|
||||||
* for now it leaks
|
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
@ -515,6 +520,7 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicSegTriggerTrack (LPCGUID lpcGUID, LPVOID
|
|||||||
track->pDesc->dwValidData |= DMUS_OBJ_CLASS;
|
track->pDesc->dwValidData |= DMUS_OBJ_CLASS;
|
||||||
memcpy (&track->pDesc->guidClass, &CLSID_DirectMusicSegTriggerTrack, sizeof (CLSID));
|
memcpy (&track->pDesc->guidClass, &CLSID_DirectMusicSegTriggerTrack, sizeof (CLSID));
|
||||||
track->ref = 0; /* will be inited by QueryInterface */
|
track->ref = 0; /* will be inited by QueryInterface */
|
||||||
|
list_init (&track->Items);
|
||||||
|
|
||||||
return IDirectMusicSegTriggerTrack_IUnknown_QueryInterface ((LPUNKNOWN)&track->UnknownVtbl, lpcGUID, ppobj);
|
return IDirectMusicSegTriggerTrack_IUnknown_QueryInterface ((LPUNKNOWN)&track->UnknownVtbl, lpcGUID, ppobj);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* IDirectMusicTempoTrack Implementation
|
/* IDirectMusicTempoTrack Implementation
|
||||||
*
|
*
|
||||||
* Copyright (C) 2003-2004 Rok Mandeljc
|
* Copyright (C) 2003-2004 Rok Mandeljc
|
||||||
|
* Copyright (C) 2004 Raphael Junqueira
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -98,14 +99,35 @@ HRESULT WINAPI IDirectMusicTempoTrack_IDirectMusicTrack_Init (LPDIRECTMUSICTRACK
|
|||||||
HRESULT WINAPI IDirectMusicTempoTrack_IDirectMusicTrack_InitPlay (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegmentState* pSegmentState, IDirectMusicPerformance* pPerformance, void** ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
|
HRESULT WINAPI IDirectMusicTempoTrack_IDirectMusicTrack_InitPlay (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegmentState* pSegmentState, IDirectMusicPerformance* pPerformance, void** ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
|
||||||
{
|
{
|
||||||
ICOM_THIS_MULTI(IDirectMusicTempoTrack, TrackVtbl, iface);
|
ICOM_THIS_MULTI(IDirectMusicTempoTrack, TrackVtbl, iface);
|
||||||
FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
|
|
||||||
|
LPDMUS_PRIVATE_TEMPO_PLAY_STATE pState = NULL;
|
||||||
|
|
||||||
|
FIXME("(%p, %p, %p, %p, %ld, %ld): semi-stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
|
||||||
|
|
||||||
|
pState = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_TEMPO_PLAY_STATE));
|
||||||
|
if (NULL == pState) {
|
||||||
|
ERR(": no more memory\n");
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
/** TODO real fill usefull datas */
|
||||||
|
pState->dummy = 0;
|
||||||
|
*ppStateData = pState;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI IDirectMusicTempoTrack_IDirectMusicTrack_EndPlay (LPDIRECTMUSICTRACK8 iface, void* pStateData)
|
HRESULT WINAPI IDirectMusicTempoTrack_IDirectMusicTrack_EndPlay (LPDIRECTMUSICTRACK8 iface, void* pStateData)
|
||||||
{
|
{
|
||||||
ICOM_THIS_MULTI(IDirectMusicTempoTrack, TrackVtbl, iface);
|
ICOM_THIS_MULTI(IDirectMusicTempoTrack, TrackVtbl, iface);
|
||||||
FIXME("(%p, %p): stub\n", This, pStateData);
|
|
||||||
|
LPDMUS_PRIVATE_TEMPO_PLAY_STATE pState = pStateData;
|
||||||
|
|
||||||
|
FIXME("(%p, %p): semi-stub\n", This, pStateData);
|
||||||
|
|
||||||
|
if (NULL == pStateData) {
|
||||||
|
return E_POINTER;
|
||||||
|
}
|
||||||
|
/** TODO real clean up */
|
||||||
|
HeapFree(GetProcessHeap(), 0, pState);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,6 +135,7 @@ HRESULT WINAPI IDirectMusicTempoTrack_IDirectMusicTrack_Play (LPDIRECTMUSICTRACK
|
|||||||
{
|
{
|
||||||
ICOM_THIS_MULTI(IDirectMusicTempoTrack, TrackVtbl, iface);
|
ICOM_THIS_MULTI(IDirectMusicTempoTrack, TrackVtbl, iface);
|
||||||
FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
|
FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
|
||||||
|
/** should use IDirectMusicPerformance_SendPMsg here */
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user