DMUSIC: some dmloader/dsound fixes

Raphaël Junqueira fenix at club-internet.fr
Sun Oct 26 18:15:20 CST 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi all,

 I'm back again :)
 And trying again to get Unreal2 demo working, this time with that patch the 
dmusic part only fail on a the CreateFile (on ILoaderStream::Attach) because 
we not use the specified IDirectMusicLoader8Impl::wzSearchPath. 

Rok, any idea how to get a proper solution for that ?

dmusic log:
trace:dmloader:DMLOADER_DllGetClassObject (0x4024b00f,0x4024afe8,0x408fd804)
trace:dmloader:LoaderCF_CreateInstance (0x49b08458)->((nil),
{19e7c08c-0a44-4e6a-a116-595a7cd5de8c},0x53c98ff4)
trace:dmloader:DMUSIC_CreateDirectMusicLoader (0x1053ffb0,0x53c98ff4,(nil))
trace:dmime:DMIME_DllGetClassObject (0x4024b084,0x4024b05d,0x408fd800)
trace:dmime:PerformanceCF_CreateInstance (0x49f86a18)->((nil),
{679c4137-c62e-4147-b2b4-9d569acb254c},0x53c98ff8)
trace:dmime:DMUSIC_CreateDirectMusicPerformance (0x1053ffa0,0x53c98ff8,(nil))
fixme:dmime:IDirectMusicPerformance8ImplInitAudio (0x403c2f90, (nil), 
0x53c98ffc, (nil), 8, 128, 3f, (nil)): to check
fixme:wave:IDsDriverBufferImpl_SetVolumePan (0x4e690850,0x4e690424): stub!
fixme:dmime:IDirectMusicPerformance8Impl_Init (iface = 0x403c2f90, dmusic = 
(nil), dsound = 0x4e690020, hwnd = (nil))
trace:dmusic:DMUSIC_DllGetClassObject (0x4024b0f9,0x4024b0d2,0x408fd790)
trace:dmusic:DirectMusicCF_CreateInstance (0x49b344ec)->((nil),
{2d3629f7-813d-4939-8508-f05c6b75fd97},0x403c2f98)
trace:dmusic:DMUSIC_CreateDirectMusic (0x49f823a4,0x403c2f98,(nil))
fixme:dmime:IDirectMusicPerformance8ImplCreateStandardAudioPath 
(0x403c2f90)->(8, 128, 0, 0x403c2fe8): semi-stub
trace:dmime:IDirectMusicPerformance8ImplCreateStandardAudioPath  returning 
IDirectMusicPerformance interface at 0x4e695f70.
trace:dmloader:IDirectMusicLoader8Impl_SetSearchDirectory (0x403c3140, 
{d2ac2893-b39b-11d1-8704-00600893b1bd}, L"..\\music\\", 0)
fixme:dmime:IDirectMusicPerformance8ImplGetDefaultAudioPath (0x403c2f90, 
0x408fd804): semi-stub
trace:dmime:IDirectMusicAudioPathImpl_AddRef (0x4e695f70) : AddRef from 1
fixme:dmime:IDirectMusicAudioPathImpl_GetObjectInPath (0x4e695f70, 0, 12800, 
0, {00000000-0000-0000-0000-000000000000}, 0, 
{2befc277-5497-11d2-bccb-00a0c922e6eb}, 0x408fd824): stub
fixme:dmime:IDirectMusicPerformance8Impl_GetGraph (0x403c2f90, 0x408fd7d0): to 
check
fixme:dmime:IDirectMusicPerformance8Impl_SetGraph (0x403c2f90, 0x4e6963e8): to 
check
trace:dmime:IDirectMusicGraphImpl_AddRef (0x4e6963e8) : AddRef from 1
trace:dmime:IDirectMusicGraphImpl_Release (0x4e6963e8) : ReleaseRef to 1
fixme:dmime:IDirectMusicGraphImpl_InsertTool (0x4e6963e8, 0x48691a40, (nil), 
0, 0): use of pdwPChannels
trace:dmime:IDirectMusicGraphImpl_Release (0x4e6963e8) : ReleaseRef to 0
trace:dmloader:IDirectMusicLoader8Impl_LoadObjectFromFile (0x403c3140, 
{9301e380-1f22-11d3-8226-d2fa76255d47}, 
{9301e386-1f22-11d3-8226-d2fa76255d47}, L"M08.con", 0x408fd2c4): wrapping to 
IDirectMusicLoader8Impl_GetObject
trace:dmloader:IDirectMusicLoader8Impl_GetObject (0x403c3140, 0x408fcf44, 
{9301e386-1f22-11d3-8226-d2fa76255d47}, 0x408fd2c4)
trace:dmloader:IDirectMusicLoader8Impl_GetObject looking up cache...
trace:dmloader:IDirectMusicLoader8Impl_GetObject : object does not exist in 
cache
trace:dmloader:DMLOADER_DllGetClassObject (0x4024b272,0x4024b24b,0x408fcaa0)
trace:dmloader:ContainerCF_CreateInstance (0x49b08474)->((nil),
{d2ac28b5-b39b-11d1-8704-00600893b1bd},0x408fcf18)
trace:dmloader:DMUSIC_CreateDirectMusicContainerObject (0x49b04154,0x408fcf18,
(nil))
trace:dmloader:IDirectMusicLoader8Impl_GetObject : loading from file 
(L"M08.con")
trace:dmloader:DMUSIC_CreateLoaderStream (0x408fcefc)
trace:dmloader:ILoaderStream_Attach (0x4e696490, L"M08.con", 0x403c3140)
trace:dmloader:ILoaderStream_Attach : failed
trace:dmime:IDirectMusicPerformance8Impl_SetGlobalParam (0x403c2f90, 
{d2ac28b1-b39b-11d1-8704-00600893b1bd}, 0x408fd878, 4)
trace:dmime:IDirectMusicPerformance8Impl_SetGlobalParam => MasterVolume set to 
- -10000
fixme:seh:EXC_RtlRaiseException call to unimplemented function 
ntdll.dll.RtlCreateQueryDebugBuffer


Changelog:
 - some fixes on DirectSound init (need SetCooperativeLevel as seen in msdn) 
on IDirectMusicPerformance8::InitAudio
 - some logic fixes on IDirectMusicPerformance8ImplCreateStandardAudioPath 
(not perfect yet, need to understand/fix the channel init/use)
 - fix typo on CreateDirectMusicContainer 
 - add missing define on dsound.h
 - better traces on IDirectMusicLoader8::SetSearchDirectory

Best Regards,
Raphael

 
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)

iD8DBQE/nGOcp7NA3AmQTU4RAphDAJ94meGfa5FK6hO0F5cBaChRZH9PjwCgi7m3
Q7VsDoxbAzA0pog7e2KH0T0=
=2OfH
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: dlls/dmime/performance.c
===================================================================
RCS file: /home/wine/wine/dlls/dmime/performance.c,v
retrieving revision 1.3
diff -u -r1.3 performance.c
--- dlls/dmime/performance.c	5 Sep 2003 23:08:39 -0000	1.3
+++ dlls/dmime/performance.c	26 Oct 2003 23:10:25 -0000
@@ -78,6 +78,17 @@
 	  IDirectSound_AddRef((LPDIRECTSOUND) This->pDirectSound);
 	} else {
 	  DirectSoundCreate8(&IID_IDirectSound8, (LPDIRECTSOUND8*) &This->pDirectSound, NULL);
+	  /** 
+	   * as seen in msdn
+	   * 
+	   *  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directX/htm/idirectmusicperformance8initaudio.asp
+	   */
+	  if (NULL != hWnd) {
+	    IDirectSound8_SetCooperativeLevel(This->pDirectSound, hWnd, DSSCL_PRIORITY);
+	  } else {
+	    /* how to get the ForeGround window handle ? */
+            /*IDirectSound8_SetCooperativeLevel(This->pDirectSound, hWnd, DSSCL_PRIORITY);*/
+	  }
 	  if (!This->pDirectSound)
 	    return DSERR_NODRIVER;
 	}
@@ -88,7 +99,7 @@
 	  IDirectMusic8_AddRef((LPDIRECTMUSIC8) This->pDirectMusic);
 	} else {
 	  /* app allows the performance to initialise itfself and needs a pointer to object*/
-		CoCreateInstance (&CLSID_DirectMusic, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusic8, (void**)&This->pDirectMusic);
+          CoCreateInstance (&CLSID_DirectMusic, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusic8, (void**)&This->pDirectMusic);
 	  if (ppDirectMusic) {
 	    *ppDirectMusic = (LPDIRECTMUSIC) This->pDirectMusic;
 	    IDirectMusic8_AddRef((LPDIRECTMUSIC8) *ppDirectMusic);
@@ -523,8 +534,9 @@
 						      DMUS_AUDIOPARAMS* pParams)
 {
 	IDirectSound* dsound;
+	HRESULT hr = S_OK;
 	
-    ICOM_THIS(IDirectMusicPerformance8Impl,iface);
+        ICOM_THIS(IDirectMusicPerformance8Impl,iface);
 	FIXME("(%p, %p, %p, %p, %lx, %lu, %lx, %p): to check\n", This, ppDirectMusic, ppDirectSound, hWnd, dwDefaultPathType, dwPChannelCount, dwFlags, pParams);
 
 	if (This->pDirectMusic || This->pDirectSound)
@@ -550,11 +562,21 @@
 	if (NULL != pParams) {
 	  memcpy(&This->pParams, pParams, sizeof(DMUS_AUDIOPARAMS));
 	} else {
-	  /* TODO, how can i fill the struct */
+	  /**
+	   * TODO, how can i fill the struct 
+	   * as seen at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directX/htm/dmusaudioparams.asp
+	   */
+	  This->pParams.dwSize = sizeof(DMUS_AUDIOPARAMS);
+	  This->pParams.fInitNow = FALSE;
+	  This->pParams.dwValidData = DMUS_AUDIOPARAMS_FEATURES | DMUS_AUDIOPARAMS_VOICES | DMUS_AUDIOPARAMS_SAMPLERATE | DMUS_AUDIOPARAMS_DEFAULTSYNTH;
+	  This->pParams.dwVoices = 64;
+	  This->pParams.dwSampleRate = (DWORD) 22.050; 
+	  This->pParams.dwFeatures = dwFlags;
+	  This->pParams.clsidDefaultSynth = CLSID_DirectMusicSynthSink;
 	}
-	IDirectMusicPerformance8ImplCreateStandardAudioPath(iface, dwDefaultPathType, dwPChannelCount, FALSE, (IDirectMusicAudioPath**) &This->pDefaultPath);
+	hr = IDirectMusicPerformance8ImplCreateStandardAudioPath(iface, dwDefaultPathType, dwPChannelCount, FALSE, (IDirectMusicAudioPath**) &This->pDefaultPath);
 
-	return S_OK;
+	return hr;
 }
 
 HRESULT WINAPI IDirectMusicPerformance8ImplPlaySegmentEx (LPDIRECTMUSICPERFORMANCE8 iface, IUnknown* pSource, WCHAR* pwzSegmentName, IUnknown* pTransition, DWORD dwFlags, __int64 i64StartTime, IDirectMusicSegmentState** ppSegmentState, IUnknown* pFrom, IUnknown* pAudioPath)
@@ -593,17 +615,24 @@
 	return S_OK;
 }
 
