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