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
10509573
Commit
10509573
authored
Oct 28, 2003
by
Rok Mandeljc
Committed by
Alexandre Julliard
Oct 28, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Some fixes in dmband loading.
parent
897beee5
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
272 additions
and
83 deletions
+272
-83
band.c
dlls/dmband/band.c
+75
-27
bandtrack.c
dlls/dmband/bandtrack.c
+145
-22
dmband_private.h
dlls/dmband/dmband_private.h
+52
-34
No files found.
dlls/dmband/band.c
View file @
10509573
...
...
@@ -39,8 +39,7 @@ HRESULT WINAPI IDirectMusicBandImpl_QueryInterface (LPDIRECTMUSICBAND iface, REF
ICOM_THIS
(
IDirectMusicBandImpl
,
iface
);
if
(
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
||
IsEqualGUID
(
riid
,
&
IID_IDirectMusicBand
))
{
IsEqualGUID
(
riid
,
&
IID_IDirectMusicBand
))
{
IDirectMusicBandImpl_AddRef
(
iface
);
*
ppobj
=
This
;
return
S_OK
;
...
...
@@ -61,8 +60,7 @@ ULONG WINAPI IDirectMusicBandImpl_Release (LPDIRECTMUSICBAND iface)
ICOM_THIS
(
IDirectMusicBandImpl
,
iface
);
ULONG
ref
=
--
This
->
ref
;
TRACE
(
"(%p) : ReleaseRef to %ld
\n
"
,
This
,
This
->
ref
);
if
(
ref
==
0
)
{
if
(
ref
==
0
)
{
HeapFree
(
GetProcessHeap
(),
0
,
This
);
}
return
ref
;
...
...
@@ -112,8 +110,7 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicBand (LPCGUID lpcGUID, LPDIRECTMUSICBAND*
{
IDirectMusicBandImpl
*
dmband
;
if
(
IsEqualGUID
(
lpcGUID
,
&
IID_IDirectMusicBand
))
{
if
(
IsEqualGUID
(
lpcGUID
,
&
IID_IDirectMusicBand
))
{
dmband
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicBandImpl
));
if
(
NULL
==
dmband
)
{
*
ppDMBand
=
(
LPDIRECTMUSICBAND
)
NULL
;
...
...
@@ -121,6 +118,7 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicBand (LPCGUID lpcGUID, LPDIRECTMUSICBAND*
}
dmband
->
lpVtbl
=
&
DirectMusicBand_Vtbl
;
dmband
->
ref
=
1
;
list_init
(
&
dmband
->
Instruments
);
*
ppDMBand
=
(
LPDIRECTMUSICBAND
)
dmband
;
return
S_OK
;
}
...
...
@@ -325,12 +323,12 @@ HRESULT WINAPI IDirectMusicBandObjectStream_Load (LPPERSISTSTREAM iface, IStream
switch
(
chunkID
)
{
case
DMUS_FOURCC_GUID_CHUNK
:
{
TRACE_
(
dmfile
)(
": GUID chunk
\n
"
);
IStream_Read
(
pStm
,
&
pBand
->
vVersion
,
chunkSize
,
NULL
);
IStream_Read
(
pStm
,
pBand
->
guidID
,
chunkSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_VERSION_CHUNK
:
{
TRACE_
(
dmfile
)(
": version chunk
\n
"
);
IStream_Read
(
pStm
,
&
pBand
->
guidID
,
chunkSize
,
NULL
);
IStream_Read
(
pStm
,
pBand
->
vVersion
,
chunkSize
,
NULL
);
break
;
}
case
FOURCC_LIST
:
{
...
...
@@ -347,34 +345,41 @@ HRESULT WINAPI IDirectMusicBandObjectStream_Load (LPPERSISTSTREAM iface, IStream
ListCount
[
0
]
+=
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
)
+
chunkSize
;
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
chunkID
),
chunkSize
);
switch
(
chunkID
)
{
/* don't ask me why, but M$ puts INFO elements in UNFO list sometimes
(though strings seem to be valid unicode) */
case
mmioFOURCC
(
'I'
,
'N'
,
'A'
,
'M'
):
case
DMUS_FOURCC_UNAM_CHUNK
:
{
TRACE_
(
dmfile
)(
": name chunk
\n
"
);
pBand
->
w
s
zName
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
w
s
zName
,
chunkSize
,
NULL
);
pBand
->
wzName
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
wzName
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'A'
,
'R'
,
'T'
):
case
DMUS_FOURCC_UART_CHUNK
:
{
TRACE_
(
dmfile
)(
": artist chunk
\n
"
);
pBand
->
w
s
zArtist
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
w
s
zArtist
,
chunkSize
,
NULL
);
pBand
->
wzArtist
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
wzArtist
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'C'
,
'O'
,
'P'
):
case
DMUS_FOURCC_UCOP_CHUNK
:
{
TRACE_
(
dmfile
)(
": copyright chunk
\n
"
);
pBand
->
w
s
zCopyright
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
w
s
zCopyright
,
chunkSize
,
NULL
);
pBand
->
wzCopyright
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
wzCopyright
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'S'
,
'B'
,
'J'
):
case
DMUS_FOURCC_USBJ_CHUNK
:
{
TRACE_
(
dmfile
)(
": subject chunk
\n
"
);
pBand
->
w
s
zSubject
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
w
s
zSubject
,
chunkSize
,
NULL
);
pBand
->
wzSubject
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
wzSubject
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'C'
,
'M'
,
'T'
):
case
DMUS_FOURCC_UCMT_CHUNK
:
{
TRACE_
(
dmfile
)(
": comment chunk
\n
"
);
pBand
->
w
s
zComment
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
w
s
zComment
,
chunkSize
,
NULL
);
pBand
->
wzComment
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pBand
->
wzComment
,
chunkSize
,
NULL
);
break
;
}
default:
{
...
...
@@ -403,6 +408,8 @@ HRESULT WINAPI IDirectMusicBandObjectStream_Load (LPPERSISTSTREAM iface, IStream
ListCount
[
1
]
=
0
;
switch
(
chunkID
)
{
case
DMUS_FOURCC_INSTRUMENT_LIST
:
{
/* init new instrument list entry */
LPDMUS_PRIVATE_INSTRUMENT
pNewInstrument
=
(
LPDMUS_PRIVATE_INSTRUMENT
)
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_PRIVATE_INSTRUMENT
));
TRACE_
(
dmfile
)(
": instrument list
\n
"
);
do
{
IStream_Read
(
pStm
,
&
chunkID
,
sizeof
(
FOURCC
),
NULL
);
...
...
@@ -412,7 +419,7 @@ HRESULT WINAPI IDirectMusicBandObjectStream_Load (LPPERSISTSTREAM iface, IStream
switch
(
chunkID
)
{
case
DMUS_FOURCC_INSTRUMENT_CHUNK
:
{
TRACE_
(
dmfile
)(
": band instrument header
\n
"
);
IStream_Read
(
pStm
,
&
p
Band
->
pInstruments
[
pBand
->
dwInstruments
]
,
chunkSize
,
NULL
);
IStream_Read
(
pStm
,
&
p
NewInstrument
->
pInstrument
,
chunkSize
,
NULL
);
break
;
}
case
FOURCC_LIST
:
{
...
...
@@ -489,7 +496,7 @@ ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.w
IDirectMusicObject
*
pObject
;
if
(
FAILED
(
IDirectMusicLoader_GetObject
(
pLoader
,
&
ObjDesc
,
&
IID_IDirectMusicObject
,
(
LPVOID
*
)
&
pObject
)))
/* acquire collection from loaded referenced object */
if
(
FAILED
(
IDirectMusicObject_QueryInterface
(
pObject
,
&
IID_IDirectMusicCollection
,
(
LPVOID
*
)
&
p
Band
->
ppReferenceCollection
[
pBand
->
dwInstruments
]
)))
if
(
FAILED
(
IDirectMusicObject_QueryInterface
(
pObject
,
&
IID_IDirectMusicCollection
,
(
LPVOID
*
)
&
p
NewInstrument
->
ppReferenceCollection
)))
IDirectMusicLoader_Release
(
pLoader
);
}
IDirectMusicGetLoader_Release
(
pGetLoader
);
...
...
@@ -515,13 +522,11 @@ ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.w
}
TRACE_
(
dmfile
)(
": ListCount[1] = %ld < ListSize[1] = %ld
\n
"
,
ListCount
[
1
],
ListSize
[
1
]);
}
while
(
ListCount
[
1
]
<
ListSize
[
1
]);
/* causes crash :( */
#if 0
/* hmm... in dxdiag segment's band there aren't any references, but loader still desperatly
loads default collection... does that mean that if there is no reference, use default?
*/
if (!pBand->ppReferenceCollection[pBand->dwInstruments]
) {
TRACE
(": (READ): loading default collection (as no specific reference was made)\n");
if
(
!
pNewInstrument
->
ppReferenceCollection
)
{
TRACE_
(
dmfile
)
(
": (READ): loading default collection (as no specific reference was made)
\n
"
);
ZeroMemory
((
LPVOID
)
&
ObjDesc
,
sizeof
(
DMUS_OBJECTDESC
));
ObjDesc
.
dwSize
=
sizeof
(
DMUS_OBJECTDESC
);
ObjDesc
.
dwValidData
=
DMUS_OBJ_CLASS
|
DMUS_OBJ_OBJECT
;
...
...
@@ -531,7 +536,7 @@ ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.w
if
(
SUCCEEDED
(
IDirectMusicGetLoader_GetLoader
(
pGetLoader
,
&
pLoader
)))
{
IDirectMusicObject
*
pObject
;
if
(
SUCCEEDED
(
IDirectMusicLoader_GetObject
(
pLoader
,
&
ObjDesc
,
&
IID_IDirectMusicObject
,
(
LPVOID
*
)
&
pObject
)))
{
IDirectMusicObject_QueryInterface (pObject, &IID_IDirectMusicCollection, (LPVOID*)&pBand->ppReferenceCollection[pBand->dwInstruments]
);
IDirectMusicObject_QueryInterface
(
pObject
,
&
IID_IDirectMusicCollection
,
(
LPVOID
*
)
&
pNewInstrument
->
ppReferenceCollection
);
IDirectMusicLoader_Release
(
pLoader
);
}
}
...
...
@@ -541,8 +546,7 @@ ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.w
/* E_FAIL */
}
}
#endif
pBand
->
dwInstruments
++
;
/* add count */
list_add_tail
(
&
This
->
pParentObject
->
pBand
->
Instruments
,
&
pNewInstrument
->
entry
);
break
;
}
default:
{
...
...
@@ -601,6 +605,50 @@ ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.w
}
}
/* DEBUG: dumps whole band object tree: */
if
(
TRACE_ON
(
dmband
))
{
int
r
=
0
;
DMUS_PRIVATE_INSTRUMENT
*
tmpEntry
;
struct
list
*
listEntry
;
TRACE
(
"*** IDirectMusicBand (%p) ***
\n
"
,
pBand
);
if
(
pBand
->
guidID
)
TRACE
(
" - GUID = %s
\n
"
,
debugstr_guid
(
pBand
->
guidID
));
if
(
pBand
->
vVersion
)
TRACE
(
" - Version = %i,%i,%i,%i
\n
"
,
(
pBand
->
vVersion
->
dwVersionMS
>>
8
)
&&
0x0000FFFF
,
pBand
->
vVersion
->
dwVersionMS
&&
0x0000FFFF
,
\
(
pBand
->
vVersion
->
dwVersionLS
>>
8
)
&&
0x0000FFFF
,
pBand
->
vVersion
->
dwVersionLS
&&
0x0000FFFF
);
if
(
pBand
->
wzName
)
TRACE
(
" - Name = %s
\n
"
,
debugstr_w
(
pBand
->
wzName
));
if
(
pBand
->
wzArtist
)
TRACE
(
" - Artist = %s
\n
"
,
debugstr_w
(
pBand
->
wzArtist
));
if
(
pBand
->
wzCopyright
)
TRACE
(
" - Copyright = %s
\n
"
,
debugstr_w
(
pBand
->
wzCopyright
));
if
(
pBand
->
wzSubject
)
TRACE
(
" - Subject = %s
\n
"
,
debugstr_w
(
pBand
->
wzSubject
));
if
(
pBand
->
wzComment
)
TRACE
(
" - Comment = %s
\n
"
,
debugstr_w
(
pBand
->
wzComment
));
TRACE
(
" - Instruments:
\n
"
);
LIST_FOR_EACH
(
listEntry
,
&
This
->
pParentObject
->
pBand
->
Instruments
)
{
tmpEntry
=
LIST_ENTRY
(
listEntry
,
DMUS_PRIVATE_INSTRUMENT
,
entry
);
TRACE
(
" - Instrument[%i]:
\n
"
,
r
);
TRACE
(
" - Instrument header:
\n
"
);
TRACE
(
" - dwPatch = %ld
\n
"
,
tmpEntry
->
pInstrument
.
dwPatch
);
TRACE
(
" - dwAssignPatch = %ld
\n
"
,
tmpEntry
->
pInstrument
.
dwAssignPatch
);
TRACE
(
" - dwNoteRanges[4] = %ln
\n
"
,
tmpEntry
->
pInstrument
.
dwNoteRanges
);
TRACE
(
" - dwPChannel = %ld
\n
"
,
tmpEntry
->
pInstrument
.
dwPChannel
);
TRACE
(
" - dwFlags = %ld
\n
"
,
tmpEntry
->
pInstrument
.
dwFlags
);
TRACE
(
" - bPan = %i
\n
"
,
tmpEntry
->
pInstrument
.
bPan
);
TRACE
(
" - bVolume = %i
\n
"
,
tmpEntry
->
pInstrument
.
bVolume
);
TRACE
(
" - nTranspose = %i
\n
"
,
tmpEntry
->
pInstrument
.
nTranspose
);
TRACE
(
" - dwChannelPriority = %ld
\n
"
,
tmpEntry
->
pInstrument
.
dwChannelPriority
);
TRACE
(
" - nPitchBendRange = %i
\n
"
,
tmpEntry
->
pInstrument
.
nPitchBendRange
);
TRACE
(
" - Reference collection: %p
\n
"
,
tmpEntry
->
ppReferenceCollection
);
r
++
;
}
}
return
S_OK
;
}
...
...
dlls/dmband/bandtrack.c
View file @
10509573
...
...
@@ -30,6 +30,7 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
dmband
);
WINE_DECLARE_DEBUG_CHANNEL
(
dmfile
);
/*****************************************************************************
* IDirectMusicBandTrack implementation
*/
...
...
@@ -103,8 +104,75 @@ HRESULT WINAPI IDirectMusicBandTrack_Play (LPDIRECTMUSICTRACK8 iface, void* pSta
{
ICOM_THIS
(
IDirectMusicBandTrack
,
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): 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
*/
#if 0
/* get the graph and segment */
IDirectMusicSegment* pSegment; /* needed for getting track group */
IDirectMusicGraph* pGraph; /* needed for PMsg stamping */
DWORD dwGroup;
if (FAILED(IDirectMusicSegmentState_GetSegment (pSegSt, &pSegment))) {
ERR("failed to get segment\n");
return E_FAIL;
}
/* HINT: M$ lies when saying that we can query segment for graph; one can obtain graph only
by querying segment state or performance */
if (FAILED(IDirectMusicSegmentState_QueryInterface (pSegSt, &IID_IDirectMusicGraph, (LPVOID*)&pGraph))) {
ERR("failed to get graph on segment\n");
return E_FAIL;
}
IDirectMusicSegment_GetTrackGroup (pSegment, (LPDIRECTMUSICTRACK)iface, &dwGroup);
/* iterate through band list to get appropriate band */
DMUS_PRIVATE_BAND *tmpBandEntry;
struct list *listEntry;
IDirectMusicBandImpl* pBand = NULL;
LIST_FOR_EACH (listEntry, &This->Bands) {
tmpBandEntry = LIST_ENTRY (listEntry, DMUS_PRIVATE_BAND, entry);
/* FIXME: time checking is far from perfect: i don't know if times are properly compared and
in case of v.2 header i don't know which time to take; besides, first band with smaller
time will be taken */
if (((tmpBandEntry->pBandHeader.dwVersion = 1) && (tmpBandEntry->pBandHeader.lBandTime < mtStart))
|| ((tmpBandEntry->pBandHeader.dwVersion = 2) && (tmpBandEntry->pBandHeader.lBandTimeLogical < mtStart))) {
pBand = tmpBandEntry->ppBand;
break;
}
}
int r = 0; /* TEST */
/* now iterate through instruments list on selected band and fill and send all messages related to it */
DMUS_PRIVATE_INSTRUMENT *tmpInstrumentEntry;
LIST_FOR_EACH (listEntry, &pBand->Instruments) {
tmpInstrumentEntry = LIST_ENTRY (listEntry, DMUS_PRIVATE_INSTRUMENT, entry);
FIXME("parsing instrument [%i]\n", r);
r++;
/* allocate the msg */
DMUS_CHANNEL_MIDI_PMSG* pMIDI = NULL;
if (FAILED(IDirectMusicPerformance_AllocPMsg (pPerf, sizeof(DMUS_MIDI_PMSG), (DMUS_PMSG**)&pMIDI))) {
ERR("could not allocate PMsg\n");
}
/* HERE THE MESSAGE DATA SHOULD BE PUT IN */
if (FAILED(IDirectMusicGraph_StampPMsg (pGraph, (DMUS_PMSG*)pMIDI))) {
ERR("could not stamp PMsg\n");
}
if (FAILED(IDirectMusicPerformance_SendPMsg (pPerf, (DMUS_PMSG*)pMIDI))) {
ERR("could not send PMsg\n");
}
}
#endif
return
S_OK
;
}
...
...
@@ -260,6 +328,7 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicBandTrack (LPCGUID lpcGUID, LPDIRECTMUSIC
}
track
->
lpVtbl
=
&
DirectMusicBandTrack_Vtbl
;
track
->
ref
=
1
;
list_init
(
&
track
->
Bands
);
track
->
pStream
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectMusicBandTrackStream
));
track
->
pStream
->
lpVtbl
=
&
DirectMusicBandTrackStream_Vtbl
;
track
->
pStream
->
ref
=
1
;
...
...
@@ -354,17 +423,17 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
switch
(
chunkID
)
{
case
DMUS_FOURCC_BANDTRACK_CHUNK
:
{
TRACE_
(
dmfile
)(
": band track header chunk
\n
"
);
IStream_Read
(
pStm
,
&
pTrack
->
btkHeader
,
chunkSize
,
NULL
);
IStream_Read
(
pStm
,
pTrack
->
btkHeader
,
chunkSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_GUID_CHUNK
:
{
TRACE_
(
dmfile
)(
": GUID chunk
\n
"
);
IStream_Read
(
pStm
,
&
pTrack
->
vVersion
,
chunkSize
,
NULL
);
IStream_Read
(
pStm
,
pTrack
->
guidID
,
chunkSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_VERSION_CHUNK
:
{
TRACE_
(
dmfile
)(
": version chunk
\n
"
);
IStream_Read
(
pStm
,
&
pTrack
->
guidID
,
chunkSize
,
NULL
);
IStream_Read
(
pStm
,
pTrack
->
vVersion
,
chunkSize
,
NULL
);
break
;
}
case
FOURCC_LIST
:
{
...
...
@@ -381,34 +450,41 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
ListCount
[
0
]
+=
sizeof
(
FOURCC
)
+
sizeof
(
DWORD
)
+
chunkSize
;
TRACE_
(
dmfile
)(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
chunkID
),
chunkSize
);
switch
(
chunkID
)
{
/* don't ask me why, but M$ puts INFO elements in UNFO list sometimes
(though strings seem to be valid unicode) */
case
mmioFOURCC
(
'I'
,
'N'
,
'A'
,
'M'
):
case
DMUS_FOURCC_UNAM_CHUNK
:
{
TRACE_
(
dmfile
)(
": name chunk
\n
"
);
pTrack
->
w
s
zName
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
w
s
zName
,
chunkSize
,
NULL
);
pTrack
->
wzName
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
wzName
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'A'
,
'R'
,
'T'
):
case
DMUS_FOURCC_UART_CHUNK
:
{
TRACE_
(
dmfile
)(
": artist chunk
\n
"
);
pTrack
->
w
s
zArtist
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
w
s
zArtist
,
chunkSize
,
NULL
);
pTrack
->
wzArtist
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
wzArtist
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'C'
,
'O'
,
'P'
):
case
DMUS_FOURCC_UCOP_CHUNK
:
{
TRACE_
(
dmfile
)(
": copyright chunk
\n
"
);
pTrack
->
w
s
zCopyright
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
w
s
zCopyright
,
chunkSize
,
NULL
);
pTrack
->
wzCopyright
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
wzCopyright
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'S'
,
'B'
,
'J'
):
case
DMUS_FOURCC_USBJ_CHUNK
:
{
TRACE_
(
dmfile
)(
": subject chunk
\n
"
);
pTrack
->
w
s
zSubject
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
w
s
zSubject
,
chunkSize
,
NULL
);
pTrack
->
wzSubject
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
wzSubject
,
chunkSize
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'C'
,
'M'
,
'T'
):
case
DMUS_FOURCC_UCMT_CHUNK
:
{
TRACE_
(
dmfile
)(
": comment chunk
\n
"
);
pTrack
->
w
s
zComment
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
w
s
zComment
,
chunkSize
,
NULL
);
pTrack
->
wzComment
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
chunkSize
);
IStream_Read
(
pStm
,
pTrack
->
wzComment
,
chunkSize
,
NULL
);
break
;
}
default:
{
...
...
@@ -437,6 +513,8 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
ListCount
[
1
]
=
0
;
switch
(
chunkID
)
{
case
DMUS_FOURCC_BAND_LIST
:
{
/* init new band list entry */
LPDMUS_PRIVATE_BAND
pNewBand
=
(
LPDMUS_PRIVATE_BAND
)
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DMUS_PRIVATE_BAND
));
TRACE_
(
dmfile
)(
": band list
\n
"
);
do
{
IStream_Read
(
pStm
,
&
chunkID
,
sizeof
(
FOURCC
),
NULL
);
...
...
@@ -448,18 +526,17 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
TRACE_
(
dmfile
)(
": band item header (v.1) chunk
\n
"
);
IStream_Read
(
pStm
,
&
tempHeaderV1
,
chunkSize
,
NULL
);
/* now transfer data to universal header */
pTrack
->
pBandHeaders
[
pTrack
->
dwBands
].
dwVersion
=
1
;
pTrack
->
pBandHeaders
[
pTrack
->
dwBands
].
lBandTime
=
tempHeaderV1
.
lBandTime
;
TRACE_
(
dmfile
)(
": (READ): header: lBandTime = %li
\n
"
,
tempHeaderV1
.
lBandTime
);
pNewBand
->
pBandHeader
.
dwVersion
=
1
;
pNewBand
->
pBandHeader
.
lBandTime
=
tempHeaderV1
.
lBandTime
;
break
;
}
case
DMUS_FOURCC_BANDITEM_CHUNK2
:
{
TRACE_
(
dmfile
)(
": band item header (v.2) chunk
\n
"
);
IStream_Read
(
pStm
,
&
tempHeaderV2
,
chunkSize
,
NULL
);
/* now transfer data to universal header */
p
Track
->
pBandHeaders
[
pTrack
->
dwBands
]
.
dwVersion
=
2
;
p
Track
->
pBandHeaders
[
pTrack
->
dwBands
]
.
lBandTimeLogical
=
tempHeaderV2
.
lBandTimeLogical
;
p
Track
->
pBandHeaders
[
pTrack
->
dwBands
]
.
lBandTimePhysical
=
tempHeaderV2
.
lBandTimePhysical
;
p
NewBand
->
pBandHeader
.
dwVersion
=
2
;
p
NewBand
->
pBandHeader
.
lBandTimeLogical
=
tempHeaderV2
.
lBandTimeLogical
;
p
NewBand
->
pBandHeader
.
lBandTimePhysical
=
tempHeaderV2
.
lBandTimePhysical
;
break
;
}
case
FOURCC_RIFF
:
{
...
...
@@ -479,7 +556,7 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
IDirectMusicObject
*
pObject
;
if
(
SUCCEEDED
(
IDirectMusicLoader_GetObject
(
pLoader
,
&
ObjDesc
,
&
IID_IDirectMusicObject
,
(
LPVOID
*
)
&
pObject
)))
{
/* acquire band from loaded object */
IDirectMusicObject_QueryInterface
(
pObject
,
&
IID_IDirectMusicBand
,
(
LPVOID
*
)
&
p
Track
->
ppBands
[
pTrack
->
dwBands
]
);
IDirectMusicObject_QueryInterface
(
pObject
,
&
IID_IDirectMusicBand
,
(
LPVOID
*
)
&
p
NewBand
->
ppBand
);
/*IDirectMusicLoader_Release (pLoader);*/
}
else
FIXME
(
": couldn't get band
\n
"
);
}
...
...
@@ -503,6 +580,7 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
}
TRACE_
(
dmfile
)(
": ListCount[1] = %ld < ListSize[1] = %ld
\n
"
,
ListCount
[
1
],
ListSize
[
1
]);
}
while
(
ListCount
[
1
]
<
ListSize
[
1
]);
list_add_tail
(
&
pTrack
->
Bands
,
&
pNewBand
->
entry
);
break
;
}
default:
{
...
...
@@ -523,7 +601,6 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
}
TRACE_
(
dmfile
)(
": ListCount[0] = %ld < ListSize[0] = %ld
\n
"
,
ListCount
[
0
],
ListSize
[
0
]);
}
while
(
ListCount
[
0
]
<
ListSize
[
0
]);
pTrack
->
dwBands
++
;
/* add reference count */
break
;
}
default:
{
...
...
@@ -564,6 +641,52 @@ HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, IStream*
}
}
/* DEBUG: dumps whole band track object tree: */
if
(
TRACE_ON
(
dmband
))
{
int
r
=
0
;
DMUS_PRIVATE_BAND
*
tmpEntry
;
struct
list
*
listEntry
;
TRACE
(
"*** IDirectMusicBandTrack (%p) ***
\n
"
,
pTrack
);
if
(
pTrack
->
btkHeader
)
{
TRACE
(
" - Band track header:
\n
"
);
TRACE
(
" - bAutoDownload: %i
\n
"
,
pTrack
->
btkHeader
->
bAutoDownload
);
}
if
(
pTrack
->
guidID
)
TRACE
(
" - GUID = %s
\n
"
,
debugstr_guid
(
pTrack
->
guidID
));
if
(
pTrack
->
vVersion
)
TRACE
(
" - Version = %i,%i,%i,%i
\n
"
,
(
pTrack
->
vVersion
->
dwVersionMS
>>
8
)
&&
0x0000FFFF
,
pTrack
->
vVersion
->
dwVersionMS
&&
0x0000FFFF
,
\
(
pTrack
->
vVersion
->
dwVersionLS
>>
8
)
&&
0x0000FFFF
,
pTrack
->
vVersion
->
dwVersionLS
&&
0x0000FFFF
);
if
(
pTrack
->
wzName
)
TRACE
(
" - Name = %s
\n
"
,
debugstr_w
(
pTrack
->
wzName
));
if
(
pTrack
->
wzArtist
)
TRACE
(
" - Artist = %s
\n
"
,
debugstr_w
(
pTrack
->
wzArtist
));
if
(
pTrack
->
wzCopyright
)
TRACE
(
" - Copyright = %s
\n
"
,
debugstr_w
(
pTrack
->
wzCopyright
));
if
(
pTrack
->
wzSubject
)
TRACE
(
" - Subject = %s
\n
"
,
debugstr_w
(
pTrack
->
wzSubject
));
if
(
pTrack
->
wzComment
)
TRACE
(
" - Comment = %s
\n
"
,
debugstr_w
(
pTrack
->
wzComment
));
TRACE
(
" - Bands:
\n
"
);
LIST_FOR_EACH
(
listEntry
,
&
pTrack
->
Bands
)
{
tmpEntry
=
LIST_ENTRY
(
listEntry
,
DMUS_PRIVATE_BAND
,
entry
);
TRACE
(
" - Band[%i]:
\n
"
,
r
);
TRACE
(
" - Band header:
\n
"
);
TRACE
(
" - version = %ld
\n
"
,
tmpEntry
->
pBandHeader
.
dwVersion
);
if
(
tmpEntry
->
pBandHeader
.
dwVersion
==
1
)
{
TRACE
(
" - lBandTime = %li
\n
"
,
tmpEntry
->
pBandHeader
.
lBandTime
);
}
else
if
(
tmpEntry
->
pBandHeader
.
dwVersion
==
2
)
{
TRACE
(
" - lBandTimeLogical = %li
\n
"
,
tmpEntry
->
pBandHeader
.
lBandTimeLogical
);
TRACE
(
" - lBandTimePhysical = %li
\n
"
,
tmpEntry
->
pBandHeader
.
lBandTimePhysical
);
}
TRACE
(
" - Band: %p
\n
"
,
tmpEntry
->
ppBand
);
r
++
;
}
}
return
S_OK
;
}
...
...
dlls/dmband/dmband_private.h
View file @
10509573
...
...
@@ -33,6 +33,8 @@
#include "dmplugin.h"
#include "dmusicf.h"
#include "dsound.h"
#include "wine/list.h"
/*****************************************************************************
* Interfaces
...
...
@@ -67,6 +69,33 @@ extern HRESULT WINAPI DMUSIC_CreateDirectMusicBandObject (LPCGUID lpcGUID, LPDIR
extern
HRESULT
WINAPI
DMUSIC_CreateDirectMusicBandTrack
(
LPCGUID
lpcGUID
,
LPDIRECTMUSICTRACK8
*
ppTrack
,
LPUNKNOWN
pUnkOuter
);
/*****************************************************************************
* Auxiliary definitions
*/
/* i don't like M$'s idea about two different band item headers, so behold: universal one */
typedef
struct
_DMUS_PRIVATE_BAND_ITEM_HEADER
{
DWORD
dwVersion
;
/* 1 or 2 */
/* v.1 */
MUSIC_TIME
lBandTime
;
/* v.2 */
MUSIC_TIME
lBandTimeLogical
;
MUSIC_TIME
lBandTimePhysical
;
}
DMUS_PRIVATE_BAND_ITEM_HEADER
;
typedef
struct
_DMUS_PRIVATE_INSTRUMENT
{
struct
list
entry
;
/* for listing elements */
DMUS_IO_INSTRUMENT
pInstrument
;
IDirectMusicCollection
*
ppReferenceCollection
;
}
DMUS_PRIVATE_INSTRUMENT
,
*
LPDMUS_PRIVATE_INSTRUMENT
;
typedef
struct
_DMUS_PRIVATE_BAND
{
struct
list
entry
;
/* for listing elements */
DMUS_PRIVATE_BAND_ITEM_HEADER
pBandHeader
;
IDirectMusicBandImpl
*
ppBand
;
}
DMUS_PRIVATE_BAND
,
*
LPDMUS_PRIVATE_BAND
;
/*****************************************************************************
* IDirectMusicBandImpl implementation structure
*/
...
...
@@ -78,18 +107,18 @@ struct IDirectMusicBandImpl
/* IDirectMusicBandImpl fields */
IDirectMusicBandObject
*
pObject
;
GUID
guidID
;
/* unique id */
DMUS_IO_VERSION
vVersion
;
/* version */
GUID
*
guidID
;
/* unique id */
DMUS_IO_VERSION
*
vVersion
;
/* version */
/* info from UNFO list */
WCHAR
*
wszName
;
WCHAR
*
wszArtist
;
WCHAR
*
wszCopyright
;
WCHAR
*
wszSubject
;
WCHAR
*
wszComment
;
WCHAR
*
wzName
;
WCHAR
*
wzArtist
;
WCHAR
*
wzCopyright
;
WCHAR
*
wzSubject
;
WCHAR
*
wzComment
;
/* data */
DMUS_IO_INSTRUMENT
pInstruments
[
255
];
IDirectMusicCollection
*
ppReferenceCollection
[
255
];
DWORD
dwInstruments
;
struct
list
Instruments
;
};
/* IUnknown: */
...
...
@@ -151,15 +180,6 @@ extern HRESULT WINAPI IDirectMusicBandObjectStream_Load (LPPERSISTSTREAM iface,
extern
HRESULT
WINAPI
IDirectMusicBandObjectStream_Save
(
LPPERSISTSTREAM
iface
,
IStream
*
pStm
,
BOOL
fClearDirty
);
extern
HRESULT
WINAPI
IDirectMusicBandObjectStream_GetSizeMax
(
LPPERSISTSTREAM
iface
,
ULARGE_INTEGER
*
pcbSize
);
/* i don't like M$'s idea about two different band item headers, so behold: universal one */
typedef
struct
_DMUS_PRIVATE_BAND_ITEM_HEADER
{
DWORD
dwVersion
;
/* 1 or 2 */
/* v.1 */
MUSIC_TIME
lBandTime
;
/* v.2 */
MUSIC_TIME
lBandTimeLogical
;
MUSIC_TIME
lBandTimePhysical
;
}
DMUS_PRIVATE_BAND_ITEM_HEADER
;
/*****************************************************************************
* IDirectMusicBandTrack implementation structure
...
...
@@ -172,19 +192,18 @@ struct IDirectMusicBandTrack
/* IDirectMusicBandTrack fields */
IDirectMusicBandTrackStream
*
pStream
;
DMUS_IO_BAND_TRACK_HEADER
btkHeader
;
/* header */
GUID
guidID
;
/* unique id */
DMUS_IO_VERSION
vVersion
;
/* version */
DMUS_IO_BAND_TRACK_HEADER
*
btkHeader
;
/* header */
GUID
*
guidID
;
/* unique id */
DMUS_IO_VERSION
*
vVersion
;
/* version */
/* info from UNFO list */
WCHAR
*
wszName
;
WCHAR
*
wszArtist
;
WCHAR
*
wszCopyright
;
WCHAR
*
wszSubject
;
WCHAR
*
wszComment
;
WCHAR
*
wzName
;
WCHAR
*
wzArtist
;
WCHAR
*
wzCopyright
;
WCHAR
*
wzSubject
;
WCHAR
*
wzComment
;
/* data */
DMUS_PRIVATE_BAND_ITEM_HEADER
pBandHeaders
[
255
];
/* band item headers for bands */
IDirectMusicBandImpl
*
ppBands
[
255
];
/* bands */
DWORD
dwBands
;
/* nr. of IDirectMusicBandImpl* and DMUS_PRIVATE_BAND_ITEM_HEADER */
struct
list
Bands
;
};
/* IUnknown: */
...
...
@@ -234,12 +253,11 @@ extern HRESULT WINAPI IDirectMusicBandTrackStream_Load (LPPERSISTSTREAM iface, I
extern
HRESULT
WINAPI
IDirectMusicBandTrackStream_Save
(
LPPERSISTSTREAM
iface
,
IStream
*
pStm
,
BOOL
fClearDirty
);
extern
HRESULT
WINAPI
IDirectMusicBandTrackStream_GetSizeMax
(
LPPERSISTSTREAM
iface
,
ULARGE_INTEGER
*
pcbSize
);
static
inline
const
char
*
debugstr_fourcc
(
DWORD
fourcc
)
{
static
inline
const
char
*
debugstr_fourcc
(
DWORD
fourcc
)
{
if
(
!
fourcc
)
return
"'null'"
;
return
wine_dbg_sprintf
(
"
\'
%c%c%c%c
\'
"
,
return
wine_dbg_sprintf
(
"
\'
%c%c%c%c
\'
"
,
(
char
)(
fourcc
),
(
char
)(
fourcc
>>
8
),
(
char
)(
fourcc
>>
16
),
(
char
)(
fourcc
>>
24
)
);
(
char
)(
fourcc
>>
16
),
(
char
)(
fourcc
>>
24
)
);
}
#endif
/* __WINE_DMBAND_PRIVATE_H */
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