DMUSIC: many loading improvements
Raphaël Junqueira
fenix at club-internet.fr
Sun Nov 2 07:57:44 CST 2003
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi all,
Now we are much better on Unreal2 dmusic :)
Changelog:
- Most of this patch is based on a private patch from Rok Mandeljc
- fix some dband code
- implement IDirectMusicContainer Stream loader
- implement IDirectMusicScript Stream loader
- fix some GetDescriptor/SetDescriptor behavior (only container and script
now)
- fix dmloader code
- indent
Regards,
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)
iD8DBQE/pQ1Yp7NA3AmQTU4RAltnAJ9n37tmMeZSrHvnPqzIwnyTM2KBkACfZcov
xipbvXITWEJxG/BHDDWI4Fk=
=Y2eD
-----END PGP SIGNATURE-----
-------------- next part --------------
? dlls/d3d8/diff
Index: dlls/dmband/band.c
===================================================================
RCS file: /home/wine/wine/dlls/dmband/band.c,v
retrieving revision 1.4
diff -u -r1.4 band.c
--- dlls/dmband/band.c 28 Oct 2003 21:08:55 -0000 1.4
+++ dlls/dmband/band.c 2 Nov 2003 13:46:02 -0000
@@ -293,363 +293,367 @@
HRESULT WINAPI IDirectMusicBandObjectStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
{
- ICOM_THIS(IDirectMusicBandObjectStream,iface);
- FOURCC chunkID;
- DWORD chunkSize, StreamSize, StreamCount, ListSize[3], ListCount[3];
- LARGE_INTEGER liMove; /* used when skipping chunks */
- DMUS_IO_REFERENCE tempReferenceHeader;
- DMUS_OBJECTDESC ObjDesc;
- IDirectMusicBandImpl* pBand = This->pParentObject->pBand; /* that's where we load data to */
- LPDIRECTMUSICLOADER pLoader;
- LPDIRECTMUSICGETLOADER pGetLoader;
-
+ ICOM_THIS(IDirectMusicBandObjectStream,iface);
+ FOURCC chunkID;
+ DWORD chunkSize, StreamSize, StreamCount, ListSize[3], ListCount[3];
+ LARGE_INTEGER liMove; /* used when skipping chunks */
+ DMUS_IO_REFERENCE tempReferenceHeader;
+ DMUS_OBJECTDESC ObjDesc;
+ IDirectMusicBandImpl* pBand = This->pParentObject->pBand; /* that's where we load data to */
+ LPDIRECTMUSICLOADER pLoader;
+ LPDIRECTMUSICGETLOADER pGetLoader;
+
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case FOURCC_RIFF: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunkID));
+ StreamSize = chunkSize - sizeof(FOURCC);
+ StreamCount = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_BAND_FORM: {
+ TRACE_(dmfile)(": band form\n");
+ do {
IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
- switch (chunkID) {
- case FOURCC_RIFF: {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunkID));
- StreamSize = chunkSize - sizeof(FOURCC);
- StreamCount = 0;
- switch (chunkID) {
- case DMUS_FOURCC_BAND_FORM: {
- TRACE_(dmfile)(": band form\n");
- do {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
- StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
- TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
- switch (chunkID) {
- case DMUS_FOURCC_GUID_CHUNK: {
- TRACE_(dmfile)(": GUID chunk\n");
- IStream_Read (pStm, pBand->guidID, chunkSize, NULL);
- break;
- }
- case DMUS_FOURCC_VERSION_CHUNK: {
- TRACE_(dmfile)(": version chunk\n");
- IStream_Read (pStm, pBand->vVersion, chunkSize, NULL);
- break;
- }
- case FOURCC_LIST: {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
- ListSize[0] = chunkSize - sizeof(FOURCC);
- ListCount[0] = 0;
- switch (chunkID) {
- case DMUS_FOURCC_UNFO_LIST: {
- TRACE_(dmfile)(": UNFO list\n");
- do {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
- 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->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->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->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->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->wzComment = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
- IStream_Read (pStm, pBand->wzComment, chunkSize, NULL);
- break;
- }
- default: {
- TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
- liMove.QuadPart = chunkSize;
- 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]);
- break;
- }
- case DMUS_FOURCC_INSTRUMENTS_LIST: {
- TRACE_(dmfile)(": instruments list\n");
- do {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
- ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
- TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
- switch (chunkID) {
- case FOURCC_LIST: {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
- ListSize[1] = chunkSize - sizeof(FOURCC);
- 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);
- IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
- ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
- TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
- switch (chunkID) {
- case DMUS_FOURCC_INSTRUMENT_CHUNK: {
- TRACE_(dmfile)(": band instrument header\n");
- IStream_Read (pStm, &pNewInstrument->pInstrument, chunkSize, NULL);
- break;
- }
- case FOURCC_LIST: {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
- ListSize[2] = chunkSize - sizeof(FOURCC);
- ListCount[2] = 0;
- switch (chunkID) {
- case DMUS_FOURCC_REF_LIST: {
- TRACE_(dmfile)(": reference list\n");
- ZeroMemory ((LPVOID)&ObjDesc, sizeof(DMUS_OBJECTDESC));
- do {
- IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
- IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
- ListCount[2] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
- TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
- switch (chunkID) {
- case DMUS_FOURCC_REF_CHUNK: {
- TRACE_(dmfile)(": reference header chunk\n");
- IStream_Read (pStm, &tempReferenceHeader, chunkSize, NULL);
- /* copy retrieved data to DMUS_OBJECTDESC */
- ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC);
- ObjDesc.guidClass = tempReferenceHeader.guidClassID;
- ObjDesc.dwValidData = tempReferenceHeader.dwValidData;
- break;
- }
- case DMUS_FOURCC_GUID_CHUNK: {
- TRACE_(dmfile)(": guid chunk\n");
- IStream_Read (pStm, &ObjDesc.guidObject, chunkSize, NULL);
- break;
- }
- case DMUS_FOURCC_DATE_CHUNK: {
- TRACE_(dmfile)(": file date chunk\n");
- IStream_Read (pStm, &ObjDesc.ftDate, chunkSize, NULL);
- break;
- }
- case DMUS_FOURCC_NAME_CHUNK: {
- TRACE_(dmfile)(": name chunk\n");
- IStream_Read (pStm, &ObjDesc.wszName, chunkSize, NULL);
- break;
- }
- case DMUS_FOURCC_FILE_CHUNK: {
- TRACE_(dmfile)(": file name chunk\n");
- IStream_Read (pStm, &ObjDesc.wszFileName, chunkSize, NULL);
- break;
- }
- case DMUS_FOURCC_CATEGORY_CHUNK: {
- TRACE_(dmfile)(": category chunk\n");
- IStream_Read (pStm, &ObjDesc.wszCategory, chunkSize, NULL);
- break;
- }
- case DMUS_FOURCC_VERSION_CHUNK: {
- TRACE_(dmfile)(": version chunk\n");
- IStream_Read (pStm, &ObjDesc.vVersion, chunkSize, NULL);
- break;
- }
- default: {
- TRACE_(dmfile)(": unknown chunk (skipping)\n");
- liMove.QuadPart = chunkSize;
- IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip this chunk */
- break;
- }
- }
- TRACE_(dmfile)(": ListCount[2] = %ld < ListSize[2] = %ld\n", ListCount[2], ListSize[2]);
- } while (ListCount[2] < ListSize[2]);
- /* let's see what we have */
- TRACE_(dmfile)(": (READ): reference: dwSize = %ld; dwValidData = %ld; guidObject = %s; guidClass = %s; \
-vVersion = %08lx,%08lx; wszName = %s; wszCategory = %s; wszFileName = %s\n", ObjDesc.dwSize, ObjDesc.dwValidData, debugstr_guid(&ObjDesc.guidObject), debugstr_guid(&ObjDesc.guidClass),
-ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.wszName), debugstr_w(ObjDesc.wszCategory), debugstr_w(ObjDesc.wszFileName));
- /* now, let's convience loader to load reference */
- if (IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (LPVOID*)&pGetLoader) == S_OK) {
- if (IDirectMusicGetLoader_GetLoader (pGetLoader, &pLoader) == S_OK) {
- /* load referenced object */
- 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*)&pNewInstrument->ppReferenceCollection)))
- IDirectMusicLoader_Release (pLoader);
- }
- IDirectMusicGetLoader_Release (pGetLoader);
- } else {
- ERR("Could not get IDirectMusicGetLoader... reference will not be loaded :(\n");
- /* E_FAIL */
- }
- break;
- }
- default: {
- TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
- return E_FAIL;
- }
- }
- break;
- }
- default: {
- TRACE_(dmfile)(": unknown chunk (skipping)\n");
- liMove.QuadPart = chunkSize;
- IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip this chunk */
- break;
- }
- }
- TRACE_(dmfile)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount[1], ListSize[1]);
- } while (ListCount[1] < ListSize[1]);
- /* 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 (!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;
- ObjDesc.guidObject = GUID_DefaultGMCollection;
- ObjDesc.guidClass = CLSID_DirectMusicCollection;
- if (SUCCEEDED(IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (LPVOID*)&pGetLoader))) {
- if (SUCCEEDED(IDirectMusicGetLoader_GetLoader (pGetLoader, &pLoader))) {
- IDirectMusicObject* pObject;
- if (SUCCEEDED(IDirectMusicLoader_GetObject (pLoader, &ObjDesc, &IID_IDirectMusicObject, (LPVOID*)&pObject))) {
- IDirectMusicObject_QueryInterface (pObject, &IID_IDirectMusicCollection, (LPVOID*)&pNewInstrument->ppReferenceCollection);
- IDirectMusicLoader_Release (pLoader);
- }
- }
- IDirectMusicGetLoader_Release (pGetLoader);
- } else {
- ERR("Could not get IDirectMusicGetLoader... reference will not be loaded :(\n");
- /* E_FAIL */
- }
- }
- list_add_tail (&This->pParentObject->pBand->Instruments, &pNewInstrument->entry);
- break;
- }
- default: {
- TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
- return E_FAIL;
- }
- }
- break;
- }
- default: {
- TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
- liMove.QuadPart = chunkSize;
- 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]);
- break;
- }
- default: {
- TRACE_(dmfile)(": unknown (skipping)\n");
- liMove.QuadPart = chunkSize - sizeof(FOURCC);
- IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
- break;
- }
- }
- break;
- }
- default: {
- TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
- liMove.QuadPart = chunkSize;
- IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
- break;
- }
- }
- TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize);
- } while (StreamCount < StreamSize);
- break;
- }
- default: {
- TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
- liMove.QuadPart = StreamSize;
- IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
- return E_FAIL;
- }
+ switch (chunkID) {
+ case DMUS_FOURCC_GUID_CHUNK: {
+ TRACE_(dmfile)(": GUID chunk\n");
+ pBand->guidID = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pBand->guidID, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_VERSION_CHUNK: {
+ TRACE_(dmfile)(": version chunk\n");
+ pBand->vVersion = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pBand->vVersion, chunkSize, NULL);
+ break;
+ }
+ case FOURCC_LIST: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
+ ListSize[0] = chunkSize - sizeof(FOURCC);
+ ListCount[0] = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_UNFO_LIST: {
+ TRACE_(dmfile)(": UNFO list\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ 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->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->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->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->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->wzComment = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pBand->wzComment, chunkSize, NULL);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ 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]);
+ break;
+ }
+ case DMUS_FOURCC_INSTRUMENTS_LIST: {
+ TRACE_(dmfile)(": instruments list\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case FOURCC_LIST: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
+ ListSize[1] = chunkSize - sizeof(FOURCC);
+ 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);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case DMUS_FOURCC_INSTRUMENT_CHUNK: {
+ TRACE_(dmfile)(": band instrument header\n");
+ IStream_Read (pStm, &pNewInstrument->pInstrument, chunkSize, NULL);
+ break;
+ }
+ case FOURCC_LIST: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
+ ListSize[2] = chunkSize - sizeof(FOURCC);
+ ListCount[2] = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_REF_LIST: {
+ TRACE_(dmfile)(": reference list\n");
+ ZeroMemory ((LPVOID)&ObjDesc, sizeof(DMUS_OBJECTDESC));
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ ListCount[2] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case DMUS_FOURCC_REF_CHUNK: {
+ TRACE_(dmfile)(": reference header chunk\n");
+ IStream_Read (pStm, &tempReferenceHeader, chunkSize, NULL);
+ /* copy retrieved data to DMUS_OBJECTDESC */
+ ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC);
+ ObjDesc.guidClass = tempReferenceHeader.guidClassID;
+ ObjDesc.dwValidData = tempReferenceHeader.dwValidData;
+ break;
+ }
+ case DMUS_FOURCC_GUID_CHUNK: {
+ TRACE_(dmfile)(": guid chunk\n");
+ IStream_Read (pStm, &ObjDesc.guidObject, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_DATE_CHUNK: {
+ TRACE_(dmfile)(": file date chunk\n");
+ IStream_Read (pStm, &ObjDesc.ftDate, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_NAME_CHUNK: {
+ TRACE_(dmfile)(": name chunk\n");
+ IStream_Read (pStm, &ObjDesc.wszName, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_FILE_CHUNK: {
+ TRACE_(dmfile)(": file name chunk\n");
+ IStream_Read (pStm, &ObjDesc.wszFileName, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_CATEGORY_CHUNK: {
+ TRACE_(dmfile)(": category chunk\n");
+ IStream_Read (pStm, &ObjDesc.wszCategory, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_VERSION_CHUNK: {
+ TRACE_(dmfile)(": version chunk\n");
+ IStream_Read (pStm, &ObjDesc.vVersion, chunkSize, NULL);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip this chunk */
+ break;
+ }
+ }
+ TRACE_(dmfile)(": ListCount[2] = %ld < ListSize[2] = %ld\n", ListCount[2], ListSize[2]);
+ } while (ListCount[2] < ListSize[2]);
+ /* let's see what we have */
+ TRACE_(dmfile)(": (READ): reference: dwSize = %ld; dwValidData = %ld; guidObject = %s; guidClass = %s; \
+vVersion = %08lx,%08lx; wszName = %s; wszCategory = %s; wszFileName = %s\n",
+ ObjDesc.dwSize, ObjDesc.dwValidData, debugstr_guid(&ObjDesc.guidObject), debugstr_guid(&ObjDesc.guidClass),
+ ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.wszName), debugstr_w(ObjDesc.wszCategory), debugstr_w(ObjDesc.wszFileName));
+ /* now, let's convience loader to load reference */
+ if (IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (LPVOID*)&pGetLoader) == S_OK) {
+ if (IDirectMusicGetLoader_GetLoader (pGetLoader, &pLoader) == S_OK) {
+ /* load referenced object */
+ 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*)&pNewInstrument->ppReferenceCollection)))
+ IDirectMusicLoader_Release (pLoader);
+ }
+ IDirectMusicGetLoader_Release (pGetLoader);
+ } else {
+ ERR("Could not get IDirectMusicGetLoader... reference will not be loaded :(\n");
+ /* E_FAIL */
}
- TRACE_(dmfile)(": reading finished\n");
break;
- }
- default: {
+ }
+ default: {
TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
- liMove.QuadPart = chunkSize;
- IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
return E_FAIL;
+ }
+ }
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip this chunk */
+ break;
+ }
+ }
+ TRACE_(dmfile)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount[1], ListSize[1]);
+ } while (ListCount[1] < ListSize[1]);
+ /* 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 (!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;
+ ObjDesc.guidObject = GUID_DefaultGMCollection;
+ ObjDesc.guidClass = CLSID_DirectMusicCollection;
+ if (SUCCEEDED(IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (LPVOID*)&pGetLoader))) {
+ if (SUCCEEDED(IDirectMusicGetLoader_GetLoader (pGetLoader, &pLoader))) {
+ IDirectMusicObject* pObject;
+ if (SUCCEEDED(IDirectMusicLoader_GetObject (pLoader, &ObjDesc, &IID_IDirectMusicObject, (LPVOID*)&pObject))) {
+ IDirectMusicObject_QueryInterface (pObject, &IID_IDirectMusicCollection, (LPVOID*)&pNewInstrument->ppReferenceCollection);
+ IDirectMusicLoader_Release (pLoader);
+ }
+ }
+ IDirectMusicGetLoader_Release (pGetLoader);
+ } else {
+ ERR("Could not get IDirectMusicGetLoader... reference will not be loaded :(\n");
+ /* E_FAIL */
+ }
+ }
+ list_add_tail (&This->pParentObject->pBand->Instruments, &pNewInstrument->entry);
+ break;
}
- }
-
- /* 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++;
+ default: {
+ TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+ return E_FAIL;
}
+ }
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ 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]);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown (skipping)\n");
+ liMove.QuadPart = chunkSize - sizeof(FOURCC);
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ break;
+ }
+ }
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ break;
+ }
}
-
- return S_OK;
+ TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize);
+ } while (StreamCount < StreamSize);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+ liMove.QuadPart = StreamSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+ return E_FAIL;
+ }
+ }
+ TRACE_(dmfile)(": reading finished\n");
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+ return E_FAIL;
+ }
+ }
+
+ /* 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, &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;
}
HRESULT WINAPI IDirectMusicBandObjectStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)
Index: dlls/dmband/bandtrack.c
===================================================================
RCS file: /home/wine/wine/dlls/dmband/bandtrack.c,v
retrieving revision 1.3
diff -u -r1.3 bandtrack.c
--- dlls/dmband/bandtrack.c 28 Oct 2003 21:08:55 -0000 1.3
+++ dlls/dmband/bandtrack.c 2 Nov 2003 13:46:03 -0000
@@ -423,16 +423,19 @@
switch (chunkID) {
case DMUS_FOURCC_BANDTRACK_CHUNK: {
TRACE_(dmfile)(": band track header chunk\n");
+ pTrack->btkHeader = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
IStream_Read (pStm, pTrack->btkHeader, chunkSize, NULL);
break;
}
case DMUS_FOURCC_GUID_CHUNK: {
TRACE_(dmfile)(": GUID chunk\n");
+ pTrack->guidID = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
IStream_Read (pStm, pTrack->guidID, chunkSize, NULL);
break;
}
case DMUS_FOURCC_VERSION_CHUNK: {
TRACE_(dmfile)(": version chunk\n");
+ pTrack->vVersion = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
IStream_Read (pStm, pTrack->vVersion, chunkSize, NULL);
break;
}
Index: dlls/dmloader/container.c
===================================================================
RCS file: /home/wine/wine/dlls/dmloader/container.c,v
retrieving revision 1.4
diff -u -r1.4 container.c
--- dlls/dmloader/container.c 27 Oct 2003 22:08:37 -0000 1.4
+++ dlls/dmloader/container.c 2 Nov 2003 13:46:05 -0000
@@ -24,10 +24,12 @@
#include "winuser.h"
#include "wingdi.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
#include "dmloader_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmloader);
+WINE_DECLARE_DEBUG_CHANNEL(dmfile);
/* IDirectMusicContainer IUnknown parts follow: */
HRESULT WINAPI IDirectMusicContainerImpl_QueryInterface (LPDIRECTMUSICCONTAINER iface, REFIID riid, LPVOID *ppobj)
@@ -67,9 +69,24 @@
{
ICOM_THIS(IDirectMusicContainerImpl,iface);
- FIXME("(%p, %s, %ld, %p, %p): stub\n", This, debugstr_guid(rguidClass), dwIndex, pDesc, pwszAlias);
+ TRACE("(%p, %s, %ld, %p, %p)\n", This, debugstr_guid(rguidClass), dwIndex, pDesc, pwszAlias);
- return S_OK;
+ int r = 0;
+ DMUS_PRIVATE_OBJECT *tmpEntry;
+ struct list *listEntry;
+ DMUS_OBJECTDESC ObjDesc;
+
+ LIST_FOR_EACH (listEntry, &This->Objects) {
+ tmpEntry = LIST_ENTRY( listEntry, DMUS_PRIVATE_OBJECT, entry );
+ if (dwIndex == r) {
+ strcpyW (pwszAlias, tmpEntry->wzAlias);
+ IDirectMusicObject_GetDescriptor (tmpEntry->ppObject, &ObjDesc);
+ *pDesc = ObjDesc;
+ return S_OK;
+ }
+ r++;
+ }
+ return S_FALSE;
}
ICOM_VTABLE(IDirectMusicContainer) DirectMusicContainer_Vtbl =
@@ -94,6 +111,7 @@
}
dmcon->lpVtbl = &DirectMusicContainer_Vtbl;
dmcon->ref = 1;
+ list_init (&dmcon->Objects);
*ppDMCon = (LPDIRECTMUSICCONTAINER) dmcon;
return S_OK;
}
@@ -152,7 +170,7 @@
ICOM_THIS(IDirectMusicContainerObject,iface);
TRACE("(%p, %p)\n", This, pDesc);
- pDesc = This->pDesc;
+ memcpy(pDesc, &This->desc, sizeof(DMUS_OBJECTDESC));
return S_OK;
}
@@ -162,7 +180,29 @@
ICOM_THIS(IDirectMusicContainerObject,iface);
TRACE("(%p, %p)\n", This, pDesc);
- This->pDesc = pDesc;
+
+ This->desc.dwValidData = pDesc->dwValidData;
+ /** follow memcpy is temporary while all fields aren't supported */
+ memcpy(&This->desc, pDesc, sizeof(DMUS_OBJECTDESC));
+
+ if (This->pContainer->guidID) {
+ memcpy (&This->desc.guidObject, This->pContainer->guidID, sizeof (This->desc.guidObject));
+ This->desc.dwValidData |= DMUS_OBJ_OBJECT;
+ } else {
+ if (pDesc->dwValidData & DMUS_OBJ_OBJECT)
+ memcpy (&This->desc.guidObject, &pDesc->guidObject, sizeof (This->desc.guidObject));
+ }
+ if (pDesc->dwValidData & DMUS_OBJ_FILENAME)
+ strncpyW (This->desc.wszFileName, pDesc->wszFileName, MAX_PATH);
+ if (This->pContainer->wzName) {
+ strcpyW (This->desc.wszName, This->pContainer->wzName);
+ This->desc.dwValidData |= DMUS_OBJ_NAME;
+ } else {
+ if (pDesc->dwValidData & DMUS_OBJ_NAME)
+ strcpyW (This->desc.wszName, pDesc->wszName);
+ }
+ if (pDesc->dwValidData & DMUS_OBJ_CATEGORY)
+ strcpyW (This->desc.wszCategory, pDesc->wszCategory);
return S_OK;
}
@@ -257,7 +297,8 @@
/* IDirectMusicContainerObjectStream IPersist part: */
HRESULT WINAPI IDirectMusicContainerObjectStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID)
{
- return E_NOTIMPL;
+ *pClassID = CLSID_DirectMusicContainer;
+ return S_OK;
}
/* IDirectMusicContainerObjectStream IPersistStream part: */
@@ -268,8 +309,384 @@
HRESULT WINAPI IDirectMusicContainerObjectStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
{
- FIXME(": Loading not implemented yet\n");
- return S_OK;
+ ICOM_THIS(IDirectMusicContainerObjectStream,iface);
+ FOURCC chunkID;
+ DWORD chunkSize, StreamSize, StreamCount, ListSize[3], ListCount[3];
+ LARGE_INTEGER liMove; /* used when skipping chunks */
+ DMUS_IO_REFERENCE tempReferenceHeader;
+ IDirectMusicContainerImpl* pContainer = This->pParentObject->pContainer; /* that's where we load data to */
+ LPDIRECTMUSICLOADER pLoader;
+ LPDIRECTMUSICGETLOADER pGetLoader;
+
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case FOURCC_RIFF: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunkID));
+ StreamSize = chunkSize - sizeof(FOURCC);
+ StreamCount = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_CONTAINER_FORM: {
+ TRACE_(dmfile)(": container form\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case DMUS_FOURCC_CONTAINER_CHUNK: {
+ TRACE_(dmfile)(": container header chunk\n");
+ pContainer->pHeader = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->pHeader, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_GUID_CHUNK: {
+ TRACE_(dmfile)(": GUID chunk\n");
+ pContainer->guidID = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->guidID, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_VERSION_CHUNK: {
+ TRACE_(dmfile)(": version chunk\n");
+ pContainer->vVersion = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->vVersion, chunkSize, NULL);
+ break;
+ }
+ case FOURCC_LIST: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
+ ListSize[0] = chunkSize - sizeof(FOURCC);
+ ListCount[0] = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_UNFO_LIST: {
+ TRACE_(dmfile)(": UNFO list\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ 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");
+ pContainer->wzName = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->wzName, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','A','R','T'):
+ case DMUS_FOURCC_UART_CHUNK: {
+ TRACE_(dmfile)(": artist chunk\n");
+ pContainer->wzArtist = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->wzArtist, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','C','O','P'):
+ case DMUS_FOURCC_UCOP_CHUNK: {
+ TRACE_(dmfile)(": copyright chunk\n");
+ pContainer->wzCopyright = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->wzCopyright, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','S','B','J'):
+ case DMUS_FOURCC_USBJ_CHUNK: {
+ TRACE_(dmfile)(": subject chunk\n");
+ pContainer->wzSubject = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->wzSubject, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','C','M','T'):
+ case DMUS_FOURCC_UCMT_CHUNK: {
+ TRACE_(dmfile)(": comment chunk\n");
+ pContainer->wzComment = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pContainer->wzComment, chunkSize, NULL);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ 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]);
+ break;
+ }
+ case DMUS_FOURCC_CONTAINED_OBJECTS_LIST: {
+ TRACE_(dmfile)(": objects list\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case FOURCC_LIST: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
+ ListSize[1] = chunkSize - sizeof(FOURCC);
+ ListCount[1] = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_CONTAINED_OBJECT_LIST: {
+ /* init new instrument list entry */
+ LPDMUS_PRIVATE_OBJECT pNewObject = (LPDMUS_PRIVATE_OBJECT) HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_OBJECT));
+ TRACE_(dmfile)(": ojbect list\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
+ ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case DMUS_FOURCC_CONTAINED_ALIAS_CHUNK: {
+ TRACE_(dmfile)(": contained object alias chunk\n");
+ pNewObject->wzAlias = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pNewObject->wzAlias, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_CONTAINED_OBJECT_CHUNK: {
+ TRACE_(dmfile)(": contained object header\n");
+ IStream_Read (pStm, &pNewObject->pHeader, chunkSize, NULL);
+ break;
+ }
+ /* now object can be either in form of reference or embedded RIFF */
+ case FOURCC_LIST: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
+ ListSize[2] = chunkSize - sizeof(FOURCC);
+ ListCount[2] = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_REF_LIST: {
+ TRACE_(dmfile)(": reference list\n");
+ DMUS_OBJECTDESC ObjDesc;
+ ZeroMemory ((LPVOID)&ObjDesc, sizeof(DMUS_OBJECTDESC));
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ ListCount[2] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case DMUS_FOURCC_REF_CHUNK: {
+ TRACE_(dmfile)(": reference header chunk\n");
+ IStream_Read (pStm, &tempReferenceHeader, chunkSize, NULL);
+ /* copy retrieved data to DMUS_OBJECTDESC */
+ ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC);
+ ObjDesc.guidClass = tempReferenceHeader.guidClassID;
+ ObjDesc.dwValidData = tempReferenceHeader.dwValidData;
+ break;
+ }
+ case DMUS_FOURCC_GUID_CHUNK: {
+ TRACE_(dmfile)(": guid chunk\n");
+ IStream_Read (pStm, &ObjDesc.guidObject, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_DATE_CHUNK: {
+ TRACE_(dmfile)(": file date chunk\n");
+ IStream_Read (pStm, &ObjDesc.ftDate, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_NAME_CHUNK: {
+ TRACE_(dmfile)(": name chunk\n");
+ IStream_Read (pStm, &ObjDesc.wszName, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_FILE_CHUNK: {
+ TRACE_(dmfile)(": file name chunk\n");
+ IStream_Read (pStm, &ObjDesc.wszFileName, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_CATEGORY_CHUNK: {
+ TRACE_(dmfile)(": category chunk\n");
+ IStream_Read (pStm, &ObjDesc.wszCategory, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_VERSION_CHUNK: {
+ TRACE_(dmfile)(": version chunk\n");
+ IStream_Read (pStm, &ObjDesc.vVersion, chunkSize, NULL);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip this chunk */
+ break;
+ }
+ }
+ TRACE_(dmfile)(": ListCount[2] = %ld < ListSize[2] = %ld\n", ListCount[2], ListSize[2]);
+ } while (ListCount[2] < ListSize[2]);
+ /* let's see what we have */
+ TRACE_(dmfile)(": (READ): reference: dwSize = %ld; dwValidData = %ld; guidObject = %s; guidClass = %s; vVersion = %08lx,%08lx; wszName = %s; wszCategory = %s; wszFileName = %s\n",
+ ObjDesc.dwSize, ObjDesc.dwValidData, debugstr_guid(&ObjDesc.guidObject), debugstr_guid(&ObjDesc.guidClass),
+ ObjDesc.vVersion.dwVersionMS, ObjDesc.vVersion.dwVersionLS, debugstr_w(ObjDesc.wszName), debugstr_w(ObjDesc.wszCategory), debugstr_w(ObjDesc.wszFileName));
+ /* now, let's convience loader to load reference */
+ if (SUCCEEDED(IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (LPVOID*) &pGetLoader))) {
+ if (SUCCEEDED(IDirectMusicGetLoader_GetLoader (pGetLoader, &pLoader))) {
+ /* load referenced object into new object entry */
+ if (FAILED(IDirectMusicLoader_GetObject (pLoader, &ObjDesc, &IID_IDirectMusicObject, (LPVOID*) &pNewObject->ppObject))) {
+ ERR("Couldn't load reference\n");
+ }
+ IDirectMusicLoader_Release (pLoader);
+ }
+ IDirectMusicGetLoader_Release (pGetLoader);
+ } else {
+ ERR("Could not get IDirectMusicGetLoader... reference will not be loaded :(\n");
+ /* E_FAIL */
+ }
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+ return E_FAIL;
+ }
+ }
+ break;
+ }
+ case FOURCC_RIFF: {
+ TRACE_(dmfile)(": RIFF chunk");
+ /* now we load it using loader and then get it's object interface and put it on then
+ list; sounds too easy to be true (FIXME!)*/
+ /* move at the beginning of RIFF */
+ liMove.QuadPart = 0;
+ liMove.QuadPart -= (sizeof(FOURCC) + sizeof(DWORD));
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ /* now get the loader */
+ DMUS_OBJECTDESC ObjDesc2;
+ ZeroMemory ((LPVOID)&ObjDesc2, sizeof(DMUS_OBJECTDESC));
+ ObjDesc2.dwSize = sizeof(DMUS_OBJECTDESC);
+ ObjDesc2.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_STREAM;
+ ObjDesc2.pStream = pStm;
+ memcpy (&ObjDesc2.guidClass, &pNewObject->pHeader.guidClassID, sizeof(pNewObject->pHeader.guidClassID));
+ if (SUCCEEDED(IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (LPVOID*) &pGetLoader))) {
+ if (SUCCEEDED(IDirectMusicGetLoader_GetLoader (pGetLoader, &pLoader))) {
+ /* load contained object into new object entry */
+ if (FAILED(IDirectMusicLoader_GetObject (pLoader, &ObjDesc2, &IID_IDirectMusicObject, (LPVOID*)&pNewObject->ppObject))) {
+ ERR("Couldn't load contained object\n");
+ }
+ IDirectMusicLoader_Release (pLoader);
+ }
+ IDirectMusicGetLoader_Release (pGetLoader);
+ } else {
+ ERR("Could not get IDirectMusicGetLoader... contained object will not be loaded :(\n");
+ /* E_FAIL */
+ }
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip this chunk */
+ break;
+ }
+ }
+ TRACE_(dmfile)(": ListCount[1] = %ld < ListSize[1] = %ld\n", ListCount[1], ListSize[1]);
+ } while (ListCount[1] < ListSize[1]);
+ list_add_tail (&pContainer->Objects, &pNewObject->entry);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+ return E_FAIL;
+ }
+ }
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ 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]);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown (skipping)\n");
+ liMove.QuadPart = chunkSize - sizeof(FOURCC);
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ break;
+ }
+ }
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ break;
+ }
+ }
+ TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize);
+ } while (StreamCount < StreamSize);
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+ liMove.QuadPart = StreamSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+ return E_FAIL;
+ }
+ }
+ TRACE_(dmfile)(": reading finished\n");
+ break;
+ }
+ default: {
+ TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+ return E_FAIL;
+ }
+ }
+
+ /* DEBUG: dumps whole container object tree: */
+ if (TRACE_ON(dmfile)) {
+ int r = 0;
+ DMUS_PRIVATE_OBJECT *tmpEntry;
+ struct list *listEntry;
+
+ TRACE("*** IDirectMusicContainer (%p) ***\n", pContainer);
+ if (pContainer->pHeader) {
+ TRACE(" - Container header:\n");
+ TRACE(" - dwFlags = %ld\n", pContainer->pHeader->dwFlags);
+ }
+ if (pContainer->guidID)
+ TRACE(" - GUID = %s\n", debugstr_guid(pContainer->guidID));
+ if (pContainer->vVersion)
+ TRACE(" - Version = %i,%i,%i,%i\n", (pContainer->vVersion->dwVersionMS >> 8) && 0x0000FFFF, pContainer->vVersion->dwVersionMS && 0x0000FFFF, \
+ (pContainer->vVersion->dwVersionLS >> 8) && 0x0000FFFF, pContainer->vVersion->dwVersionLS && 0x0000FFFF);
+ if (pContainer->wzName)
+ TRACE(" - Name = %s\n", debugstr_w(pContainer->wzName));
+ if (pContainer->wzArtist)
+ TRACE(" - Artist = %s\n", debugstr_w(pContainer->wzArtist));
+ if (pContainer->wzCopyright)
+ TRACE(" - Copyright = %s\n", debugstr_w(pContainer->wzCopyright));
+ if (pContainer->wzSubject)
+ TRACE(" - Subject = %s\n", debugstr_w(pContainer->wzSubject));
+ if (pContainer->wzComment)
+ TRACE(" - Comment = %s\n", debugstr_w(pContainer->wzComment));
+
+ TRACE(" - Objects:\n");
+
+ LIST_FOR_EACH (listEntry, &pContainer->Objects) {
+ tmpEntry = LIST_ENTRY( listEntry, DMUS_PRIVATE_OBJECT, entry );
+ TRACE(" - Object[%i]:\n", r);
+ TRACE(" - Alias for this object: %s\n", debugstr_w(tmpEntry->wzAlias));
+ TRACE(" - Object header:\n");
+ TRACE(" - guidClassID = %s\n", debugstr_guid(&tmpEntry->pHeader.guidClassID));
+ TRACE(" - dwFlags = %ld\n", tmpEntry->pHeader.dwFlags);
+ TRACE(" - ckid = %s\n", debugstr_fourcc(tmpEntry->pHeader.ckid));
+ TRACE(" - fccType = %s\n", debugstr_fourcc(tmpEntry->pHeader.fccType));
+ TRACE(" - Object pointer: %p\n", tmpEntry->ppObject);
+ r++;
+ }
+ }
+
+ TRACE("Reading finished\n");
+
+ return S_OK;
}
HRESULT WINAPI IDirectMusicContainerObjectStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)
Index: dlls/dmloader/dmloader_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dmloader/dmloader_private.h,v
retrieving revision 1.5
diff -u -r1.5 dmloader_private.h
--- dlls/dmloader/dmloader_private.h 31 Oct 2003 00:08:02 -0000 1.5
+++ dlls/dmloader/dmloader_private.h 2 Nov 2003 13:46:06 -0000
@@ -42,11 +42,19 @@
typedef struct _DMUS_PRIVATE_CACHE_ENTRY {
struct list entry; /* for listing elements */
GUID guidObject;
- WCHAR wzFileName[MAX_PATH];
- WCHAR wzName[256];
+ WCHAR wzFileName[DMUS_MAX_FILENAME];
+ WCHAR wzShortFileName[DMUS_MAX_FILENAME];
+ WCHAR wzName[DMUS_MAX_NAME];
+ WCHAR wzCategory[DMUS_MAX_CATEGORY];
IDirectMusicObject* pObject;
} DMUS_PRIVATE_CACHE_ENTRY, *LPDMUS_PRIVATE_CACHE_ENTRY;
+typedef struct _DMUS_PRIVATE_OBJECT {
+ struct list entry; /* for listing elements */
+ WCHAR* wzAlias;
+ DMUS_IO_CONTAINED_OBJECT_HEADER pHeader;
+ IDirectMusicObject* ppObject;
+} DMUS_PRIVATE_OBJECT, *LPDMUS_PRIVATE_OBJECT;
/*****************************************************************************
* Interfaces
@@ -134,6 +142,18 @@
/* IDirectMusicContainerImpl fields */
IDirectMusicContainerObject* pObject;
+ DMUS_IO_CONTAINER_HEADER* pHeader;
+ GUID* guidID; /* unique id */
+ DMUS_IO_VERSION* vVersion; /* version */
+ /* info from UNFO list */
+ WCHAR* wzName;
+ WCHAR* wzArtist;
+ WCHAR* wzCopyright;
+ WCHAR* wzSubject;
+ WCHAR* wzComment;
+
+ /* data */
+ struct list Objects;
};
/* IUnknown: */
@@ -154,7 +174,7 @@
DWORD ref;
/* IDirectMusicObjectImpl fields */
- LPDMUS_OBJECTDESC pDesc;
+ DMUS_OBJECTDESC desc;
IDirectMusicContainerObjectStream* pStream;
IDirectMusicContainerImpl* pContainer;
};
@@ -232,5 +252,12 @@
extern HRESULT WINAPI ILoaderStream_IStream_UnlockRegion (LPSTREAM iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType);
extern HRESULT WINAPI ILoaderStream_IStream_Stat (LPSTREAM iface, STATSTG* pstatstg, DWORD grfStatFlag);
extern HRESULT WINAPI ILoaderStream_IStream_Clone (LPSTREAM iface, IStream** ppstm);
+
+static inline const char *debugstr_fourcc (DWORD fourcc) {
+ if (!fourcc) return "'null'";
+ return wine_dbg_sprintf ("\'%c%c%c%c\'",
+ (char)(fourcc), (char)(fourcc >> 8),
+ (char)(fourcc >> 16), (char)(fourcc >> 24));
+}
#endif /* __WINE_DMLOADER_PRIVATE_H */
Index: dlls/dmloader/loader.c
===================================================================
RCS file: /home/wine/wine/dlls/dmloader/loader.c,v
retrieving revision 1.8
diff -u -r1.8 loader.c
--- dlls/dmloader/loader.c 31 Oct 2003 00:08:02 -0000 1.8
+++ dlls/dmloader/loader.c 2 Nov 2003 13:46:07 -0000
@@ -77,6 +77,7 @@
struct list *listEntry;
DMUS_PRIVATE_CACHE_ENTRY *cacheEntry;
LPDMUS_PRIVATE_CACHE_ENTRY newEntry;
+ DMUS_OBJECTDESC tmpDesc;
TRACE("(%p, %p(dwValidData:0x%08lx), %s, %p)\n", This, pDesc, pDesc->dwValidData, debugstr_guid(riid), ppv);
@@ -84,7 +85,49 @@
LIST_FOR_EACH (listEntry, &This->CacheList) {
cacheEntry = LIST_ENTRY( listEntry, DMUS_PRIVATE_CACHE_ENTRY, entry );
-
+
+ /* according to MSDN, search order is the following */
+ if (pDesc->dwValidData & DMUS_OBJ_OBJECT) {
+ if (IsEqualGUID (&cacheEntry->guidObject, &pDesc->guidObject)) {
+ TRACE(": found it by GUID\n");
+ if (cacheEntry->pObject)
+ return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv);
+ }
+ }
+ else if (pDesc->dwValidData & DMUS_OBJ_MEMORY) {
+ FIXME(": DMUS_OBJ_MEMORY not supported yet\n");
+ }
+ else if (pDesc->dwValidData & DMUS_OBJ_FILENAME && pDesc->dwValidData & DMUS_OBJ_FULLPATH) {
+ if (!strncmpW (cacheEntry->wzFileName, pDesc->wszFileName, DMUS_MAX_FILENAME)) {
+ TRACE(": found it by fullpath filename\n");
+ if (cacheEntry->pObject)
+ return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv);
+ }
+ }
+ else if (pDesc->dwValidData & DMUS_OBJ_NAME && pDesc->dwValidData & DMUS_OBJ_CATEGORY) {
+ if (!strncmpW (cacheEntry->wzName, pDesc->wszName, DMUS_MAX_NAME) &&
+ !strncmpW (cacheEntry->wzCategory, pDesc->wszCategory, DMUS_MAX_CATEGORY)) {
+ TRACE(": found it by name and category\n");
+ if (cacheEntry->pObject)
+ return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv);
+ }
+ }
+ else if (pDesc->dwValidData & DMUS_OBJ_NAME) {
+ if (!strncmpW (cacheEntry->wzName, pDesc->wszName, DMUS_MAX_NAME)) {
+ TRACE(": found it by name\n");
+ if (cacheEntry->pObject)
+ return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv);
+ }
+ }
+ else if (pDesc->dwValidData & DMUS_OBJ_FILENAME) {
+ if (!strncmpW (cacheEntry->wzShortFileName, pDesc->wszFileName, DMUS_MAX_FILENAME)) {
+ TRACE(": found it by short filename\n");
+ if (cacheEntry->pObject)
+ return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv);
+ }
+ }
+
+/*
if ((pDesc->dwValidData & DMUS_OBJ_OBJECT) || (pDesc->dwValidData & DMUS_OBJ_FILENAME)) {
if (pDesc->dwValidData & DMUS_OBJ_OBJECT) {
if (IsEqualGUID (&cacheEntry->guidObject, &pDesc->guidObject)) {
@@ -100,46 +143,16 @@
return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv);
}
}
- } else if (pDesc->dwValidData & DMUS_OBJ_NAME) {
- /**
- * Usually search by name (for example main procedure name for scripts) after containers loading
- * TODO: container loading code
- */
- TRACE(" comparing %s with cached %s (file:%s)\n", debugstr_w (pDesc->wszName), debugstr_w (cacheEntry->wzName), debugstr_w(cacheEntry->wzFileName));
- if (cacheEntry->wzName && !strncmpW (pDesc->wszName, cacheEntry->wzName, 256)) {
- TRACE(": found it by Name\n");
- if (NULL != cacheEntry->pObject)
- return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv);
- }
}
+*/
}
/* object doesn't exist in cache... guess we'll have to load it */
TRACE(": object does not exist in cache\n");
if (pDesc->dwValidData & DMUS_OBJ_LOADED) {
- ERR("Wanted a on-memory (cached) entry, but not found. Active Hack (waiting for Load code)\n");
- /* ugly hack waiting for Load impl */
- result = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*) &pObject);
- if (SUCCEEDED(result)) {
- /* add object to cache */
- result = IDirectMusicObject_QueryInterface (pObject, riid, ppv);
- if (SUCCEEDED(result)) {
- newEntry = (LPDMUS_PRIVATE_CACHE_ENTRY) HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_CACHE_ENTRY));
- if (pDesc->dwValidData & DMUS_OBJ_NAME)
- strncpyW (newEntry->wzName, pDesc->wszName, 256);
- newEntry->pObject = pObject;
- list_add_tail (&This->CacheList, &newEntry->entry);
- TRACE(": filled in cache entry\n");
- } else {
- IDirectMusicObject_Release(pObject);
- }
- }
- return result;
- /*
- * Normal code
+ ERR("wanted on memory object failed\n");
*ppv = NULL;
return E_FAIL;
- */
}
if (!(pDesc->dwValidData & DMUS_OBJ_CLASS)) {
WARN("guidClass not valid but needed. What they want to do ?\n");
@@ -229,15 +242,30 @@
return E_FAIL;
}
/* add object to cache */
+ IDirectMusicObject_SetDescriptor (pObject, pDesc);
+ IDirectMusicObject_GetDescriptor (pObject, &tmpDesc);
newEntry = (LPDMUS_PRIVATE_CACHE_ENTRY) HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_CACHE_ENTRY));
- if (pDesc->dwValidData & DMUS_OBJ_OBJECT)
- memcpy (&newEntry->guidObject, &pDesc->guidObject, sizeof (pDesc->guidObject));
- if (pDesc->dwValidData & DMUS_OBJ_FILENAME)
- strncpyW (newEntry->wzFileName, pDesc->wszFileName, MAX_PATH);
+ if (tmpDesc.dwValidData & DMUS_OBJ_OBJECT)
+ memcpy (&newEntry->guidObject, &tmpDesc.guidObject, sizeof (tmpDesc.guidObject));
+ if (tmpDesc.dwValidData & DMUS_OBJ_FILENAME)
+ strncpyW (newEntry->wzFileName, tmpDesc.wszFileName, MAX_PATH);
+ if (tmpDesc.dwValidData & DMUS_OBJ_NAME)
+ strcpyW (newEntry->wzName, tmpDesc.wszName);
+ if (tmpDesc.dwValidData & DMUS_OBJ_CATEGORY)
+ strcpyW (newEntry->wzCategory, tmpDesc.wszCategory);
if (pObject)
- newEntry->pObject = pObject;
+ newEntry->pObject = pObject;
list_add_tail (&This->CacheList, &newEntry->entry);
TRACE(": filled in cache entry\n");
+
+ if (tmpDesc.dwValidData & DMUS_OBJ_OBJECT)
+ TRACE(" - GUID = %s\n", debugstr_guid(&newEntry->guidObject));
+ if (tmpDesc.dwValidData & DMUS_OBJ_FILENAME)
+ TRACE(" - FileName = %s\n", debugstr_w(newEntry->wzFileName));
+ if (tmpDesc.dwValidData & DMUS_OBJ_NAME)
+ TRACE(" - Name = %s\n", debugstr_w(newEntry->wzName));
+ if (tmpDesc.dwValidData & DMUS_OBJ_CATEGORY)
+ TRACE(" - Category = %s\n", debugstr_w(newEntry->wzCategory));
/* for debug purposes (e.g. to check if all files are cached) */
#if 0
Index: dlls/dmscript/dmscript_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dmscript/dmscript_private.h,v
retrieving revision 1.3
diff -u -r1.3 dmscript_private.h
--- dlls/dmscript/dmscript_private.h 5 Sep 2003 23:08:39 -0000 1.3
+++ dlls/dmscript/dmscript_private.h 2 Nov 2003 13:46:07 -0000
@@ -79,6 +79,17 @@
/* IDirectMusicScriptImpl fields */
IDirectMusicScriptObject* pObject;
+ DMUS_IO_SCRIPT_HEADER* pHeader;
+ GUID* guidID; /* unique id */
+ DMUS_IO_VERSION* vVersion; /* version */
+ WCHAR* wzLanguage;
+ WCHAR* wzSource;
+ /* info from UNFO list */
+ WCHAR* wzName;
+ WCHAR* wzArtist;
+ WCHAR* wzCopyright;
+ WCHAR* wzSubject;
+ WCHAR* wzComment;
};
/* IUnknown: */
@@ -108,7 +119,7 @@
DWORD ref;
/* IDirectMusicObjectImpl fields */
- LPDMUS_OBJECTDESC pDesc;
+ DMUS_OBJECTDESC desc;
IDirectMusicScriptObjectStream* pStream;
IDirectMusicScriptImpl* pScript;
};
@@ -207,5 +218,12 @@
extern HRESULT WINAPI IDirectMusicScriptTrackStream_Load (LPPERSISTSTREAM iface, IStream* pStm);
extern HRESULT WINAPI IDirectMusicScriptTrackStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty);
extern HRESULT WINAPI IDirectMusicScriptTrackStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize);
+
+static inline const char *debugstr_fourcc (DWORD fourcc) {
+ if (!fourcc) return "'null'";
+ return wine_dbg_sprintf ("\'%c%c%c%c\'",
+ (char)(fourcc), (char)(fourcc >> 8),
+ (char)(fourcc >> 16), (char)(fourcc >> 24));
+}
#endif /* __WINE_DMSCRIPT_PRIVATE_H */
Index: dlls/dmscript/script.c
===================================================================
RCS file: /home/wine/wine/dlls/dmscript/script.c,v
retrieving revision 1.4
diff -u -r1.4 script.c
--- dlls/dmscript/script.c 31 Oct 2003 00:08:02 -0000 1.4
+++ dlls/dmscript/script.c 2 Nov 2003 13:46:09 -0000
@@ -24,10 +24,12 @@
#include "winuser.h"
#include "wingdi.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
#include "dmscript_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmscript);
+WINE_DECLARE_DEBUG_CHANNEL(dmfile);
/* IDirectMusicScript IUnknown part: */
HRESULT WINAPI IDirectMusicScriptImpl_QueryInterface (LPDIRECTMUSICSCRIPT iface, REFIID riid, LPVOID *ppobj)
@@ -244,9 +246,8 @@
{
ICOM_THIS(IDirectMusicScriptObject,iface);
- TRACE("(%p, %p)\n", This, pDesc);
- pDesc = This->pDesc;
-
+ TRACE("(%p, %p)\n", This, &This->desc);
+ memcpy(pDesc, &This->desc, sizeof(DMUS_OBJECTDESC));
return S_OK;
}
@@ -255,8 +256,29 @@
ICOM_THIS(IDirectMusicScriptObject,iface);
TRACE("(%p, %p)\n", This, pDesc);
- This->pDesc = pDesc;
-
+
+ This->desc.dwValidData = pDesc->dwValidData;
+ /** follow memcpy is temporary while all fields aren't supported */
+ memcpy(&This->desc, pDesc, sizeof(DMUS_OBJECTDESC));
+
+ if (This->pScript->guidID) {
+ memcpy (&This->desc.guidObject, This->pScript->guidID, sizeof (This->desc.guidObject));
+ This->desc.dwValidData |= DMUS_OBJ_OBJECT;
+ } else {
+ if (pDesc->dwValidData & DMUS_OBJ_OBJECT)
+ memcpy (&This->desc.guidObject, &pDesc->guidObject, sizeof (This->desc.guidObject));
+ }
+ if (pDesc->dwValidData & DMUS_OBJ_FILENAME)
+ strncpyW (This->desc.wszFileName, pDesc->wszFileName, MAX_PATH);
+ if (This->pScript->wzName) {
+ strcpyW (This->desc.wszName, This->pScript->wzName);
+ This->desc.dwValidData |= DMUS_OBJ_NAME;
+ } else {
+ if (pDesc->dwValidData & DMUS_OBJ_NAME)
+ strcpyW (This->desc.wszName, pDesc->wszName);
+ }
+ if (pDesc->dwValidData & DMUS_OBJ_CATEGORY)
+ strcpyW (This->desc.wszCategory, pDesc->wszCategory);
return S_OK;
}
@@ -362,9 +384,241 @@
HRESULT WINAPI IDirectMusicScriptObjectStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
{
- FIXME(": Loading not implemented yet\n");
- return S_OK;
+ ICOM_THIS(IDirectMusicScriptObjectStream,iface);
+ FOURCC chunkID;
+ DWORD chunkSize, StreamSize, StreamCount, ListSize[3], ListCount[3];
+ LARGE_INTEGER liMove; /* used when skipping chunks */
+ DMUS_IO_REFERENCE tempReferenceHeader;
+ DMUS_OBJECTDESC ObjDesc;
+ IDirectMusicScriptImpl* pScript = This->pParentObject->pScript; /* that's where we load data to */
+ LPDIRECTMUSICLOADER pLoader;
+ LPDIRECTMUSICGETLOADER pGetLoader;
+
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+
+ switch (chunkID) {
+ case FOURCC_RIFF: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc (chunkID));
+ StreamSize = chunkSize - sizeof(FOURCC);
+ StreamCount = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_SCRIPT_FORM: {
+ TRACE_(dmfile)(": script form\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case DMUS_FOURCC_SCRIPT_CHUNK: {
+ TRACE_(dmfile)(": script header chunk\n");
+ pScript->pHeader = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->pHeader, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_GUID_CHUNK: {
+ TRACE_(dmfile)(": GUID chunk\n");
+ pScript->guidID = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->guidID, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_VERSION_CHUNK: {
+ TRACE_(dmfile)(": version chunk\n");
+ pScript->vVersion = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->vVersion, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_SCRIPTVERSION_CHUNK: {
+ TRACE_(dmfile)(": script version chunk\n");
+ pScript->vVersion = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->vVersion, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_SCRIPTLANGUAGE_CHUNK: {
+ TRACE_(dmfile)(": script language chunk\n");
+ pScript->wzLanguage = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->wzLanguage, chunkSize, NULL);
+ break;
+ }
+ case DMUS_FOURCC_SCRIPTSOURCE_CHUNK: {
+ TRACE_(dmfile)(": script source chunk\n");
+ pScript->wzSource = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->wzSource, chunkSize, NULL);
+ break;
+ }
+
+ case FOURCC_RIFF: {
+ DMUS_OBJECTDESC ObjDesc2;
+ IDirectMusicObject* pNewObject;
+
+ TRACE_(dmfile)(": RIFF chunk");
+ /* move at the beginning of RIFF */
+ liMove.QuadPart = 0;
+ liMove.QuadPart -= (sizeof(FOURCC) + sizeof(DWORD));
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ /* now get the loader */
+ ZeroMemory ((LPVOID)&ObjDesc2, sizeof(DMUS_OBJECTDESC));
+ ObjDesc2.dwSize = sizeof(DMUS_OBJECTDESC);
+ ObjDesc2.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_STREAM;
+ ObjDesc2.pStream = pStm;
+ memcpy (&ObjDesc2.guidClass, &CLSID_DirectMusicContainer, sizeof(ObjDesc2.guidClass));
+ if (SUCCEEDED(IStream_QueryInterface (pStm, &IID_IDirectMusicGetLoader, (LPVOID*) &pGetLoader))) {
+ if (SUCCEEDED(IDirectMusicGetLoader_GetLoader (pGetLoader, &pLoader))) {
+ /* load contained object into new object entry */
+ if (FAILED(IDirectMusicLoader_GetObject (pLoader, &ObjDesc2, &IID_IDirectMusicObject, (LPVOID*) &pNewObject))) {
+ ERR("Couldn't load contained object\n");
+ }
+ IDirectMusicLoader_Release (pLoader);
+ }
+ IDirectMusicGetLoader_Release (pGetLoader);
+ } else {
+ ERR("Could not get IDirectMusicGetLoader... contained object will not be loaded :(\n");
+ /* E_FAIL */
+ }
+ break;
+ }
+
+ case FOURCC_LIST: {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
+ ListSize[0] = chunkSize - sizeof(FOURCC);
+ ListCount[0] = 0;
+ switch (chunkID) {
+ case DMUS_FOURCC_UNFO_LIST: {
+ TRACE_(dmfile)(": UNFO list\n");
+ do {
+ IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
+ IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
+ ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
+ TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
+ switch (chunkID) {
+ case mmioFOURCC('I','N','A','M'):
+ case DMUS_FOURCC_UNAM_CHUNK: {
+ TRACE_(dmfile)(": name chunk\n");
+ pScript->wzName = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->wzName, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','A','R','T'):
+ case DMUS_FOURCC_UART_CHUNK: {
+ TRACE_(dmfile)(": artist chunk\n");
+ pScript->wzArtist = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->wzArtist, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','C','O','P'):
+ case DMUS_FOURCC_UCOP_CHUNK: {
+ TRACE_(dmfile)(": copyright chunk\n");
+ pScript->wzCopyright = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->wzCopyright, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','S','B','J'):
+ case DMUS_FOURCC_USBJ_CHUNK: {
+ TRACE_(dmfile)(": subject chunk\n");
+ pScript->wzSubject = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->wzSubject, chunkSize, NULL);
+ break;
+ }
+ case mmioFOURCC('I','C','M','T'):
+ case DMUS_FOURCC_UCMT_CHUNK: {
+ TRACE_(dmfile)(": comment chunk\n");
+ pScript->wzComment = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
+ IStream_Read (pStm, pScript->wzComment, chunkSize, NULL);
+ break;
+ }
+
+ case DMUS_FOURCC_SCRIPTTRACK_LIST: {
+ TRACE_(dmfile)(": Script track list\n");
+ }
+
+ default: {
+ TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ 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]);
+ break;
+ }
+
+ default: {
+ TRACE_(dmfile)(" DMUS_FOURCC_UNFO_LIST : unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ break;
+ }
+ }
+ break;
+ }
+
+ default: {
+ TRACE_(dmfile)(" FOURCC_LIST 2 : unknown chunk (irrevelant & skipping)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
+ break;
+ }
+ }
+ } while (StreamCount < StreamSize);
+ break;
+ }
+
+ default: {
+ TRACE_(dmfile)(" DMUS_FOURCC_SCRIPT_FORM : unexpected chunk; loading failed)\n");
+ liMove.QuadPart = StreamSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+ return E_FAIL;
+ }
+ }
+ break;
+ }
+
+ default: {
+ TRACE_(dmfile)(" FOURCC_RIFF 1 : unexpected chunk; loading failed)\n");
+ liMove.QuadPart = chunkSize;
+ IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
+ return E_FAIL;
+ }
+ }
+
+ /* DEBUG: dumps whole script object : */
+ if (TRACE_ON(dmfile)) {
+ int r = 0;
+
+ TRACE("*** IDirectMusicScript (%p) ***\n", pScript);
+ if (pScript->pHeader) {
+ TRACE(" - Script header:\n");
+ TRACE(" - dwFlags = %ld\n", pScript->pHeader->dwFlags);
+ }
+ if (pScript->guidID)
+ TRACE(" - GUID = %s\n", debugstr_guid(pScript->guidID));
+ if (pScript->vVersion)
+ TRACE(" - Version = %i,%i,%i,%i\n",
+ (pScript->vVersion->dwVersionMS >> 8) && 0x0000FFFF, pScript->vVersion->dwVersionMS && 0x0000FFFF, \
+ (pScript->vVersion->dwVersionLS >> 8) && 0x0000FFFF, pScript->vVersion->dwVersionLS && 0x0000FFFF);
+ if (pScript->wzName)
+ TRACE(" - Name = %s\n", debugstr_w(pScript->wzName));
+ if (pScript->wzArtist)
+ TRACE(" - Artist = %s\n", debugstr_w(pScript->wzArtist));
+ if (pScript->wzCopyright)
+ TRACE(" - Copyright = %s\n", debugstr_w(pScript->wzCopyright));
+ if (pScript->wzSubject)
+ TRACE(" - Subject = %s\n", debugstr_w(pScript->wzSubject));
+ if (pScript->wzComment)
+ TRACE(" - Comment = %s\n", debugstr_w(pScript->wzComment));
+ if (pScript->wzLanguage)
+ TRACE(" - Language = %s\n", debugstr_w(pScript->wzLanguage));
+ if (pScript->wzSource)
+ TRACE(" - Source = %s\n", debugstr_w(pScript->wzSource));
+ }
+
+ return S_OK;
}
HRESULT WINAPI IDirectMusicScriptObjectStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)
Index: include/dmusici.h
===================================================================
RCS file: /home/wine/wine/include/dmusici.h,v
retrieving revision 1.6
diff -u -r1.6 dmusici.h
--- include/dmusici.h 28 Aug 2003 21:43:35 -0000 1.6
+++ include/dmusici.h 2 Nov 2003 13:46:21 -0000
@@ -46,33 +46,33 @@
DEFINE_GUID(CLSID_DirectMusicPerformance, 0xd2ac2881,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
DEFINE_GUID(CLSID_DirectMusicSegment, 0xd2ac2882,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
DEFINE_GUID(CLSID_DirectMusicSegmentState, 0xd2ac2883,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
-DEFINE_GUID(CLSID_DirectMusicGraph, 0xd2ac2884,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
-DEFINE_GUID(CLSID_DirectMusicStyle, 0xd2ac288a,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicGraph, 0xd2ac2884,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
+DEFINE_GUID(CLSID_DirectMusicStyle, 0xd2ac288a,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
DEFINE_GUID(CLSID_DirectMusicChordMap, 0xd2ac288f,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
DEFINE_GUID(CLSID_DirectMusicComposer, 0xd2ac2890,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
DEFINE_GUID(CLSID_DirectMusicLoader, 0xd2ac2892,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
-DEFINE_GUID(CLSID_DirectMusicBand, 0x79ba9e00,0xb6ee,0x11d1,0x86,0xbe,0x0,0xc0,0x4f,0xbf,0x8f,0xef);
+DEFINE_GUID(CLSID_DirectMusicBand, 0x79ba9e00,0xb6ee,0x11d1,0x86,0xbe,0x0,0xc0,0x4f,0xbf,0x8f,0xef);
DEFINE_GUID(CLSID_DirectMusicPatternTrack, 0xd2ac2897,0xb39b,0x11d1,0x87,0x4,0x0,0x60,0x8,0x93,0xb1,0xbd);
DEFINE_GUID(CLSID_DirectMusicScript, 0x810b5013,0xe88d,0x11d2,0x8b,0xc1,0x0,0x60,0x8,0x93,0xb1,0xb6);
DEFINE_GUID(CLSID_DirectMusicContainer, 0x9301e380,0x1f22,0x11d3,0x82,0x26,0xd2,0xfa,0x76,0x25,0x5d,0x47);
-DEFINE_GUID(CLSID_DirectSoundWave, 0x8a667154,0xf9cb,0x11d2,0xad,0x8a,0x0,0x60,0xb0,0x57,0x5a,0xbc);
-DEFINE_GUID(CLSID_DirectMusicSong, 0xaed5f0a5,0xd972,0x483d,0xa3,0x84,0x64,0x9d,0xfe,0xb9,0xc1,0x81);
-DEFINE_GUID(CLSID_DirectMusicAudioPathConfig, 0xee0b9ca0,0xa81e,0x11d3,0x9b,0xd1,0x0,0x80,0xc7,0x15,0xa,0x74);
+DEFINE_GUID(CLSID_DirectSoundWave, 0x8a667154,0xf9cb,0x11d2,0xad,0x8a,0x0,0x60,0xb0,0x57,0x5a,0xbc);
+DEFINE_GUID(CLSID_DirectMusicSong, 0xaed5f0a5,0xd972,0x483d,0xa3,0x84,0x64,0x9d,0xfe,0xb9,0xc1,0x81);
+DEFINE_GUID(CLSID_DirectMusicAudioPathConfig, 0xee0b9ca0,0xa81e,0x11d3,0x9b,0xd1,0x0,0x80,0xc7,0x15,0xa,0x74);
/* these CLSIDs aren't officially declared in any dmusic header, but are used by regsvr implementations*/
DEFINE_GUID(CLSID_DirectMusicSynthSink, 0xaec17ce3,0xa514,0x11d1,0xaf,0xa6,0x00,0xaa,0x00,0x24,0xd8,0xb6);
DEFINE_GUID(CLSID_DirectMusicSection, 0x3f037241,0x414e,0x11d1,0xa7,0xce,0x00,0xa0,0xc9,0x13,0xf7,0x3c);
DEFINE_GUID(CLSID_DirectMusicAuditionTrack, 0xd2ac2897,0xb39b,0x11d1,0x87,0x04,0x00,0x60,0x08,0x93,0xb1,0xbd);
-DEFINE_GUID(CLSID_DirectMusicSegTriggerTrack, 0xbae4d665,0x4ea1,0x11d3,0x8b,0xda,0x00,0x60,0x08,0x93,0xb1,0xb6);
+DEFINE_GUID(CLSID_DirectMusicSegTriggerTrack, 0xbae4d665,0x4ea1,0x11d3,0x8b,0xda,0x00,0x60,0x08,0x93,0xb1,0xb6);
DEFINE_GUID(CLSID_DirectMusicAudioPath, 0xee0b9ca0,0xa81e,0x11d3,0x9b,0xd1,0x00,0x80,0xc7,0x15,0x0a,0x74);
DEFINE_GUID(CLSID_DirectMusicTemplate, 0xd30bcc65,0x60e8,0x11d1,0xa7,0xce,0x00,0xa0,0xc9,0x13,0xf7,0x3c);
-DEFINE_GUID(CLSID_DirectMusicScriptAutoImpSegment, 0x4062c116,0x0270,0x11d3,0x8b,0xcb,0x00,0x60,0x08,0x93,0xb1,0xb6);
-DEFINE_GUID(CLSID_AudioVBScript, 0x4ee17959,0x931e,0x49e4,0xa2,0xc6,0x97,0x7e,0xcf,0x36,0x28,0xf3);
-DEFINE_GUID(CLSID_DirectMusicScriptAutoImpPerformance, 0xa861c6e2,0xfcfc,0x11d2,0x8b,0xc9,0x00,0x60,0x08,0x93,0xb1,0xb6);
-DEFINE_GUID(CLSID_DirectMusicScripSourceCodeLoader, 0xc70eb77f,0xefd4,0x4678,0xa2,0x7b,0xbf,0x16,0x48,0xf3,0x0d,0x04); /* [sic] */
-DEFINE_GUID(CLSID_DirectMusicScriptAutoImpSegmentState, 0xebf2320a,0x2502,0x11d3,0x8b,0xd1,0x00,0x60,0x08,0x93,0xb1,0xb6);
-DEFINE_GUID(CLSID_DirectMusicScriptAutoImpAudioPathConfig, 0x1cebde3e,0x6b91,0x484a,0xaf,0x48,0x5e,0x4f,0x4e,0xd6,0xb1,0xe1);
-DEFINE_GUID(CLSID_DirectMusicScriptAutoImpAudioPath, 0x2c5f9b72,0x7148,0x4d97,0xbf,0xc9,0x68,0xa0,0xe0,0x76,0xbe,0xbd);
-DEFINE_GUID(CLSID_DirectMusicScriptAutoImpSong, 0xa16f1761,0xb6d8,0x42eb,0x8d,0x57,0x4a,0x44,0xfe,0xdd,0x3b,0xd2);
+DEFINE_GUID(CLSID_DirectMusicScriptAutoImpSegment, 0x4062c116,0x0270,0x11d3,0x8b,0xcb,0x00,0x60,0x08,0x93,0xb1,0xb6);
+DEFINE_GUID(CLSID_AudioVBScript, 0x4ee17959,0x931e,0x49e4,0xa2,0xc6,0x97,0x7e,0xcf,0x36,0x28,0xf3);
+DEFINE_GUID(CLSID_DirectMusicScriptAutoImpPerformance, 0xa861c6e2,0xfcfc,0x11d2,0x8b,0xc9,0x00,0x60,0x08,0x93,0xb1,0xb6);
+DEFINE_GUID(CLSID_DirectMusicScripSourceCodeLoader, 0xc70eb77f,0xefd4,0x4678,0xa2,0x7b,0xbf,0x16,0x48,0xf3,0x0d,0x04); /* [sic] */
+DEFINE_GUID(CLSID_DirectMusicScriptAutoImpSegmentState, 0xebf2320a,0x2502,0x11d3,0x8b,0xd1,0x00,0x60,0x08,0x93,0xb1,0xb6);
+DEFINE_GUID(CLSID_DirectMusicScriptAutoImpAudioPathConfig, 0x1cebde3e,0x6b91,0x484a,0xaf,0x48,0x5e,0x4f,0x4e,0xd6,0xb1,0xe1);
+DEFINE_GUID(CLSID_DirectMusicScriptAutoImpAudioPath, 0x2c5f9b72,0x7148,0x4d97,0xbf,0xc9,0x68,0xa0,0xe0,0x76,0xbe,0xbd);
+DEFINE_GUID(CLSID_DirectMusicScriptAutoImpSong, 0xa16f1761,0xb6d8,0x42eb,0x8d,0x57,0x4a,0x44,0xfe,0xdd,0x3b,0xd2);
/* IIDs */
DEFINE_GUID(IID_IDirectMusicAudioPath, 0xc87631f5,0x23be,0x4986,0x88,0x36,0x5,0x83,0x2f,0xcc,0x48,0xf9);
More information about the wine-patches
mailing list