Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
43def08e
Commit
43def08e
authored
May 12, 2004
by
Raphael Junqueira
Committed by
Alexandre Julliard
May 12, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- Segment loading fix (correct FOURCC_RIFF tracks handling).
- IDirectMusicStyleTrack loading (need DM References). - IDirectMusicBandTrack loading (need IDirectMusicBand loading).
parent
4227ed1e
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
675 additions
and
264 deletions
+675
-264
bandtrack.c
dlls/dmband/bandtrack.c
+426
-148
dmband_private.h
dlls/dmband/dmband_private.h
+1
-1
segment.c
dlls/dmime/segment.c
+13
-46
segtriggertrack.c
dlls/dmime/segtriggertrack.c
+9
-9
tempotrack.c
dlls/dmime/tempotrack.c
+3
-3
chordtrack.c
dlls/dmstyle/chordtrack.c
+23
-23
styletrack.c
dlls/dmstyle/styletrack.c
+200
-34
No files found.
dlls/dmband/bandtrack.c
View file @
43def08e
...
...
@@ -50,249 +50,527 @@ HRESULT WINAPI IDirectMusicBandTrack_IUnknown_QueryInterface (LPUNKNOWN iface, R
}
ULONG
WINAPI
IDirectMusicBandTrack_IUnknown_AddRef
(
LPUNKNOWN
iface
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
UnknownVtbl
,
iface
);
TRACE
(
"(%p) : AddRef from %ld
\n
"
,
This
,
This
->
ref
);
return
++
(
This
->
ref
);
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
UnknownVtbl
,
iface
);
TRACE
(
"(%p) : AddRef from %ld
\n
"
,
This
,
This
->
ref
);
return
++
(
This
->
ref
);
}
ULONG
WINAPI
IDirectMusicBandTrack_IUnknown_Release
(
LPUNKNOWN
iface
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
UnknownVtbl
,
iface
);
ULONG
ref
=
--
This
->
ref
;
TRACE
(
"(%p) : ReleaseRef to %ld
\n
"
,
This
,
This
->
ref
);
if
(
ref
==
0
)
{
HeapFree
(
GetProcessHeap
(),
0
,
This
);
}
return
ref
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
UnknownVtbl
,
iface
);
ULONG
ref
=
--
This
->
ref
;
TRACE
(
"(%p) : ReleaseRef to %ld
\n
"
,
This
,
This
->
ref
);
if
(
ref
==
0
)
{
HeapFree
(
GetProcessHeap
(),
0
,
This
);
}
return
ref
;
}
ICOM_VTABLE
(
IUnknown
)
DirectMusicBandTrack_Unknown_Vtbl
=
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicBandTrack_IUnknown_QueryInterface
,
IDirectMusicBandTrack_IUnknown_AddRef
,
IDirectMusicBandTrack_IUnknown_Release
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicBandTrack_IUnknown_QueryInterface
,
IDirectMusicBandTrack_IUnknown_AddRef
,
IDirectMusicBandTrack_IUnknown_Release
};
/* IDirectMusicBandTrack IDirectMusicTrack8 part: */
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_QueryInterface
(
LPDIRECTMUSICTRACK8
iface
,
REFIID
riid
,
LPVOID
*
ppobj
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
,
riid
,
ppobj
);
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
,
riid
,
ppobj
);
}
ULONG
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_AddRef
(
LPDIRECTMUSICTRACK8
iface
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_AddRef
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_AddRef
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
}
ULONG
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_Release
(
LPDIRECTMUSICTRACK8
iface
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_Release
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_Release
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_Init
(
LPDIRECTMUSICTRACK8
iface
,
IDirectMusicSegment
*
pSegment
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p): stub
\n
"
,
This
,
pSegment
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p): stub
\n
"
,
This
,
pSegment
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_InitPlay
(
LPDIRECTMUSICTRACK8
iface
,
IDirectMusicSegmentState
*
pSegmentState
,
IDirectMusicPerformance
*
pPerformance
,
void
**
ppStateData
,
DWORD
dwVirtualTrack8ID
,
DWORD
dwFlags
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %p, %p, %ld, %ld): stub
\n
"
,
This
,
pSegmentState
,
pPerformance
,
ppStateData
,
dwVirtualTrack8ID
,
dwFlags
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %p, %p, %ld, %ld): stub
\n
"
,
This
,
pSegmentState
,
pPerformance
,
ppStateData
,
dwVirtualTrack8ID
,
dwFlags
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_EndPlay
(
LPDIRECTMUSICTRACK8
iface
,
void
*
pStateData
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p): stub
\n
"
,
This
,
pStateData
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p): stub
\n
"
,
This
,
pStateData
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_Play
(
LPDIRECTMUSICTRACK8
iface
,
void
*
pStateData
,
MUSIC_TIME
mtStart
,
MUSIC_TIME
mtEnd
,
MUSIC_TIME
mtOffset
,
DWORD
dwFlags
,
IDirectMusicPerformance
*
pPerf
,
IDirectMusicSegmentState
*
pSegSt
,
DWORD
dwVirtualID
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): semi-stub
\n
"
,
This
,
pStateData
,
mtStart
,
mtEnd
,
mtOffset
,
dwFlags
,
pPerf
,
pSegSt
,
dwVirtualID
);
/* Sends following pMSG:
- DMUS_PATCH_PMSG
- DMUS_TRANSPOSE_PMSG
- DMUS_CHANNEL_PRIORITY_PMSG
- DMUS_MIDI_PMSG
*/
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): semi-stub
\n
"
,
This
,
pStateData
,
mtStart
,
mtEnd
,
mtOffset
,
dwFlags
,
pPerf
,
pSegSt
,
dwVirtualID
);
/* Sends following pMSG:
- DMUS_PATCH_PMSG
- DMUS_TRANSPOSE_PMSG
- DMUS_CHANNEL_PRIORITY_PMSG
- DMUS_MIDI_PMSG
*/
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_GetParam
(
LPDIRECTMUSICTRACK8
iface
,
REFGUID
rguidType
,
MUSIC_TIME
mtTime
,
MUSIC_TIME
*
pmtNext
,
void
*
pParam
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %ld, %p, %p): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
mtTime
,
pmtNext
,
pParam
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %ld, %p, %p): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
mtTime
,
pmtNext
,
pParam
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_SetParam
(
LPDIRECTMUSICTRACK8
iface
,
REFGUID
rguidType
,
MUSIC_TIME
mtTime
,
void
*
pParam
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %ld, %p): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
mtTime
,
pParam
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %ld, %p): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
mtTime
,
pParam
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_IsParamSupported
(
LPDIRECTMUSICTRACK8
iface
,
REFGUID
rguidType
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
TRACE
(
"(%p, %s): "
,
This
,
debugstr_dmguid
(
rguidType
));
if
(
IsEqualGUID
(
rguidType
,
&
GUID_BandParam
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Clear_All_Bands
)
||
IsEqualGUID
(
rguidType
,
&
GUID_ConnectToDLSCollection
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Disable_Auto_Download
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Download
)
||
IsEqualGUID
(
rguidType
,
&
GUID_DownloadToAudioPath
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Enable_Auto_Download
)
||
IsEqualGUID
(
rguidType
,
&
GUID_IDirectMusicBand
)
||
IsEqualGUID
(
rguidType
,
&
GUID_StandardMIDIFile
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Unload
)
||
IsEqualGUID
(
rguidType
,
&
GUID_UnloadFromAudioPath
))
{
TRACE
(
"param supported
\n
"
);
return
S_OK
;
}
TRACE
(
"param unsupported
\n
"
);
return
DMUS_E_TYPE_UNSUPPORTED
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
TRACE
(
"(%p, %s): "
,
This
,
debugstr_dmguid
(
rguidType
));
if
(
IsEqualGUID
(
rguidType
,
&
GUID_BandParam
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Clear_All_Bands
)
||
IsEqualGUID
(
rguidType
,
&
GUID_ConnectToDLSCollection
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Disable_Auto_Download
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Download
)
||
IsEqualGUID
(
rguidType
,
&
GUID_DownloadToAudioPath
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Enable_Auto_Download
)
||
IsEqualGUID
(
rguidType
,
&
GUID_IDirectMusicBand
)
||
IsEqualGUID
(
rguidType
,
&
GUID_StandardMIDIFile
)
||
IsEqualGUID
(
rguidType
,
&
GUID_Unload
)
||
IsEqualGUID
(
rguidType
,
&
GUID_UnloadFromAudioPath
))
{
TRACE
(
"param supported
\n
"
);
return
S_OK
;
}
TRACE
(
"param unsupported
\n
"
);
return
DMUS_E_TYPE_UNSUPPORTED
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_AddNotificationType
(
LPDIRECTMUSICTRACK8
iface
,
REFGUID
rguidNotificationType
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidNotificationType
));
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidNotificationType
));
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_RemoveNotificationType
(
LPDIRECTMUSICTRACK8
iface
,
REFGUID
rguidNotificationType
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidNotificationType
));
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidNotificationType
));
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_Clone
(
LPDIRECTMUSICTRACK8
iface
,
MUSIC_TIME
mtStart
,
MUSIC_TIME
mtEnd
,
IDirectMusicTrack
**
ppTrack
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %ld, %ld, %p): stub
\n
"
,
This
,
mtStart
,
mtEnd
,
ppTrack
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %ld, %ld, %p): stub
\n
"
,
This
,
mtStart
,
mtEnd
,
ppTrack
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_PlayEx
(
LPDIRECTMUSICTRACK8
iface
,
void
*
pStateData
,
REFERENCE_TIME
rtStart
,
REFERENCE_TIME
rtEnd
,
REFERENCE_TIME
rtOffset
,
DWORD
dwFlags
,
IDirectMusicPerformance
*
pPerf
,
IDirectMusicSegmentState
*
pSegSt
,
DWORD
dwVirtualID
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %lli, %lli, %lli, %ld, %p, %p, %ld): stub
\n
"
,
This
,
pStateData
,
rtStart
,
rtEnd
,
rtOffset
,
dwFlags
,
pPerf
,
pSegSt
,
dwVirtualID
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %lli, %lli, %lli, %ld, %p, %p, %ld): stub
\n
"
,
This
,
pStateData
,
rtStart
,
rtEnd
,
rtOffset
,
dwFlags
,
pPerf
,
pSegSt
,
dwVirtualID
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_GetParamEx
(
LPDIRECTMUSICTRACK8
iface
,
REFGUID
rguidType
,
REFERENCE_TIME
rtTime
,
REFERENCE_TIME
*
prtNext
,
void
*
pParam
,
void
*
pStateData
,
DWORD
dwFlags
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %lli, %p, %p, %p, %ld): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
rtTime
,
prtNext
,
pParam
,
pStateData
,
dwFlags
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %lli, %p, %p, %p, %ld): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
rtTime
,
prtNext
,
pParam
,
pStateData
,
dwFlags
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_SetParamEx
(
LPDIRECTMUSICTRACK8
iface
,
REFGUID
rguidType
,
REFERENCE_TIME
rtTime
,
void
*
pParam
,
void
*
pStateData
,
DWORD
dwFlags
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %lli, %p, %p, %ld): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
rtTime
,
pParam
,
pStateData
,
dwFlags
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %s, %lli, %p, %p, %ld): stub
\n
"
,
This
,
debugstr_dmguid
(
rguidType
),
rtTime
,
pParam
,
pStateData
,
dwFlags
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_Compose
(
LPDIRECTMUSICTRACK8
iface
,
IUnknown
*
pContext
,
DWORD
dwTrackGroup
,
IDirectMusicTrack
**
ppResultTrack
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %ld, %p): stub
\n
"
,
This
,
pContext
,
dwTrackGroup
,
ppResultTrack
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %ld, %p): stub
\n
"
,
This
,
pContext
,
dwTrackGroup
,
ppResultTrack
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IDirectMusicTrack_Join
(
LPDIRECTMUSICTRACK8
iface
,
IDirectMusicTrack
*
pNewTrack
,
MUSIC_TIME
mtJoin
,
IUnknown
*
pContext
,
DWORD
dwTrackGroup
,
IDirectMusicTrack
**
ppResultTrack
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %ld, %p, %ld, %p): stub
\n
"
,
This
,
pNewTrack
,
mtJoin
,
pContext
,
dwTrackGroup
,
ppResultTrack
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
TrackVtbl
,
iface
);
FIXME
(
"(%p, %p, %ld, %p, %ld, %p): stub
\n
"
,
This
,
pNewTrack
,
mtJoin
,
pContext
,
dwTrackGroup
,
ppResultTrack
);
return
S_OK
;
}
ICOM_VTABLE
(
IDirectMusicTrack8
)
DirectMusicBandTrack_DirectMusicTrack_Vtbl
=
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicBandTrack_IDirectMusicTrack_QueryInterface
,
IDirectMusicBandTrack_IDirectMusicTrack_AddRef
,
IDirectMusicBandTrack_IDirectMusicTrack_Release
,
IDirectMusicBandTrack_IDirectMusicTrack_Init
,
IDirectMusicBandTrack_IDirectMusicTrack_InitPlay
,
IDirectMusicBandTrack_IDirectMusicTrack_EndPlay
,
IDirectMusicBandTrack_IDirectMusicTrack_Play
,
IDirectMusicBandTrack_IDirectMusicTrack_GetParam
,
IDirectMusicBandTrack_IDirectMusicTrack_SetParam
,
IDirectMusicBandTrack_IDirectMusicTrack_IsParamSupported
,
IDirectMusicBandTrack_IDirectMusicTrack_AddNotificationType
,
IDirectMusicBandTrack_IDirectMusicTrack_RemoveNotificationType
,
IDirectMusicBandTrack_IDirectMusicTrack_Clone
,
IDirectMusicBandTrack_IDirectMusicTrack_PlayEx
,
IDirectMusicBandTrack_IDirectMusicTrack_GetParamEx
,
IDirectMusicBandTrack_IDirectMusicTrack_SetParamEx
,
IDirectMusicBandTrack_IDirectMusicTrack_Compose
,
IDirectMusicBandTrack_IDirectMusicTrack_Join
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicBandTrack_IDirectMusicTrack_QueryInterface
,
IDirectMusicBandTrack_IDirectMusicTrack_AddRef
,
IDirectMusicBandTrack_IDirectMusicTrack_Release
,
IDirectMusicBandTrack_IDirectMusicTrack_Init
,
IDirectMusicBandTrack_IDirectMusicTrack_InitPlay
,
IDirectMusicBandTrack_IDirectMusicTrack_EndPlay
,
IDirectMusicBandTrack_IDirectMusicTrack_Play
,
IDirectMusicBandTrack_IDirectMusicTrack_GetParam
,
IDirectMusicBandTrack_IDirectMusicTrack_SetParam
,
IDirectMusicBandTrack_IDirectMusicTrack_IsParamSupported
,
IDirectMusicBandTrack_IDirectMusicTrack_AddNotificationType
,
IDirectMusicBandTrack_IDirectMusicTrack_RemoveNotificationType
,
IDirectMusicBandTrack_IDirectMusicTrack_Clone
,
IDirectMusicBandTrack_IDirectMusicTrack_PlayEx
,
IDirectMusicBandTrack_IDirectMusicTrack_GetParamEx
,
IDirectMusicBandTrack_IDirectMusicTrack_SetParamEx
,
IDirectMusicBandTrack_IDirectMusicTrack_Compose
,
IDirectMusicBandTrack_IDirectMusicTrack_Join
};
/* IDirectMusicBandTrack IPersistStream part: */
HRESULT
WINAPI
IDirectMusicBandTrack_IPersistStream_QueryInterface
(
LPPERSISTSTREAM
iface
,
REFIID
riid
,
LPVOID
*
ppobj
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
,
riid
,
ppobj
);
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
,
riid
,
ppobj
);
}
ULONG
WINAPI
IDirectMusicBandTrack_IPersistStream_AddRef
(
LPPERSISTSTREAM
iface
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_AddRef
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_AddRef
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
}
ULONG
WINAPI
IDirectMusicBandTrack_IPersistStream_Release
(
LPPERSISTSTREAM
iface
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_Release
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicBandTrack_IUnknown_Release
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
}
HRESULT
WINAPI
IDirectMusicBandTrack_IPersistStream_GetClassID
(
LPPERSISTSTREAM
iface
,
CLSID
*
pClassID
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
TRACE
(
"(%p, %p)
\n
"
,
This
,
pClassID
);
memcpy
(
pClassID
,
&
CLSID_DirectMusicBandTrack
,
sizeof
(
CLSID
));
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IPersistStream_IsDirty
(
LPPERSISTSTREAM
iface
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
FIXME
(
"(%p): stub, always S_FALSE
\n
"
,
This
);
return
S_FALSE
;
}
static
HRESULT
IDirectMusicBandTrack_IPersistStream_LoadBand
(
LPPERSISTSTREAM
iface
,
IStream
*
pClonedStream
,
IDirectMusicBand
**
ppBand
,
DMUS_PRIVATE_BAND_ITEM_HEADER
*
pHeader
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
HRESULT
hr
=
E_FAIL
;
IPersistStream
*
pPersistStream
=
NULL
;
hr
=
CoCreateInstance
(
&
CLSID_DirectMusicBand
,
NULL
,
CLSCTX_INPROC_SERVER
,
&
IID_IDirectMusicBand
,
(
LPVOID
*
)
ppBand
);
if
(
FAILED
(
hr
))
{
ERR
(
": could not create object
\n
"
);
return
hr
;
}
/* acquire PersistStream interface */
hr
=
IDirectMusicBand_QueryInterface
(
*
ppBand
,
&
IID_IPersistStream
,
(
LPVOID
*
)
&
pPersistStream
);
if
(
FAILED
(
hr
))
{
ERR
(
": could not acquire IPersistStream
\n
"
);
return
hr
;
}
/* load */
hr
=
IPersistStream_Load
(
pPersistStream
,
pClonedStream
);
if
(
FAILED
(
hr
))
{
ERR
(
": failed to load object
\n
"
);
return
hr
;
}
/* release all loading-related stuff */
IPersistStream_Release
(
pPersistStream
);
/*
* @TODO insert pBand into This
*/
if
(
SUCCEEDED
(
hr
))
{
LPDMUS_PRIVATE_BAND
pNewBand
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_PRIVATE_BAND
));
if
(
NULL
==
pNewBand
)
{
ERR
(
": no more memory
\n
"
);
return
E_OUTOFMEMORY
;
}
memcpy
(
&
pNewBand
->
pBandHeader
,
pHeader
,
sizeof
(
DMUS_PRIVATE_BAND_ITEM_HEADER
));
pNewBand
->
ppBand
=
(
IDirectMusicBandImpl
*
)((
char
*
)(
*
ppBand
)
-
offsetof
(
IDirectMusicBandImpl
,
BandVtbl
));
IDirectMusicBandImpl_IDirectMusicBand_AddRef
(
*
ppBand
);
list_add_tail
(
&
This
->
Bands
,
&
pNewBand
->
entry
);
}
return
S_OK
;
}
static
HRESULT
IDirectMusicBandTrack_IPersistStream_ParseBandsList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
/*ICOM_THIS_MULTI(IDirectMusicBandTrack, PersistStreamVtbl, iface);*/
HRESULT
hr
=
E_FAIL
;
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
StreamSize
,
ListSize
[
3
],
ListCount
[
3
];
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
IDirectMusicBand
*
pBand
=
NULL
;
DMUS_PRIVATE_BAND_ITEM_HEADER
header
;
if
(
pChunk
->
fccID
!=
DMUS_FOURCC_BANDS_LIST
)
{
ERR_
(
dmfile
)(
": %s chunk should be a BANDS list
\n
"
,
debugstr_fourcc
(
pChunk
->
fccID
));
return
E_FAIL
;
}
ListSize
[
0
]
=
pChunk
->
dwSize
-
sizeof
(
FOURCC
);
ListCount
[
0
]
=
0
;
do
{
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
ListCount
[
0
]
+=
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
)
+
Chunk
.
dwSize
;
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
FOURCC_LIST
:
{
IStream_Read
(
pStm
,
&
Chunk
.
fccID
,
sizeof
(
FOURCC
),
NULL
);
TRACE_
(
dmfile
)(
": LIST chunk of type %s"
,
debugstr_fourcc
(
Chunk
.
fccID
));
ListSize
[
1
]
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
ListCount
[
1
]
=
0
;
do
{
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
ListCount
[
1
]
+=
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
)
+
Chunk
.
dwSize
;
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_BANDITEM_CHUNK
:
{
DMUS_IO_BAND_ITEM_HEADER
tmp_header
;
TRACE_
(
dmfile
)(
": Band Item chunk v1
\n
"
);
IStream_Read
(
pStm
,
&
tmp_header
,
sizeof
(
DMUS_IO_BAND_ITEM_HEADER
),
NULL
);
TRACE_
(
dmfile
)(
" - lBandTime: %lu
\n
"
,
tmp_header
.
lBandTime
);
header
.
dwVersion
=
1
;
header
.
lBandTime
=
tmp_header
.
lBandTime
;
break
;
}
case
DMUS_FOURCC_BANDITEM_CHUNK2
:
{
DMUS_IO_BAND_ITEM_HEADER2
tmp_header2
;
TRACE_
(
dmfile
)(
": Band Item chunk v2
\n
"
);
IStream_Read
(
pStm
,
&
tmp_header2
,
sizeof
(
DMUS_IO_BAND_ITEM_HEADER2
),
NULL
);
TRACE_
(
dmfile
)(
" - lBandTimeLogical: %lu
\n
"
,
tmp_header2
.
lBandTimeLogical
);
TRACE_
(
dmfile
)(
" - lBandTimePhysical: %lu
\n
"
,
tmp_header2
.
lBandTimePhysical
);
header
.
dwVersion
=
2
;
header
.
lBandTimeLogical
=
tmp_header2
.
lBandTimeLogical
;
header
.
lBandTimePhysical
=
tmp_header2
.
lBandTimePhysical
;
break
;
}
case
FOURCC_RIFF
:
{
IStream_Read
(
pStm
,
&
Chunk
.
fccID
,
sizeof
(
FOURCC
),
NULL
);
FIXME_
(
dmfile
)(
": RIFF chunk of type %s (behavior to check)
\n
"
,
debugstr_fourcc
(
Chunk
.
fccID
));
StreamSize
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_BAND_FORM
:
{
LPSTREAM
pClonedStream
=
NULL
;
TRACE_
(
dmfile
)(
": BAND RIFF
\n
"
);
IStream_Clone
(
pStm
,
&
pClonedStream
);
liMove
.
QuadPart
=
0
;
liMove
.
QuadPart
-=
sizeof
(
FOURCC
)
+
(
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
));
IStream_Seek
(
pClonedStream
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
hr
=
IDirectMusicBandTrack_IPersistStream_LoadBand
(
iface
,
pClonedStream
,
&
pBand
,
&
header
);
if
(
FAILED
(
hr
))
{
ERR
(
": could not load track
\n
"
);
return
hr
;
}
IStream_Release
(
pClonedStream
);
IDirectMusicTrack_Release
(
pBand
);
pBand
=
NULL
;
/* now we can release at as it inserted */
/** now safe move the cursor */
liMove
.
QuadPart
=
StreamSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
}
default:
{
TRACE_
(
dmfile
)(
": unknown chunk (irrevelant & skipping)
\n
"
);
liMove
.
QuadPart
=
StreamSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
/*
liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC);
IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
*/
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown chunk (irrevelant & skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
TRACE_
(
dmfile
)(
": ListCount[1] = %ld < ListSize[1] = %ld
\n
"
,
ListCount
[
1
],
ListSize
[
1
]);
}
while
(
ListCount
[
1
]
<
ListSize
[
1
]);
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown chunk (irrevelant & skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
TRACE_
(
dmfile
)(
": ListCount[0] = %ld < ListSize[0] = %ld
\n
"
,
ListCount
[
0
],
ListSize
[
0
]);
}
while
(
ListCount
[
0
]
<
ListSize
[
0
]);
return
S_OK
;
}
static
HRESULT
IDirectMusicBandTrack_IPersistStream_ParseBandTrackForm
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
HRESULT
hr
=
E_FAIL
;
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
StreamSize
,
StreamCount
,
ListSize
[
3
],
ListCount
[
3
];
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
if
(
pChunk
->
fccID
!=
DMUS_FOURCC_BANDTRACK_FORM
)
{
ERR_
(
dmfile
)(
": %s chunk should be a BANDTRACK form
\n
"
,
debugstr_fourcc
(
pChunk
->
fccID
));
return
E_FAIL
;
}
StreamSize
=
pChunk
->
dwSize
-
sizeof
(
FOURCC
);
StreamCount
=
0
;
do
{
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
StreamCount
+=
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
)
+
Chunk
.
dwSize
;
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_BANDTRACK_CHUNK
:
{
TRACE_
(
dmfile
)(
": BandTrack chunk
\n
"
);
IStream_Read
(
pStm
,
&
This
->
header
,
sizeof
(
DMUS_IO_BAND_TRACK_HEADER
),
NULL
);
TRACE_
(
dmfile
)(
" - bAutoDownload: %u
\n
"
,
This
->
header
.
bAutoDownload
);
break
;
}
case
FOURCC_LIST
:
{
IStream_Read
(
pStm
,
&
Chunk
.
fccID
,
sizeof
(
FOURCC
),
NULL
);
TRACE_
(
dmfile
)(
": LIST chunk of type %s"
,
debugstr_fourcc
(
Chunk
.
fccID
));
ListSize
[
0
]
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
ListCount
[
0
]
=
0
;
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_BANDS_LIST
:
{
TRACE_
(
dmfile
)(
": TRACK list
\n
"
);
hr
=
IDirectMusicBandTrack_IPersistStream_ParseBandsList
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown (skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown chunk (irrevelant & skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
TRACE_
(
dmfile
)(
": StreamCount[0] = %ld < StreamSize[0] = %ld
\n
"
,
StreamCount
,
StreamSize
);
}
while
(
StreamCount
<
StreamSize
);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IPersistStream_Load
(
LPPERSISTSTREAM
iface
,
IStream
*
pStm
)
{
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
FIXME
(
"(%p,%p): loading not implemented yet
\n
"
,
This
,
pStm
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
DMUS_PRIVATE_CHUNK
Chunk
;
LARGE_INTEGER
liMove
;
HRESULT
hr
;
FIXME
(
"(%p, %p): loading not fully implemented yet
\n
"
,
This
,
pStm
);
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
FOURCC_RIFF
:
{
IStream_Read
(
pStm
,
&
Chunk
.
fccID
,
sizeof
(
FOURCC
),
NULL
);
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_BANDTRACK_FORM
:
{
TRACE_
(
dmfile
)(
": Band track form
\n
"
);
hr
=
IDirectMusicBandTrack_IPersistStream_ParseBandTrackForm
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unexpected chunk; loading failed)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
return
E_FAIL
;
}
}
TRACE_
(
dmfile
)(
": reading finished
\n
"
);
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unexpected chunk; loading failed)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
/* skip the rest of the chunk */
return
E_FAIL
;
}
}
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IPersistStream_Save
(
LPPERSISTSTREAM
iface
,
IStream
*
pStm
,
BOOL
fClearDirty
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
FIXME
(
"(%p): Saving not implemented yet
\n
"
,
This
);
return
E_NOTIMPL
;
}
HRESULT
WINAPI
IDirectMusicBandTrack_IPersistStream_GetSizeMax
(
LPPERSISTSTREAM
iface
,
ULARGE_INTEGER
*
pcbSize
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicBandTrack
,
PersistStreamVtbl
,
iface
);
FIXME
(
"(%p, %p): stub
\n
"
,
This
,
pcbSize
);
return
E_NOTIMPL
;
}
ICOM_VTABLE
(
IPersistStream
)
DirectMusicBandTrack_PerststStream_Vtbl
=
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicBandTrack_IPersistStream_QueryInterface
,
IDirectMusicBandTrack_IPersistStream_AddRef
,
IDirectMusicBandTrack_IPersistStream_Release
,
IDirectMusicBandTrack_IPersistStream_GetClassID
,
IDirectMusicBandTrack_IPersistStream_IsDirty
,
IDirectMusicBandTrack_IPersistStream_Load
,
IDirectMusicBandTrack_IPersistStream_Save
,
IDirectMusicBandTrack_IPersistStream_GetSizeMax
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicBandTrack_IPersistStream_QueryInterface
,
IDirectMusicBandTrack_IPersistStream_AddRef
,
IDirectMusicBandTrack_IPersistStream_Release
,
IDirectMusicBandTrack_IPersistStream_GetClassID
,
IDirectMusicBandTrack_IPersistStream_IsDirty
,
IDirectMusicBandTrack_IPersistStream_Load
,
IDirectMusicBandTrack_IPersistStream_Save
,
IDirectMusicBandTrack_IPersistStream_GetSizeMax
};
/* for ClassFactory */
HRESULT
WINAPI
DMUSIC_CreateDirectMusicBandTrack
(
LPCGUID
lpcGUID
,
LPVOID
*
ppobj
,
LPUNKNOWN
pUnkOuter
)
{
IDirectMusicBandTrack
*
track
;
track
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicBandTrack
));
if
(
NULL
==
track
)
{
*
ppobj
=
(
LPVOID
)
NULL
;
return
E_OUTOFMEMORY
;
}
track
->
UnknownVtbl
=
&
DirectMusicBandTrack_Unknown_Vtbl
;
track
->
TrackVtbl
=
&
DirectMusicBandTrack_DirectMusicTrack_Vtbl
;
track
->
PersistStreamVtbl
=
&
DirectMusicBandTrack_PerststStream_Vtbl
;
track
->
pDesc
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_OBJECTDESC
));
DM_STRUCT_INIT
(
track
->
pDesc
);
track
->
pDesc
->
dwValidData
|=
DMUS_OBJ_CLASS
;
memcpy
(
&
track
->
pDesc
->
guidClass
,
&
CLSID_DirectMusicBandTrack
,
sizeof
(
CLSID
));
track
->
ref
=
0
;
/* will be inited by QueryInterface */
list_init
(
&
track
->
Bands
);
IDirectMusicBandTrack
*
track
;
return
IDirectMusicBandTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
track
->
UnknownVtbl
,
lpcGUID
,
ppobj
);
track
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicBandTrack
));
if
(
NULL
==
track
)
{
*
ppobj
=
(
LPVOID
)
NULL
;
return
E_OUTOFMEMORY
;
}
track
->
UnknownVtbl
=
&
DirectMusicBandTrack_Unknown_Vtbl
;
track
->
TrackVtbl
=
&
DirectMusicBandTrack_DirectMusicTrack_Vtbl
;
track
->
PersistStreamVtbl
=
&
DirectMusicBandTrack_PerststStream_Vtbl
;
track
->
pDesc
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_OBJECTDESC
));
DM_STRUCT_INIT
(
track
->
pDesc
);
track
->
pDesc
->
dwValidData
|=
DMUS_OBJ_CLASS
;
memcpy
(
&
track
->
pDesc
->
guidClass
,
&
CLSID_DirectMusicBandTrack
,
sizeof
(
CLSID
));
track
->
ref
=
0
;
/* will be inited by QueryInterface */
list_init
(
&
track
->
Bands
);
return
IDirectMusicBandTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
track
->
UnknownVtbl
,
lpcGUID
,
ppobj
);
}
dlls/dmband/dmband_private.h
View file @
43def08e
...
...
@@ -150,7 +150,7 @@ struct IDirectMusicBandTrack {
/* IDirectMusicBandTrack fields */
LPDMUS_OBJECTDESC
pDesc
;
DMUS_IO_BAND_TRACK_HEADER
*
pH
eader
;
DMUS_IO_BAND_TRACK_HEADER
h
eader
;
/* data */
struct
list
Bands
;
...
...
dlls/dmime/segment.c
View file @
43def08e
...
...
@@ -630,6 +630,7 @@ HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_IsDirty (LPPERSISTSTREAM
static
HRESULT
IDirectMusicSegment8Impl_IPersistStream_LoadTrack
(
LPPERSISTSTREAM
iface
,
IStream
*
pClonedStream
,
IDirectMusicTrack
**
ppTrack
,
DMUS_IO_TRACK_HEADER
*
pTrack_hdr
)
{
ICOM_THIS_MULTI
(
IDirectMusicSegment8Impl
,
PersistStreamVtbl
,
iface
);
HRESULT
hr
=
E_FAIL
;
IPersistStream
*
pPersistStream
=
NULL
;
...
...
@@ -654,11 +655,18 @@ static HRESULT IDirectMusicSegment8Impl_IPersistStream_LoadTrack (LPPERSISTSTREA
/* release all loading-related stuff */
IPersistStream_Release
(
pPersistStream
);
hr
=
IDirectMusicSegment8Impl_IDirectMusicSegment8_InsertTrack
((
LPDIRECTMUSICSEGMENT8
)
This
->
SegmentVtbl
,
*
ppTrack
,
pTrack_hdr
->
dwGroup
);
/* at dsPosition */
if
(
FAILED
(
hr
))
{
ERR
(
": could not insert track
\n
"
);
return
hr
;
}
return
S_OK
;
}
static
HRESULT
IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
IDirectMusicSegment8Impl
*
This
)
{
static
HRESULT
IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
/*ICOM_THIS_MULTI(IDirectMusicSegment8Impl, PersistStreamVtbl, iface);*/
HRESULT
hr
=
E_FAIL
;
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
StreamSize
,
StreamCount
,
ListSize
[
3
],
ListCount
[
3
];
...
...
@@ -725,42 +733,13 @@ static HRESULT IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm (LPPERSIST
ERR
(
": could not load track
\n
"
);
return
hr
;
}
IStream_Release
(
pClonedStream
);
hr
=
IDirectMusicSegment8Impl_IDirectMusicSegment8_InsertTrack
((
LPDIRECTMUSICSEGMENT8
)
This
->
SegmentVtbl
,
pTrack
,
track_hdr
.
dwGroup
);
/* at dsPosition */
if
(
FAILED
(
hr
))
{
ERR
(
": could not insert track
\n
"
);
return
hr
;
}
IDirectMusicTrack_Release
(
pTrack
);
pTrack
=
NULL
;
/* now we can release at as it inserted */
IStream_Release
(
pClonedStream
);
#if 0
#else
/*
do {
IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
switch (Chunk.fccID) {
default: {
TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
liMove.QuadPart = Chunk.dwSize;
IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
break;
}
}
TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]);
} while (ListCount[0] < ListSize[0]);
*/
#endif
liMove
.
QuadPart
=
ListSize
[
0
];
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
/*
*/
}
else
{
TRACE_
(
dmfile
)(
": unknown (skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
...
...
@@ -783,7 +762,7 @@ static HRESULT IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm (LPPERSIST
IStream_Clone
(
pStm
,
&
pClonedStream
);
liMove
.
QuadPart
=
0
;
liMove
.
QuadPart
-=
(
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
));
liMove
.
QuadPart
-=
sizeof
(
FOURCC
)
+
(
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
));
IStream_Seek
(
pClonedStream
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
hr
=
IDirectMusicSegment8Impl_IPersistStream_LoadTrack
(
iface
,
pClonedStream
,
&
pTrack
,
&
track_hdr
);
...
...
@@ -791,14 +770,8 @@ static HRESULT IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm (LPPERSIST
ERR
(
": could not load track
\n
"
);
return
hr
;
}
IStream_Release
(
pClonedStream
);
hr
=
IDirectMusicSegment8Impl_IDirectMusicSegment8_InsertTrack
((
LPDIRECTMUSICSEGMENT8
)
This
->
SegmentVtbl
,
pTrack
,
track_hdr
.
dwGroup
);
/* at dsPosition */
if
(
FAILED
(
hr
))
{
ERR
(
": could not insert track
\n
"
);
return
hr
;
}
IDirectMusicTrack_Release
(
pTrack
);
pTrack
=
NULL
;
/* now we can release at as it inserted */
/** now safe move the cursor */
...
...
@@ -830,14 +803,8 @@ static HRESULT IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm (LPPERSIST
ERR
(
": could not load track
\n
"
);
return
hr
;
}
IStream_Release
(
pClonedStream
);
hr
=
IDirectMusicSegment8Impl_IDirectMusicSegment8_InsertTrack
((
LPDIRECTMUSICSEGMENT8
)
This
->
SegmentVtbl
,
pTrack
,
track_hdr
.
dwGroup
);
/* at dsPosition */
if
(
FAILED
(
hr
))
{
ERR
(
": could not insert track
\n
"
);
return
hr
;
}
IDirectMusicTrack_Release
(
pTrack
);
pTrack
=
NULL
;
/* now we can release at as it inserted */
liMove
.
QuadPart
=
Chunk
.
dwSize
;
...
...
@@ -886,7 +853,7 @@ static HRESULT IDirectMusicSegment8Impl_IPersistStream_ParseTrackList (LPPERSIST
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_TRACK_FORM
:
{
TRACE_
(
dmfile
)(
": TRACK form
\n
"
);
hr
=
IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm
(
iface
,
&
Chunk
,
pStm
,
This
);
hr
=
IDirectMusicSegment8Impl_IPersistStream_ParseTrackForm
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
...
...
@@ -939,7 +906,7 @@ static HRESULT IDirectMusicSegment8Impl_IPersistStream_ParseSegmentForm (LPPERSI
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_SEGMENT_CHUNK
:
{
DWORD
checkSz
=
sizeof
(
FOURCC
);
FIXM
E_
(
dmfile
)(
": segment chunk
\n
"
);
TRAC
E_
(
dmfile
)(
": segment chunk
\n
"
);
#if 1
/** DX 7 */
IStream_Read
(
pStm
,
&
This
->
header
.
dwRepeats
,
sizeof
(
This
->
header
.
dwRepeats
),
NULL
);
...
...
dlls/dmime/segtriggertrack.c
View file @
43def08e
...
...
@@ -237,8 +237,8 @@ HRESULT WINAPI IDirectMusicSegTriggerTrack_IPersistStream_IsDirty (LPPERSISTSTRE
return
S_FALSE
;
}
static
HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
IDirectMusicSegTriggerTrack
*
This
)
{
static
HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
ICOM_THIS_MULTI
(
IDirectMusicSegTriggerTrack
,
PersistStreamVtbl
,
iface
);
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
ListSize
[
3
],
ListCount
[
3
];
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
...
...
@@ -308,8 +308,8 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSIS
return
S_OK
;
}
static
HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
IDirectMusicSegTriggerTrack
*
This
)
{
static
HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
/*ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack, PersistStreamVtbl, iface);*/
HRESULT
hr
=
E_FAIL
;
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
ListSize
[
3
],
ListCount
[
3
];
...
...
@@ -336,7 +336,7 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList (LPP
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_SEGMENT_LIST
:
{
TRACE_
(
dmfile
)(
": SEGMENT list
\n
"
);
hr
=
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment
(
iface
,
&
Chunk
,
pStm
,
This
);
hr
=
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
...
...
@@ -362,8 +362,8 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList (LPP
return
S_OK
;
}
static
HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegTrackList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
IDirectMusicSegTriggerTrack
*
This
)
{
static
HRESULT
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegTrackList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
/*ICOM_THIS_MULTI(IDirectMusicSegTriggerTrack, PersistStreamVtbl, iface);*/
HRESULT
hr
=
E_FAIL
;
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
ListSize
[
3
],
ListCount
[
3
];
...
...
@@ -396,7 +396,7 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegTrackList (LPP
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_SEGMENTS_LIST
:
{
TRACE_
(
dmfile
)(
": SEGMENTS list
\n
"
);
hr
=
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList
(
iface
,
&
Chunk
,
pStm
,
This
);
hr
=
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegmentsList
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
...
...
@@ -441,7 +441,7 @@ HRESULT WINAPI IDirectMusicSegTriggerTrack_IPersistStream_Load (LPPERSISTSTREAM
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_SEGTRACK_LIST
:
{
TRACE_
(
dmfile
)(
": segment trigger track list
\n
"
);
hr
=
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegTrackList
(
iface
,
&
Chunk
,
pStm
,
This
);
hr
=
IDirectMusicSegTriggerTrack_IPersistStream_ParseSegTrackList
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
...
...
dlls/dmime/tempotrack.c
View file @
43def08e
...
...
@@ -254,16 +254,16 @@ HRESULT WINAPI IDirectMusicTempoTrack_IPersistStream_Load (LPPERSISTSTREAM iface
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_TEMPO_TRACK
:
{
TRACE_
(
dmfile
)(
":
t
empo track
\n
"
);
TRACE_
(
dmfile
)(
":
T
empo track
\n
"
);
#if 1
IStream_Read
(
pStm
,
&
StreamSize
,
sizeof
(
DWORD
),
NULL
);
StreamSize
-=
sizeof
(
DWORD
);
StreamCount
=
0
;
TRACE_
(
dmfile
)(
"
: items (size = %lu,
chunkSize = %lu)
\n
"
,
StreamSize
,
Chunk
.
dwSize
-
sizeof
(
DWORD
));
TRACE_
(
dmfile
)(
"
- sizeof(DMUS_IO_TEMPO_ITEM): %lu (
chunkSize = %lu)
\n
"
,
StreamSize
,
Chunk
.
dwSize
-
sizeof
(
DWORD
));
do
{
IStream_Read
(
pStm
,
&
item
,
sizeof
(
item
),
NULL
);
++
nItem
;
TRACE_
(
dmfile
)(
"DMUS_IO_TEMPO_ITEM
: item
%ld
\n
"
,
nItem
);
TRACE_
(
dmfile
)(
"DMUS_IO_TEMPO_ITEM
#
%ld
\n
"
,
nItem
);
TRACE_
(
dmfile
)(
" - lTime = %lu
\n
"
,
item
.
lTime
);
TRACE_
(
dmfile
)(
" - dblTempo = %g
\n
"
,
item
.
dblTempo
);
StreamCount
+=
sizeof
(
item
);
...
...
dlls/dmstyle/chordtrack.c
View file @
43def08e
...
...
@@ -241,8 +241,9 @@ HRESULT WINAPI IDirectMusicChordTrack_IPersistStream_IsDirty (LPPERSISTSTREAM if
return
S_FALSE
;
}
static
HRESULT
IDirectMusicChordTrack_IPersistStream_ParseChordTrackList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
IDirectMusicChordTrack
*
This
)
{
static
HRESULT
IDirectMusicChordTrack_IPersistStream_ParseChordTrackList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
ICOM_THIS_MULTI
(
IDirectMusicChordTrack
,
PersistStreamVtbl
,
iface
);
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
ListSize
[
3
],
ListCount
[
3
];
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
...
...
@@ -293,7 +294,7 @@ static HRESULT IDirectMusicChordTrack_IPersistStream_ParseChordTrackList (LPPERS
for
(
it
=
0
;
it
<
num
;
++
it
)
{
IStream_Read
(
pStm
,
&
subchords
,
sizeof
(
DMUS_IO_SUBCHORD
),
NULL
);
TRACE_
(
dmfile
)(
"DMUS_IO_SUBCHORD #%ld
\n
"
,
it
);
TRACE_
(
dmfile
)(
"DMUS_IO_SUBCHORD #%ld
\n
"
,
it
+
1
);
TRACE_
(
dmfile
)(
" - dwChordPattern: %lu
\n
"
,
subchords
.
dwChordPattern
);
TRACE_
(
dmfile
)(
" - dwScalePattern: %lu
\n
"
,
subchords
.
dwScalePattern
);
TRACE_
(
dmfile
)(
" - dwInversionPoints: %lu
\n
"
,
subchords
.
dwInversionPoints
);
...
...
@@ -323,7 +324,7 @@ HRESULT WINAPI IDirectMusicChordTrack_IPersistStream_Load (LPPERSISTSTREAM iface
LARGE_INTEGER
liMove
;
HRESULT
hr
;
FIXME
(
"
: Loading not fully implemented yet
\n
"
);
FIXME
(
"
(%p, %p): Loading not fully implemented yet
\n
"
,
This
,
pStm
);
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
...
...
@@ -334,7 +335,7 @@ HRESULT WINAPI IDirectMusicChordTrack_IPersistStream_Load (LPPERSISTSTREAM iface
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_CHORDTRACK_LIST
:
{
TRACE_
(
dmfile
)(
": Chord track list
\n
"
);
hr
=
IDirectMusicChordTrack_IPersistStream_ParseChordTrackList
(
iface
,
&
Chunk
,
pStm
,
This
);
hr
=
IDirectMusicChordTrack_IPersistStream_ParseChordTrackList
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
...
...
@@ -354,8 +355,7 @@ HRESULT WINAPI IDirectMusicChordTrack_IPersistStream_Load (LPPERSISTSTREAM iface
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
/* skip the rest of the chunk */
return
E_FAIL
;
}
}
}
return
S_OK
;
}
...
...
@@ -386,21 +386,21 @@ ICOM_VTABLE(IPersistStream) DirectMusicChordTrack_PersistStream_Vtbl = {
/* for ClassFactory */
HRESULT
WINAPI
DMUSIC_CreateDirectMusicChordTrack
(
LPCGUID
lpcGUID
,
LPVOID
*
ppobj
,
LPUNKNOWN
pUnkOuter
)
{
IDirectMusicChordTrack
*
track
;
track
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicChordTrack
));
if
(
NULL
==
track
)
{
*
ppobj
=
(
LPVOID
)
NULL
;
return
E_OUTOFMEMORY
;
}
track
->
UnknownVtbl
=
&
DirectMusicChordTrack_Unknown_Vtbl
;
track
->
TrackVtbl
=
&
DirectMusicChordTrack_Track_Vtbl
;
track
->
PersistStreamVtbl
=
&
DirectMusicChordTrack_PersistStream_Vtbl
;
track
->
pDesc
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_OBJECTDESC
));
DM_STRUCT_INIT
(
track
->
pDesc
);
track
->
pDesc
->
dwValidData
|=
DMUS_OBJ_CLASS
;
memcpy
(
&
track
->
pDesc
->
guidClass
,
&
CLSID_DirectMusicChordTrack
,
sizeof
(
CLSID
));
track
->
ref
=
0
;
/* will be inited by QueryInterface */
return
IDirectMusicChordTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
track
->
UnknownVtbl
,
lpcGUID
,
ppobj
);
IDirectMusicChordTrack
*
track
;
track
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicChordTrack
));
if
(
NULL
==
track
)
{
*
ppobj
=
(
LPVOID
)
NULL
;
return
E_OUTOFMEMORY
;
}
track
->
UnknownVtbl
=
&
DirectMusicChordTrack_Unknown_Vtbl
;
track
->
TrackVtbl
=
&
DirectMusicChordTrack_Track_Vtbl
;
track
->
PersistStreamVtbl
=
&
DirectMusicChordTrack_PersistStream_Vtbl
;
track
->
pDesc
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_OBJECTDESC
));
DM_STRUCT_INIT
(
track
->
pDesc
);
track
->
pDesc
->
dwValidData
|=
DMUS_OBJ_CLASS
;
memcpy
(
&
track
->
pDesc
->
guidClass
,
&
CLSID_DirectMusicChordTrack
,
sizeof
(
CLSID
));
track
->
ref
=
0
;
/* will be inited by QueryInterface */
return
IDirectMusicChordTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
track
->
UnknownVtbl
,
lpcGUID
,
ppobj
);
}
dlls/dmstyle/styletrack.c
View file @
43def08e
...
...
@@ -226,60 +226,226 @@ ULONG WINAPI IDirectMusicStyleTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface
}
ULONG
WINAPI
IDirectMusicStyleTrack_IPersistStream_Release
(
LPPERSISTSTREAM
iface
)
{
ICOM_THIS_MULTI
(
IDirectMusicStyleTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicStyleTrack_IUnknown_Release
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
ICOM_THIS_MULTI
(
IDirectMusicStyleTrack
,
PersistStreamVtbl
,
iface
);
return
IDirectMusicStyleTrack_IUnknown_Release
((
LPUNKNOWN
)
&
This
->
UnknownVtbl
);
}
HRESULT
WINAPI
IDirectMusicStyleTrack_IPersistStream_GetClassID
(
LPPERSISTSTREAM
iface
,
CLSID
*
pClassID
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicStyleTrack
,
PersistStreamVtbl
,
iface
);
TRACE
(
"(%p, %p)
\n
"
,
This
,
pClassID
);
memcpy
(
pClassID
,
&
CLSID_DirectMusicStyleTrack
,
sizeof
(
CLSID
));
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicStyleTrack_IPersistStream_IsDirty
(
LPPERSISTSTREAM
iface
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicStyleTrack
,
PersistStreamVtbl
,
iface
);
FIXME
(
"(%p): stub, always S_FALSE
\n
"
,
This
);
return
S_FALSE
;
}
static
HRESULT
IDirectMusicStyleTrack_IPersistStream_ParseStyleRef
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
/*ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);*/
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
ListSize
[
3
],
ListCount
[
3
];
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
DWORD
dwTimeStamp
;
if
(
pChunk
->
fccID
!=
DMUS_FOURCC_STYLE_REF_LIST
)
{
ERR_
(
dmfile
)(
": %s chunk should be a SEGMENT list
\n
"
,
debugstr_fourcc
(
pChunk
->
fccID
));
return
E_FAIL
;
}
ListSize
[
0
]
=
pChunk
->
dwSize
-
sizeof
(
FOURCC
);
ListCount
[
0
]
=
0
;
do
{
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
ListCount
[
0
]
+=
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
)
+
Chunk
.
dwSize
;
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_TIME_STAMP_CHUNK
:
{
TRACE_
(
dmfile
)(
": Time Stamp chunck
\n
"
);
IStream_Read
(
pStm
,
&
dwTimeStamp
,
sizeof
(
DWORD
),
NULL
);
TRACE_
(
dmfile
)(
" - dwTimeStamp: %lu
\n
"
,
dwTimeStamp
);
break
;
}
case
FOURCC_LIST
:
{
IStream_Read
(
pStm
,
&
Chunk
.
fccID
,
sizeof
(
FOURCC
),
NULL
);
TRACE_
(
dmfile
)(
": LIST chunk of type %s"
,
debugstr_fourcc
(
Chunk
.
fccID
));
ListSize
[
1
]
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
ListCount
[
1
]
=
0
;
switch
(
Chunk
.
fccID
)
{
/**
* should be a DMRF (DirectMusic Reference) list @TODO
*/
case
DMUS_FOURCC_REF_LIST
:
{
FIXME_
(
dmfile
)(
": DMRF (DM References) list, not yet handled
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown (skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown chunk (irrevelant & skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
TRACE_
(
dmfile
)(
": ListCount[0] = %ld < ListSize[0] = %ld
\n
"
,
ListCount
[
0
],
ListSize
[
0
]);
}
while
(
ListCount
[
0
]
<
ListSize
[
0
]);
return
S_OK
;
}
static
HRESULT
IDirectMusicStyleTrack_IPersistStream_ParseStyleTrackList
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
)
{
/*ICOM_THIS_MULTI(IDirectMusicStyleTrack, PersistStreamVtbl, iface);*/
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
ListSize
[
3
],
ListCount
[
3
];
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
HRESULT
hr
;
if
(
pChunk
->
fccID
!=
DMUS_FOURCC_STYLE_TRACK_LIST
)
{
ERR_
(
dmfile
)(
": %s chunk should be a STYLETRACK list
\n
"
,
debugstr_fourcc
(
pChunk
->
fccID
));
return
E_FAIL
;
}
ListSize
[
0
]
=
pChunk
->
dwSize
-
sizeof
(
FOURCC
);
ListCount
[
0
]
=
0
;
do
{
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
ListCount
[
0
]
+=
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
)
+
Chunk
.
dwSize
;
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
FOURCC_LIST
:
{
IStream_Read
(
pStm
,
&
Chunk
.
fccID
,
sizeof
(
FOURCC
),
NULL
);
TRACE_
(
dmfile
)(
": LIST chunk of type %s"
,
debugstr_fourcc
(
Chunk
.
fccID
));
ListSize
[
1
]
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
ListCount
[
1
]
=
0
;
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_STYLE_REF_LIST
:
{
TRACE_
(
dmfile
)(
": STYLE_REF list
\n
"
);
hr
=
IDirectMusicStyleTrack_IPersistStream_ParseStyleRef
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown (skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
-
sizeof
(
FOURCC
);
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unknown chunk (irrevelant & skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
TRACE_
(
dmfile
)(
": ListCount[0] = %ld < ListSize[0] = %ld
\n
"
,
ListCount
[
0
],
ListSize
[
0
]);
}
while
(
ListCount
[
0
]
<
ListSize
[
0
]);
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicStyleTrack_IPersistStream_Load
(
LPPERSISTSTREAM
iface
,
IStream
*
pStm
)
{
FIXME
(
": Loading not implemented yet
\n
"
);
return
S_OK
;
ICOM_THIS_MULTI
(
IDirectMusicStyleTrack
,
PersistStreamVtbl
,
iface
);
DMUS_PRIVATE_CHUNK
Chunk
;
LARGE_INTEGER
liMove
;
HRESULT
hr
;
FIXME
(
"(%p, %p): Loading not fully implemented yet
\n
"
,
This
,
pStm
);
IStream_Read
(
pStm
,
&
Chunk
,
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
),
NULL
);
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
FOURCC_LIST
:
{
IStream_Read
(
pStm
,
&
Chunk
.
fccID
,
sizeof
(
FOURCC
),
NULL
);
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_STYLE_TRACK_LIST
:
{
TRACE_
(
dmfile
)(
": Chord track list
\n
"
);
hr
=
IDirectMusicStyleTrack_IPersistStream_ParseStyleTrackList
(
iface
,
&
Chunk
,
pStm
);
if
(
FAILED
(
hr
))
return
hr
;
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unexpected chunk; loading failed)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
return
E_FAIL
;
}
}
TRACE_
(
dmfile
)(
": reading finished
\n
"
);
break
;
}
default:
{
TRACE_
(
dmfile
)(
": unexpected chunk; loading failed)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
/* skip the rest of the chunk */
return
E_FAIL
;
}
}
return
S_OK
;
}
HRESULT
WINAPI
IDirectMusicStyleTrack_IPersistStream_Save
(
LPPERSISTSTREAM
iface
,
IStream
*
pStm
,
BOOL
fClearDirty
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicStyleTrack
,
PersistStreamVtbl
,
iface
);
FIXME
(
"(%p): Saving not implemented yet
\n
"
,
This
);
return
E_NOTIMPL
;
}
HRESULT
WINAPI
IDirectMusicStyleTrack_IPersistStream_GetSizeMax
(
LPPERSISTSTREAM
iface
,
ULARGE_INTEGER
*
pcbSize
)
{
return
E_NOTIMPL
;
ICOM_THIS_MULTI
(
IDirectMusicStyleTrack
,
PersistStreamVtbl
,
iface
);
FIXME
(
"(%p, %p): stub
\n
"
,
This
,
pcbSize
);
return
E_NOTIMPL
;
}
ICOM_VTABLE
(
IPersistStream
)
DirectMusicStyleTrack_PersistStream_Vtbl
=
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicStyleTrack_IPersistStream_QueryInterface
,
IDirectMusicStyleTrack_IPersistStream_AddRef
,
IDirectMusicStyleTrack_IPersistStream_Release
,
IDirectMusicStyleTrack_IPersistStream_GetClassID
,
IDirectMusicStyleTrack_IPersistStream_IsDirty
,
IDirectMusicStyleTrack_IPersistStream_Load
,
IDirectMusicStyleTrack_IPersistStream_Save
,
IDirectMusicStyleTrack_IPersistStream_GetSizeMax
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectMusicStyleTrack_IPersistStream_QueryInterface
,
IDirectMusicStyleTrack_IPersistStream_AddRef
,
IDirectMusicStyleTrack_IPersistStream_Release
,
IDirectMusicStyleTrack_IPersistStream_GetClassID
,
IDirectMusicStyleTrack_IPersistStream_IsDirty
,
IDirectMusicStyleTrack_IPersistStream_Load
,
IDirectMusicStyleTrack_IPersistStream_Save
,
IDirectMusicStyleTrack_IPersistStream_GetSizeMax
};
/* for ClassFactory */
HRESULT
WINAPI
DMUSIC_CreateDirectMusicStyleTrack
(
LPCGUID
lpcGUID
,
LPVOID
*
ppobj
,
LPUNKNOWN
pUnkOuter
)
{
IDirectMusicStyleTrack
*
track
;
track
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicStyleTrack
));
if
(
NULL
==
track
)
{
*
ppobj
=
(
LPVOID
)
NULL
;
return
E_OUTOFMEMORY
;
}
track
->
UnknownVtbl
=
&
DirectMusicStyleTrack_Unknown_Vtbl
;
track
->
TrackVtbl
=
&
DirectMusicStyleTrack_Track_Vtbl
;
track
->
PersistStreamVtbl
=
&
DirectMusicStyleTrack_PersistStream_Vtbl
;
track
->
pDesc
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_OBJECTDESC
));
DM_STRUCT_INIT
(
track
->
pDesc
);
track
->
pDesc
->
dwValidData
|=
DMUS_OBJ_CLASS
;
memcpy
(
&
track
->
pDesc
->
guidClass
,
&
CLSID_DirectMusicStyleTrack
,
sizeof
(
CLSID
));
track
->
ref
=
0
;
/* will be inited by QueryInterface */
return
IDirectMusicStyleTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
track
->
UnknownVtbl
,
lpcGUID
,
ppobj
);
IDirectMusicStyleTrack
*
track
;
track
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicStyleTrack
));
if
(
NULL
==
track
)
{
*
ppobj
=
(
LPVOID
)
NULL
;
return
E_OUTOFMEMORY
;
}
track
->
UnknownVtbl
=
&
DirectMusicStyleTrack_Unknown_Vtbl
;
track
->
TrackVtbl
=
&
DirectMusicStyleTrack_Track_Vtbl
;
track
->
PersistStreamVtbl
=
&
DirectMusicStyleTrack_PersistStream_Vtbl
;
track
->
pDesc
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_OBJECTDESC
));
DM_STRUCT_INIT
(
track
->
pDesc
);
track
->
pDesc
->
dwValidData
|=
DMUS_OBJ_CLASS
;
memcpy
(
&
track
->
pDesc
->
guidClass
,
&
CLSID_DirectMusicStyleTrack
,
sizeof
(
CLSID
));
track
->
ref
=
0
;
/* will be inited by QueryInterface */
return
IDirectMusicStyleTrack_IUnknown_QueryInterface
((
LPUNKNOWN
)
&
track
->
UnknownVtbl
,
lpcGUID
,
ppobj
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment