25#define DMUS_MAX_CATEGORY_SIZE DMUS_MAX_CATEGORY*sizeof(WCHAR)
26#define DMUS_MAX_NAME_SIZE DMUS_MAX_NAME*sizeof(WCHAR)
27#define DMUS_MAX_FILENAME_SIZE DMUS_MAX_FILENAME*sizeof(WCHAR)
69 TRACE(
": getting loader\n");
70 IStream_QueryInterface (
This->pStream, &IID_IDirectMusicGetLoader, (
LPVOID*)&pGetLoader);
75 TRACE(
": releasing objects from loader's cache\n");
90 IStream_Release (
This->pStream);
104 *ret_iface = &
This->IDirectMusicContainer_iface;
106 *ret_iface = &
This->dmobj.IDirectMusicObject_iface;
108 *ret_iface = &
This->dmobj.IPersistStream_iface;
115 IUnknown_AddRef((
IUnknown*)*ret_iface);
158 ERR(
": invalid pDesc->dwSize %ld\n", pDesc->
dwSize);
168 if (dwCount == dwIndex) {
175 *pDesc = pContainedObject->
Desc;
182 TRACE(
": not found\n");
220 desc->guidClass = CLSID_DirectMusicContainer;
223 TRACE(
"returning descriptor:\n");
247 DWORD StreamSize, StreamCount, ListSize[3], ListCount[3];
258 ERR(
": pStm bad read pointer\n");
263 TRACE(
": stream is already set, which means container is already loaded\n");
268 if (
FAILED(IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (
LPVOID*)&pGetLoader))) {
269 ERR(
": stream not supported\n");
275 This->pStream = pStm;
276 IStream_AddRef (pStm);
281 switch (Chunk.
fccID) {
287 switch (Chunk.
fccID) {
289 TRACE_(dmfile)(
": container form\n");
290 This->dmobj.desc.guidClass = CLSID_DirectMusicContainer;
296 switch (Chunk.
fccID) {
303 TRACE_(dmfile)(
": GUID chunk\n");
304 IStream_Read (pStm, &
This->dmobj.desc.guidObject, Chunk.
dwSize,
NULL);
309 TRACE_(dmfile)(
": version chunk\n");
310 IStream_Read (pStm, &
This->dmobj.desc.vVersion, Chunk.
dwSize,
NULL);
315 TRACE_(dmfile)(
": date chunk\n");
316 IStream_Read (pStm, &
This->dmobj.desc.ftDate, Chunk.
dwSize,
NULL);
321 TRACE_(dmfile)(
": category chunk\n");
327 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
329 IStream_Read (pStm,
This->dmobj.desc.wszCategory, Chunk.
dwSize,
NULL);
339 switch (Chunk.
fccID) {
341 TRACE_(dmfile)(
": UNFO list\n");
346 switch (Chunk.
fccID) {
351 TRACE_(dmfile)(
": name chunk\n");
357 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
359 IStream_Read (pStm,
This->dmobj.desc.wszName, Chunk.
dwSize,
NULL);
365 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
367 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
371 TRACE_(dmfile)(
": ListCount[0] = %#lx < ListSize[0] = %#lx\n", ListCount[0], ListSize[0]);
372 }
while (ListCount[0] < ListSize[0]);
376 TRACE_(dmfile)(
": contained objects list\n");
381 switch (Chunk.
fccID) {
387 switch (Chunk.
fccID) {
390 TRACE_(dmfile)(
": contained object list\n");
391 pNewEntry =
calloc(1,
sizeof(*pNewEntry));
397 switch (Chunk.
fccID) {
399 TRACE_(dmfile)(
": alias chunk\n");
407 IStream_Read (pStm, &tmpObjectHeader, Chunk.
dwSize,
NULL);
423 switch (Chunk.
fccID) {
425 TRACE_(dmfile)(
": reference list\n");
431 switch (Chunk.
fccID) {
434 TRACE_(dmfile)(
": reference header chunk\n");
436 IStream_Read (pStm, &tmpReferenceHeader, Chunk.
dwSize,
NULL);
446 TRACE_(dmfile)(
": guid chunk\n");
452 TRACE_(dmfile)(
": file date chunk\n");
458 TRACE_(dmfile)(
": name chunk\n");
464 TRACE_(dmfile)(
": file name chunk\n");
470 TRACE_(dmfile)(
": category chunk\n");
476 TRACE_(dmfile)(
": version chunk\n");
482 TRACE_(dmfile)(
": unknown chunk (skipping)\n");
484 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
488 TRACE_(dmfile)(
": ListCount[2] = %#lx < ListSize[2] = %#lx\n", ListCount[2], ListSize[2]);
489 }
while (ListCount[2] < ListSize[2]);
493 TRACE_(dmfile)(
": unexpected chunk; loading failed)\n");
504 TRACE_(dmfile)(
": valid DMUSIC form\n");
508 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &uliPos);
513 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
519 TRACE_(dmfile)(
": invalid DMUSIC form (skipping)\n");
521 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
527 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
529 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
533 TRACE_(dmfile)(
": ListCount[1] = %#lx < ListSize[1] = %#lx\n", ListCount[1], ListSize[1]);
534 }
while (ListCount[1] < ListSize[1]);
542 IStream_Seek (pStm, liMove, STREAM_SEEK_SET,
NULL);
551 TRACE_(dmfile)(
": unknown (skipping)\n");
553 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
560 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
562 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
566 TRACE_(dmfile)(
": ListCount[0] = %#lx < ListSize[0] = %#lx\n", ListCount[0], ListSize[0]);
567 }
while (ListCount[0] < ListSize[0]);
571 TRACE_(dmfile)(
": unknown (skipping)\n");
573 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
580 TRACE_(dmfile)(
": unknown chunk (irrelevant & skipping)\n");
582 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
586 TRACE_(dmfile)(
": StreamCount[0] = %#lx < StreamSize[0] = %#lx\n", StreamCount, StreamSize);
587 }
while (StreamCount < StreamSize);
591 TRACE_(dmfile)(
": unexpected chunk; loading failed)\n");
593 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
597 TRACE_(dmfile)(
": reading finished\n");
603 TRACE_(dmfile)(
": unexpected chunk; loading failed)\n");
605 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR,
NULL);
616 TRACE(
": DMUS_CONTAINER_NOLOADS not set... load all objects\n");
626 WARN(
": failed to load contained object\n");
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
static HRESULT destroy_dmcontainer(IDirectMusicContainerImpl *This)
#define DMUS_MAX_NAME_SIZE
static IDirectMusicContainerImpl * impl_from_IPersistStream(IPersistStream *iface)
#define DMUS_MAX_CATEGORY_SIZE
struct container_entry * LPWINE_CONTAINER_ENTRY
static const IDirectMusicContainerVtbl dmcontainer_vtbl
static HRESULT WINAPI IDirectMusicContainerImpl_EnumObject(IDirectMusicContainer *iface, REFGUID rguidClass, DWORD dwIndex, DMUS_OBJECTDESC *pDesc, WCHAR *pwszAlias)
static const IDirectMusicObjectVtbl dmobject_vtbl
struct container_entry WINE_CONTAINER_ENTRY
static HRESULT WINAPI IDirectMusicContainerImpl_QueryInterface(IDirectMusicContainer *iface, REFIID riid, void **ret_iface)
static const IPersistStreamVtbl persiststream_vtbl
static ULONG WINAPI IDirectMusicContainerImpl_AddRef(IDirectMusicContainer *iface)
struct riff_chunk WINE_CHUNK
static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pStm)
HRESULT create_dmcontainer(REFIID lpcGUID, void **ppobj)
static HRESULT WINAPI cont_IDirectMusicObject_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc)
static IDirectMusicContainerImpl * impl_from_IDirectMusicContainer(IDirectMusicContainer *iface)
static ULONG WINAPI IDirectMusicContainerImpl_Release(IDirectMusicContainer *iface)
BOOL IS_VALID_DMFORM(FOURCC chunkID)
const char * debugstr_DMUS_IO_CONTAINER_HEADER(LPDMUS_IO_CONTAINER_HEADER pHeader)
const char * debugstr_DMUS_IO_CONTAINED_OBJECT_HEADER(LPDMUS_IO_CONTAINED_OBJECT_HEADER pHeader)
#define DM_STRUCT_INIT(x)
#define WINE_DECLARE_DEBUG_CHANNEL(x)
BOOL WINAPI IsBadReadPtr(IN LPCVOID lp, IN UINT_PTR ucb)
#define DMUS_E_UNSUPPORTED_STREAM
#define DMUS_E_DESCEND_CHUNK_FAIL
#define DMUS_S_STRING_TRUNCATED
#define DMUS_E_ALREADY_LOADED
#define DMUS_S_PARTIALLOAD
HRESULT WINAPI dmobj_IDirectMusicObject_GetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *desc)
void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk)
ULONG WINAPI dmobj_IPersistStream_Release(IPersistStream *iface)
ULONG WINAPI dmobj_IDirectMusicObject_Release(IDirectMusicObject *iface)
HRESULT dmobj_parsedescriptor(IStream *stream, const struct chunk_entry *riff, DMUS_OBJECTDESC *desc, DWORD supported)
HRESULT WINAPI dmobj_IDirectMusicObject_QueryInterface(IDirectMusicObject *iface, REFIID riid, void **ret_iface)
HRESULT WINAPI unimpl_IPersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *size)
HRESULT WINAPI dmobj_IDirectMusicObject_SetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *desc)
void dump_DMUS_OBJECTDESC(DMUS_OBJECTDESC *desc)
const char * debugstr_chunk(const struct chunk_entry *chunk)
HRESULT WINAPI dmobj_IPersistStream_GetClassID(IPersistStream *iface, CLSID *class)
ULONG WINAPI dmobj_IPersistStream_AddRef(IPersistStream *iface)
const char * debugstr_dmguid(const GUID *id)
HRESULT WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ret_iface)
ULONG WINAPI dmobj_IDirectMusicObject_AddRef(IDirectMusicObject *iface)
HRESULT stream_skip_chunk(IStream *stream, const struct chunk_entry *chunk)
HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk)
HRESULT WINAPI unimpl_IPersistStream_IsDirty(IPersistStream *iface)
HRESULT WINAPI unimpl_IPersistStream_Save(IPersistStream *iface, IStream *stream, BOOL clear_dirty)
#define DMUS_FOURCC_CONTAINED_ALIAS_CHUNK
#define DMUS_FOURCC_CONTAINED_OBJECT_LIST
#define DMUS_FOURCC_GUID_CHUNK
#define DMUS_FOURCC_CONTAINER_CHUNK
#define DMUS_FOURCC_REF_CHUNK
#define DMUS_FOURCC_UNAM_CHUNK
#define DMUS_FOURCC_VERSION_CHUNK
#define DMUS_CONTAINER_NOLOADS
#define DMUS_FOURCC_CONTAINER_FORM
#define DMUS_FOURCC_REF_LIST
#define DMUS_FOURCC_FILE_CHUNK
#define DMUS_FOURCC_NAME_CHUNK
#define DMUS_FOURCC_DATE_CHUNK
#define DMUS_CONTAINED_OBJF_KEEP
#define DMUS_FOURCC_CONTAINED_OBJECTS_LIST
#define DMUS_FOURCC_UNFO_LIST
#define DMUS_FOURCC_CONTAINED_OBJECT_CHUNK
#define DMUS_FOURCC_CATEGORY_CHUNK
#define IDirectMusicGetLoader_GetLoader(p, a)
#define IDirectMusicObject_Release(p)
#define IDirectMusicLoader_Release(p)
struct IDirectMusicGetLoader * LPDIRECTMUSICGETLOADER
#define IDirectMusicLoader_SetObject(p, a)
#define IDirectMusicLoader_ReleaseObject(p, a)
#define IDirectMusicContainer_Release(p)
#define IDirectMusicGetLoader_Release(p)
#define DMUS_MAX_FILENAME
struct IDirectMusicLoader * LPDIRECTMUSICLOADER
#define IDirectMusicLoader_GetObject(p, a, b, c)
#define DMUS_OBJ_CATEGORY
#define IDirectMusicContainer_QueryInterface(p, a, b)
#define FOURCC(a, b, c, d)
#define mmioFOURCC(c0, c1, c2, c3)
D3D11_SHADER_VARIABLE_DESC desc
const GUID IID_IPersistStream
#define IsEqualGUID(rguid1, rguid2)
#define IsEqualIID(riid1, riid2)
#define IsEqualCLSID(rclsid1, rclsid2)
static __inline const char * debugstr_fourcc(unsigned int cc)
#define LIST_FOR_EACH(cursor, list)
IDirectMusicContainer IDirectMusicContainer_iface
struct list * pContainedObjects
DMUS_IO_CONTAINER_HEADER Header
WCHAR wszCategory[DMUS_MAX_CATEGORY]
WCHAR wszFileName[DMUS_MAX_FILENAME]
WCHAR wszName[DMUS_MAX_NAME]
IDirectMusicObject * pObject
#define CONTAINING_RECORD(address, type, field)