- 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:
Raphael Junqueira 2004-05-19 04:32:43 +00:00 committed by Alexandre Julliard
parent df93f2eeee
commit dfbf36d3e8
4 changed files with 126 additions and 87 deletions

View File

@ -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: */

View File

@ -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);
} }

View File

@ -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;
} }