Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
a955339b
Commit
a955339b
authored
Sep 10, 2023
by
Rémi Bernon
Committed by
Alexandre Julliard
Sep 21, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dmband: Rewrite band track IPersistStream_Load.
parent
48f276f8
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
45 additions
and
306 deletions
+45
-306
Makefile.in
dlls/dmband/Makefile.in
+1
-2
bandtrack.c
dlls/dmband/bandtrack.c
+43
-42
dmband_main.c
dlls/dmband/dmband_main.c
+1
-0
dmband_private.h
dlls/dmband/dmband_private.h
+0
-6
dmutils.c
dlls/dmband/dmutils.c
+0
-219
dmutils.h
dlls/dmband/dmutils.h
+0
-37
No files found.
dlls/dmband/Makefile.in
View file @
a955339b
...
...
@@ -6,8 +6,7 @@ C_SRCS = \
band.c
\
bandtrack.c
\
dmband_main.c
\
dmobject.c
\
dmutils.c
dmobject.c
IDL_SRCS
=
dmband.idl
...
...
dlls/dmband/bandtrack.c
View file @
a955339b
...
...
@@ -20,7 +20,6 @@
#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
dmband
);
WINE_DECLARE_DEBUG_CHANNEL
(
dmfile
);
struct
band_entry
{
...
...
@@ -465,51 +464,53 @@ static inline struct band_track *impl_from_IPersistStream(IPersistStream *iface)
return
CONTAINING_RECORD
(
iface
,
struct
band_track
,
dmobj
.
IPersistStream_iface
);
}
static
HRESULT
WINAPI
band_track_persist_stream_Load
(
IPersistStream
*
iface
,
IStream
*
pSt
m
)
static
HRESULT
WINAPI
band_track_persist_stream_Load
(
IPersistStream
*
iface
,
IStream
*
strea
m
)
{
struct
band_track
*
This
=
impl_from_IPersistStream
(
iface
);
DMUS_PRIVATE_CHUNK
Chunk
;
LARGE_INTEGER
liMove
;
HRESULT
hr
;
TRACE
(
"(%p, %p): Loading
\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
:
{
static
const
LARGE_INTEGER
zero
=
{
0
};
struct
chunk_entry
chunk
=
{
FOURCC_LIST
,
.
size
=
Chunk
.
dwSize
,
.
type
=
Chunk
.
fccID
};
TRACE_
(
dmfile
)(
": Band track form
\n
"
);
IStream_Seek
(
pStm
,
zero
,
STREAM_SEEK_CUR
,
&
chunk
.
offset
);
chunk
.
offset
.
QuadPart
-=
12
;
hr
=
parse_dmbt_chunk
(
This
,
pStm
,
&
chunk
);
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
;
struct
band_track
*
This
=
impl_from_IPersistStream
(
iface
);
struct
chunk_entry
chunk
=
{
0
};
HRESULT
hr
;
TRACE
(
"(%p, %p)
\n
"
,
This
,
stream
);
if
((
hr
=
stream_get_chunk
(
stream
,
&
chunk
))
==
S_OK
)
{
switch
(
MAKE_IDTYPE
(
chunk
.
id
,
chunk
.
type
))
{
case
MAKE_IDTYPE
(
FOURCC_RIFF
,
DMUS_FOURCC_BANDTRACK_FORM
):
hr
=
parse_dmbt_chunk
(
This
,
stream
,
&
chunk
);
break
;
default:
WARN
(
"Invalid band track chunk %s %s
\n
"
,
debugstr_fourcc
(
chunk
.
id
),
debugstr_fourcc
(
chunk
.
type
));
hr
=
DMUS_E_UNSUPPORTED_STREAM
;
break
;
}
}
if
(
FAILED
(
hr
))
return
hr
;
if
(
TRACE_ON
(
dmband
))
{
struct
band_entry
*
entry
;
int
i
=
0
;
TRACE
(
"Loaded DirectMusicBandTrack %p
\n
"
,
This
);
dump_DMUS_OBJECTDESC
(
&
This
->
dmobj
.
desc
);
TRACE
(
" - header:
\n
"
);
TRACE
(
" - bAutoDownload: %u
\n
"
,
This
->
header
.
bAutoDownload
);
TRACE
(
" - bands:
\n
"
);
LIST_FOR_EACH_ENTRY
(
entry
,
&
This
->
bands
,
struct
band_entry
,
entry
)
{
TRACE
(
" - band[%u]: %p
\n
"
,
i
++
,
entry
->
band
);
TRACE
(
" - lBandTimeLogical: %ld
\n
"
,
entry
->
head
.
lBandTimeLogical
);
TRACE
(
" - lBandTimePhysical: %ld
\n
"
,
entry
->
head
.
lBandTimePhysical
);
}
}
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
;
stream_skip_chunk
(
stream
,
&
chunk
);
return
S_OK
;
}
static
const
IPersistStreamVtbl
band_track_persist_stream_vtbl
=
...
...
dlls/dmband/dmband_main.c
View file @
a955339b
...
...
@@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "initguid.h"
#include "dmband_private.h"
#include "rpcproxy.h"
#include "dmobject.h"
...
...
dlls/dmband/dmband_private.h
View file @
a955339b
...
...
@@ -47,10 +47,4 @@
extern
HRESULT
create_dmband
(
REFIID
riid
,
void
**
ret_iface
);
extern
HRESULT
create_dmbandtrack
(
REFIID
riid
,
void
**
ret_iface
);
/*****************************************************************************
* Misc.
*/
#include "dmutils.h"
#endif
/* __WINE_DMBAND_PRIVATE_H */
dlls/dmband/dmutils.c
deleted
100644 → 0
View file @
48f276f8
/* Debug and Helper Functions
*
* Copyright (C) 2004 Rok Mandeljc
* Copyright (C) 2004 Raphael Junqueira
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include "windef.h"
#include "winbase.h"
#include "winnt.h"
#include "wingdi.h"
#include "winuser.h"
#include "wine/debug.h"
#include "objbase.h"
#include "initguid.h"
#include "dmusici.h"
#include "dmusicf.h"
#include "dmusics.h"
#include "dmutils.h"
#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
dmfile
);
HRESULT
IDirectMusicUtils_IPersistStream_ParseDescGeneric
(
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
LPDMUS_OBJECTDESC
pDesc
)
{
switch
(
pChunk
->
fccID
)
{
case
DMUS_FOURCC_GUID_CHUNK
:
{
TRACE
(
": GUID chunk
\n
"
);
pDesc
->
dwValidData
|=
DMUS_OBJ_OBJECT
;
IStream_Read
(
pStm
,
&
pDesc
->
guidObject
,
pChunk
->
dwSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_DATE_CHUNK
:
{
TRACE
(
": file date chunk
\n
"
);
pDesc
->
dwValidData
|=
DMUS_OBJ_DATE
;
IStream_Read
(
pStm
,
&
pDesc
->
ftDate
,
pChunk
->
dwSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_NAME_CHUNK
:
{
TRACE
(
": name chunk
\n
"
);
pDesc
->
dwValidData
|=
DMUS_OBJ_NAME
;
IStream_Read
(
pStm
,
pDesc
->
wszName
,
pChunk
->
dwSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_FILE_CHUNK
:
{
TRACE
(
": file name chunk
\n
"
);
pDesc
->
dwValidData
|=
DMUS_OBJ_FILENAME
;
IStream_Read
(
pStm
,
pDesc
->
wszFileName
,
pChunk
->
dwSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_VERSION_CHUNK
:
{
TRACE
(
": version chunk
\n
"
);
pDesc
->
dwValidData
|=
DMUS_OBJ_VERSION
;
IStream_Read
(
pStm
,
&
pDesc
->
vVersion
,
pChunk
->
dwSize
,
NULL
);
break
;
}
case
DMUS_FOURCC_CATEGORY_CHUNK
:
{
TRACE
(
": category chunk
\n
"
);
pDesc
->
dwValidData
|=
DMUS_OBJ_CATEGORY
;
IStream_Read
(
pStm
,
pDesc
->
wszCategory
,
pChunk
->
dwSize
,
NULL
);
break
;
}
default:
/* not handled */
return
S_FALSE
;
}
return
S_OK
;
}
HRESULT
IDirectMusicUtils_IPersistStream_ParseUNFOGeneric
(
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
LPDMUS_OBJECTDESC
pDesc
)
{
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
/**
* don't ask me why, but M$ puts INFO elements in UNFO list sometimes
* (though strings seem to be valid unicode)
*/
switch
(
pChunk
->
fccID
)
{
case
mmioFOURCC
(
'I'
,
'N'
,
'A'
,
'M'
):
case
DMUS_FOURCC_UNAM_CHUNK
:
{
TRACE
(
": name chunk
\n
"
);
pDesc
->
dwValidData
|=
DMUS_OBJ_NAME
;
IStream_Read
(
pStm
,
pDesc
->
wszName
,
pChunk
->
dwSize
,
NULL
);
TRACE
(
" - wszName: %s
\n
"
,
debugstr_w
(
pDesc
->
wszName
));
break
;
}
case
mmioFOURCC
(
'I'
,
'A'
,
'R'
,
'T'
):
case
DMUS_FOURCC_UART_CHUNK
:
{
TRACE
(
": artist chunk (ignored)
\n
"
);
liMove
.
QuadPart
=
pChunk
->
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'C'
,
'O'
,
'P'
):
case
DMUS_FOURCC_UCOP_CHUNK
:
{
TRACE
(
": copyright chunk (ignored)
\n
"
);
liMove
.
QuadPart
=
pChunk
->
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'S'
,
'B'
,
'J'
):
case
DMUS_FOURCC_USBJ_CHUNK
:
{
TRACE
(
": subject chunk (ignored)
\n
"
);
liMove
.
QuadPart
=
pChunk
->
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
case
mmioFOURCC
(
'I'
,
'C'
,
'M'
,
'T'
):
case
DMUS_FOURCC_UCMT_CHUNK
:
{
TRACE
(
": comment chunk (ignored)
\n
"
);
liMove
.
QuadPart
=
pChunk
->
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
default:
/* not handled */
return
S_FALSE
;
}
return
S_OK
;
}
HRESULT
IDirectMusicUtils_IPersistStream_ParseReference
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
IDirectMusicObject
**
ppObject
)
{
DMUS_PRIVATE_CHUNK
Chunk
;
DWORD
ListSize
[
3
],
ListCount
[
3
];
LARGE_INTEGER
liMove
;
/* used when skipping chunks */
HRESULT
hr
;
DMUS_IO_REFERENCE
ref
;
DMUS_OBJECTDESC
ref_desc
;
memset
(
&
ref
,
0
,
sizeof
(
ref
));
memset
(
&
ref_desc
,
0
,
sizeof
(
ref_desc
));
if
(
pChunk
->
fccID
!=
DMUS_FOURCC_REF_LIST
)
{
ERR_
(
dmfile
)(
": %s chunk should be a REF 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
(
": %s chunk (size = %ld)"
,
debugstr_fourcc
(
Chunk
.
fccID
),
Chunk
.
dwSize
);
hr
=
IDirectMusicUtils_IPersistStream_ParseDescGeneric
(
&
Chunk
,
pStm
,
&
ref_desc
);
if
(
FAILED
(
hr
))
return
hr
;
if
(
hr
==
S_FALSE
)
{
switch
(
Chunk
.
fccID
)
{
case
DMUS_FOURCC_REF_CHUNK
:
{
TRACE
(
": Reference chunk
\n
"
);
if
(
Chunk
.
dwSize
!=
sizeof
(
DMUS_IO_REFERENCE
))
return
E_FAIL
;
IStream_Read
(
pStm
,
&
ref
,
sizeof
(
DMUS_IO_REFERENCE
),
NULL
);
TRACE
(
" - guidClassID: %s
\n
"
,
debugstr_dmguid
(
&
ref
.
guidClassID
));
TRACE
(
" - dwValidData: %lu
\n
"
,
ref
.
dwValidData
);
break
;
}
default:
{
TRACE
(
": unknown chunk (irrelevant & skipping)
\n
"
);
liMove
.
QuadPart
=
Chunk
.
dwSize
;
IStream_Seek
(
pStm
,
liMove
,
STREAM_SEEK_CUR
,
NULL
);
break
;
}
}
}
TRACE
(
": ListCount[0] = %ld < ListSize[0] = %ld
\n
"
,
ListCount
[
0
],
ListSize
[
0
]);
}
while
(
ListCount
[
0
]
<
ListSize
[
0
]);
ref_desc
.
dwValidData
|=
DMUS_OBJ_CLASS
;
ref_desc
.
guidClass
=
ref
.
guidClassID
;
TRACE
(
"** DM Reference Begin of Load ***
\n
"
);
TRACE
(
"With Desc:
\n
"
);
dump_DMUS_OBJECTDESC
(
&
ref_desc
);
{
LPDIRECTMUSICGETLOADER
pGetLoader
=
NULL
;
LPDIRECTMUSICLOADER
pLoader
=
NULL
;
IStream_QueryInterface
(
pStm
,
&
IID_IDirectMusicGetLoader
,
(
LPVOID
*
)
&
pGetLoader
);
IDirectMusicGetLoader_GetLoader
(
pGetLoader
,
&
pLoader
);
IDirectMusicGetLoader_Release
(
pGetLoader
);
hr
=
IDirectMusicLoader_GetObject
(
pLoader
,
&
ref_desc
,
&
IID_IDirectMusicObject
,
(
LPVOID
*
)
ppObject
);
IDirectMusicLoader_Release
(
pLoader
);
/* release loader */
}
TRACE
(
"** DM Reference End of Load ***
\n
"
);
return
hr
;
}
dlls/dmband/dmutils.h
deleted
100644 → 0
View file @
48f276f8
/* Debug and Helper Functions
*
* Copyright (C) 2003-2004 Rok Mandeljc
* Copyright (C) 2003-2004 Raphael Junqueira
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __WINE_DMUTILS_H
#define __WINE_DMUTILS_H
/* for simpler reading */
typedef
struct
_DMUS_PRIVATE_CHUNK
{
FOURCC
fccID
;
/* FOURCC ID of the chunk */
DWORD
dwSize
;
/* size of the chunk */
}
DMUS_PRIVATE_CHUNK
,
*
LPDMUS_PRIVATE_CHUNK
;
/**
* Parsing utilities
*/
extern
HRESULT
IDirectMusicUtils_IPersistStream_ParseDescGeneric
(
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
LPDMUS_OBJECTDESC
pDesc
);
extern
HRESULT
IDirectMusicUtils_IPersistStream_ParseUNFOGeneric
(
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
LPDMUS_OBJECTDESC
pDesc
);
extern
HRESULT
IDirectMusicUtils_IPersistStream_ParseReference
(
LPPERSISTSTREAM
iface
,
DMUS_PRIVATE_CHUNK
*
pChunk
,
IStream
*
pStm
,
IDirectMusicObject
**
ppObject
);
#endif
/* __WINE_DMUTILS_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