Support loading of Wave segments on IDirectMusicSegment8.

diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c
index af98ae2..9368a9b 100644
--- a/dlls/dmime/segment.c
+++ b/dlls/dmime/segment.c
@@ -1156,6 +1156,35 @@
   return S_OK;
 }
 
+static HRESULT IDirectMusicSegment8Impl_IPersistStream_LoadWave (LPPERSISTSTREAM iface, IStream* pClonedStream, IDirectMusicObject** ppWaveObject) {
+
+  HRESULT hr = E_FAIL;
+  IPersistStream* pPersistStream = NULL;
+  
+  hr = CoCreateInstance (&CLSID_DirectSoundWave, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*) ppWaveObject);
+  if (FAILED(hr)) {
+    ERR(": could not create object\n");
+    return hr;
+  }
+  /* acquire PersistStream interface */
+  hr = IDirectMusicTrack_QueryInterface (*ppWaveObject, &IID_IPersistStream, (LPVOID*) &pPersistStream);
+  if (FAILED(hr)) {
+    ERR(": could not acquire IPersistStream\n");
+    return hr;
+  }
+  /* load */
+  hr = IPersistStream_Load (pPersistStream, pClonedStream);
+  if (FAILED(hr)) {
+    ERR(": failed to load object\n");
+    return hr;
+  }
+  
+  /* release all loading-related stuff */
+  IPersistStream_Release (pPersistStream);
+
+  return S_OK;
+}
+
 HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) {
   ICOM_THIS_MULTI(IDirectMusicSegment8Impl, PersistStreamVtbl, iface);
   
@@ -1183,7 +1212,26 @@
       break;
     }
     case mmioFOURCC('W','A','V','E'): {
-      FIXME_(dmfile)(": WAVE form (loading not yet implemented)\n");
+      LPSTREAM pClonedStream = NULL;	
+      IDirectMusicObject* pWave = NULL;
+
+      FIXME_(dmfile)(": WAVE form (loading to be checked)\n");
+
+      IStream_Clone (pStm, &pClonedStream);
+	
+      liMove.QuadPart = 0;
+      liMove.QuadPart -= sizeof(FOURCC) + (sizeof(FOURCC)+sizeof(DWORD));
+      IStream_Seek (pClonedStream, liMove, STREAM_SEEK_CUR, NULL);
+	
+      hr = IDirectMusicSegment8Impl_IPersistStream_LoadWave (iface, pClonedStream, &pWave);
+      if (FAILED(hr)) {
+	ERR(": could not load track\n");
+	return hr;
+      }
+      IStream_Release (pClonedStream);
+      
+      IDirectMusicTrack_Release(pWave); pWave = NULL; /* now we can release at as it inserted */
+
       liMove.QuadPart = StreamSize;
       IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
       break;