+/**
+ * see  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directX/htm/standardaudiopaths.asp
+ */
 HRESULT WINAPI IDirectMusicPerformance8ImplCreateStandardAudioPath (LPDIRECTMUSICPERFORMANCE8 iface, DWORD dwType, DWORD dwPChannelCount, BOOL fActivate, IDirectMusicAudioPath** ppNewPath)
 {
 	IDirectMusicAudioPathImpl *default_path;
 	DSBUFFERDESC desc;
 	WAVEFORMATEX format;
 	LPDIRECTSOUNDBUFFER8 buffer;
+	HRESULT hr = S_OK;
 
 	ICOM_THIS(IDirectMusicPerformance8Impl,iface);
 	
 	FIXME("(%p)->(%ld, %ld, %d, %p): semi-stub\n", This, dwType, dwPChannelCount, fActivate, ppNewPath);
 
+	if (NULL == ppNewPath) {
+	  return E_POINTER;
+	}
 	default_path = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicAudioPathImpl));
 	if (NULL == default_path) {
 		*ppNewPath = (LPDIRECTMUSICAUDIOPATH) NULL;
@@ -623,7 +652,7 @@
 	format.cbSize = 0;
 	
 	desc.dwSize = sizeof(desc);
-	desc.dwFlags = 0;
+	desc.dwFlags = DSBCAPS_CTRLFX | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;
 	desc.dwBufferBytes = DSBSIZE_MIN;
 	desc.dwReserved = 0;
 	desc.lpwfxFormat = &format;
@@ -631,22 +660,35 @@
 	
 	switch(dwType) {
 	case DMUS_APATH_DYNAMIC_3D:
-		desc.dwFlags |= DSBCAPS_CTRL3D;
+                desc.dwFlags |= DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE;
 		break;
 	case DMUS_APATH_DYNAMIC_MONO:
+	        desc.dwFlags |= DSBCAPS_CTRLFREQUENCY;
 		break;
-	case DMUS_APATH_SHARED_STEREOPLUSREVERB:	
+	case DMUS_APATH_SHARED_STEREOPLUSREVERB:
+	        /* normally we havet to create 2 buffers (one for music other for reverb) 
+		 * in this case. See msdn
+                 */
 	case DMUS_APATH_DYNAMIC_STEREO:
+		desc.dwFlags |= DSBCAPS_CTRLFREQUENCY;
 		format.nChannels = 2;
 		format.nBlockAlign *= 2;
 		format.nAvgBytesPerSec *=2;
 		break;
 	default:
-		break;
+	        HeapFree(GetProcessHeap(), 0, default_path); 
+	        *ppNewPath = NULL;
+	        return E_INVALIDARG;
+	        break;
 	}
 
 	/* FIXME: Should we create one secondary buffer for each PChannel? */
-	IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL);
+	hr = IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL);
+	if (FAILED(hr)) {
+	        HeapFree(GetProcessHeap(), 0, default_path); 
+	        *ppNewPath = NULL;
+	        return DSERR_BUFFERLOST;
+	}
 	default_path->pDSBuffer = (IDirectSoundBuffer*) buffer;
 
 	/* Update description for creating primary buffer */
@@ -654,8 +696,13 @@
 	desc.dwBufferBytes = 0;
 	desc.lpwfxFormat = NULL;
 
-	IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL);
-
+	hr = IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL);
+	if (FAILED(hr)) {
+                IDirectSoundBuffer_Release(default_path->pDSBuffer);
+	        HeapFree(GetProcessHeap(), 0, default_path); 
+	        *ppNewPath = NULL;
+	        return DSERR_BUFFERLOST;
+	}
 	default_path->pPrimary = (IDirectSoundBuffer*) buffer;
 
 	*ppNewPath = (LPDIRECTMUSICAUDIOPATH) default_path;
Index: dlls/dmloader/container.c
===================================================================
RCS file: /home/wine/wine/dlls/dmloader/container.c,v
retrieving revision 1.3
diff -u -r1.3 container.c
--- dlls/dmloader/container.c	5 Sep 2003 23:08:39 -0000	1.3
+++ dlls/dmloader/container.c	26 Oct 2003 23:10:26 -0000
@@ -86,7 +86,7 @@
 {
 	IDirectMusicContainerImpl* dmcon;
 	
-	if (IsEqualIID (lpcGUID, &IID_IDirectMusicBand)) {
+	if (IsEqualIID (lpcGUID, &IID_IDirectMusicContainer)) {
 		dmcon = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicContainerImpl));
 		if (NULL == dmcon) {
 			*ppDMCon = (LPDIRECTMUSICCONTAINER) NULL;
Index: dlls/dmloader/loader.c
===================================================================
RCS file: /home/wine/wine/dlls/dmloader/loader.c,v
retrieving revision 1.5
diff -u -r1.5 loader.c
--- dlls/dmloader/loader.c	22 Sep 2003 19:37:33 -0000	1.5
+++ dlls/dmloader/loader.c	26 Oct 2003 23:10:26 -0000
@@ -224,7 +224,7 @@
 {
 	ICOM_THIS(IDirectMusicLoader8Impl,iface);
 
-	TRACE("(%p, %s, %p, %d)\n", This, debugstr_guid(rguidClass), pwzPath, fClear);
+	TRACE("(%p, %s, %s, %d)\n", This, debugstr_guid(rguidClass), debugstr_w(pwzPath), fClear);
 	if (0 == strncmpW(This->wzSearchPath, pwzPath, MAX_PATH)) {
 	  return S_FALSE;
 	} 
Index: dlls/dmloader/loaderstream.c
===================================================================
RCS file: /home/wine/wine/dlls/dmloader/loaderstream.c,v
retrieving revision 1.4
diff -u -r1.4 loaderstream.c
--- dlls/dmloader/loaderstream.c	16 Oct 2003 19:31:11 -0000	1.4
+++ dlls/dmloader/loaderstream.c	26 Oct 2003 23:10:27 -0000
@@ -37,18 +37,17 @@
  */
 HRESULT WINAPI ILoaderStream_Attach (ILoaderStream* This, LPCWSTR wzFile, IDirectMusicLoader *pLoader)
 {
-	TRACE("(%p, %s, %p)\n", This, debugstr_w(wzFile), pLoader);
-	ILoaderStream_Detach (This);
-	This->hFile = CreateFileW (wzFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+    TRACE("(%p, %s, %p)\n", This, debugstr_w(wzFile), pLoader);
+    ILoaderStream_Detach (This);
+    This->hFile = CreateFileW (wzFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     if (This->hFile == INVALID_HANDLE_VALUE) {
-		TRACE(": failed\n");
+        TRACE(": failed\n");
         return E_FAIL;
     }
-	/* create IDirectMusicGetLoader */
-    (LPDIRECTMUSICLOADER)This->pLoader = pLoader;
+    /* create IDirectMusicGetLoader */
+    (LPDIRECTMUSICLOADER) This->pLoader = pLoader;
     strncpyW (This->wzFileName, wzFile, MAX_PATH);
-	TRACE(": succeeded\n");
-	
+    TRACE(": succeeded\n");
     return S_OK;
 }
 
Index: dlls/ntdll/path.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/path.c,v
retrieving revision 1.10
diff -u -r1.10 path.c
--- dlls/ntdll/path.c	8 Oct 2003 03:51:31 -0000	1.10
+++ dlls/ntdll/path.c	26 Oct 2003 23:10:30 -0000
@@ -321,6 +321,7 @@
     LPWSTR              ptr;
     UNICODE_STRING*     cd;
 
+    TRACE("name %s size %lu\n",debugstr_w(name),size);
     reqsize = sizeof(WCHAR); /* '\0' at the end */
 
     RtlAcquirePebLock();
@@ -499,7 +500,7 @@
                         /* either collapse \foo\.. into \ or \.. into \ */
                         if (prev < buffer + mark) prev = p - 1;
                         reqsize -= (p + 2 - prev) * sizeof(WCHAR);
-                        memmove(prev, p + 2, buffer + reqsize - prev + sizeof(WCHAR));
+                        memmove(prev, p + 2, (ULONG)buffer + reqsize - (ULONG)prev + sizeof(WCHAR));
                         p = prev;
                     }
                     break;
@@ -511,7 +512,7 @@
                 break;
             case '\\':
                 reqsize -= 2 * sizeof(WCHAR);
-                memmove(ptr, ptr + 2, buffer + reqsize - ptr + sizeof(WCHAR));
+                memmove(p, p + 2, (ULONG)buffer + reqsize - (ULONG)p + sizeof(WCHAR));
                 break;
             }
         }
Index: include/dsound.h
===================================================================
RCS file: /home/wine/wine/include/dsound.h,v
retrieving revision 1.40
diff -u -r1.40 dsound.h
--- include/dsound.h	5 Sep 2003 23:15:44 -0000	1.40
+++ include/dsound.h	26 Oct 2003 23:10:36 -0000
@@ -189,6 +189,7 @@
 #define DSBCAPS_CTRLPAN             0x00000040
 #define DSBCAPS_CTRLVOLUME          0x00000080
 #define DSBCAPS_CTRLPOSITIONNOTIFY  0x00000100
+#define DSBCAPS_CTRLFX              0x00000200
 #define DSBCAPS_CTRLDEFAULT         0x000000E0  /* Pan + volume + frequency. */
 #define DSBCAPS_CTRLALL             0x000001F0  /* All control capabilities */
 #define DSBCAPS_STICKYFOCUS         0x00004000


More information about the wine-patches mailing list