wave mapper fix

eric pouech eric.pouech at wanadoo.fr
Mon May 21 03:34:10 CDT 2001


change log says it all
A+
-- 
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: wavemap
ChangeLog: fixed open requests in case of error (if the physical device failed to open, the ACM stream was left opened)
	added mapping search for waveIn devices
GenDate: 2001/05/21 08:06:25 UTC
ModifiedFiles: dlls/winmm/wavemap/wavemap.c
AddedFiles: 
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/wavemap/wavemap.c,v
retrieving revision 1.12
diff -u -u -r1.12 wavemap.c
--- dlls/winmm/wavemap/wavemap.c	2001/04/13 22:28:06	1.12
+++ dlls/winmm/wavemap/wavemap.c	2001/04/27 16:31:31
@@ -93,12 +93,20 @@
     /* destination is always PCM, so the formulas below apply */
     lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8;
     lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign;
-    ret = acmStreamOpen(&wom->hAcmStream, 0, lpDesc->lpFormat, lpwfx, NULL, 0L, 0L, 
-			(dwFlags & WAVE_FORMAT_QUERY) ? ACM_STREAMOPENF_QUERY : 0L);
-    if (ret != MMSYSERR_NOERROR)
-	return ret;
-    return waveOutOpen(&wom->hInnerWave, idx, lpwfx, (DWORD)wodCallback, 
-		       (DWORD)wom, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION);
+    if (dwFlags & WAVE_FORMAT_QUERY) {
+	ret = acmStreamOpen(NULL, 0, lpDesc->lpFormat, lpwfx, NULL, 0L, 0L, ACM_STREAMOPENF_QUERY);
+    } else {
+	ret = acmStreamOpen(&wom->hAcmStream, 0, lpDesc->lpFormat, lpwfx, NULL, 0L, 0L, 0L);
+    }
+    if (ret == MMSYSERR_NOERROR) {
+	ret = waveOutOpen(&wom->hInnerWave, idx, lpwfx, (DWORD)wodCallback, 
+			  (DWORD)wom, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION);
+	if (ret != MMSYSERR_NOERROR && !(dwFlags & WAVE_FORMAT_QUERY)) {
+	    acmStreamClose(wom->hAcmStream, 0);
+	    wom->hAcmStream = 0;
+	}
+    }
+    return ret;
 }
 
 static	DWORD	wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
@@ -140,6 +148,18 @@
     for (i = 0; i < nd; i++) {
 	/* first try with same stereo/mono option as source */
 	wfx.nChannels = lpDesc->lpFormat->nChannels;
+	TRY(44100, 16);
+	TRY(22050, 16);
+	TRY(11025, 16);
+
+	/* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */
+	wfx.nChannels ^= 3; 
+	TRY(44100, 16);
+	TRY(22050, 16);
+	TRY(11025, 16);
+
+	/* first try with same stereo/mono option as source */
+	wfx.nChannels = lpDesc->lpFormat->nChannels;
 	TRY(44100, 8);
 	TRY(22050, 8);
 	TRY(11025, 8);
@@ -464,12 +484,20 @@
     /* source is always PCM, so the formulas below apply */
     lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8;
     lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign;
-    ret = acmStreamOpen(&wim->hAcmStream, 0, lpwfx, lpDesc->lpFormat, NULL, 0L, 0L, 
-			(dwFlags & WAVE_FORMAT_QUERY) ? ACM_STREAMOPENF_QUERY : 0L);
-    if (ret != MMSYSERR_NOERROR)
-	return ret;
-    return waveInOpen(&wim->hInnerWave, idx, lpwfx, (DWORD)widCallback, 
-		       (DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION);
+    if (dwFlags & WAVE_FORMAT_QUERY) {
+	ret = acmStreamOpen(NULL, 0, lpwfx, lpDesc->lpFormat, NULL, 0L, 0L, ACM_STREAMOPENF_QUERY);
+    } else {
+	ret = acmStreamOpen(&wim->hAcmStream, 0, lpwfx, lpDesc->lpFormat, NULL, 0L, 0L, 0L);
+    }
+    if (ret == MMSYSERR_NOERROR) {
+	ret = waveInOpen(&wim->hInnerWave, idx, lpwfx, (DWORD)widCallback, 
+			 (DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION);
+	if (ret != MMSYSERR_NOERROR && !(dwFlags & WAVE_FORMAT_QUERY)) {
+	    acmStreamClose(wim->hAcmStream, 0);
+	    wim->hAcmStream = 0;
+	}
+    }
+    return ret;
 }
 
 static	DWORD	widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
@@ -479,7 +507,7 @@
     WAVEMAPDATA*	wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
     WAVEFORMATEX	wfx;
 
-    TRACE("(%p %p %08lx\n", lpdwUser, lpDesc, dwFlags);
+    TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags);
 
     if (!wim)
 	return MMSYSERR_NOMEM;
@@ -528,6 +556,7 @@
     } else {
 	*lpdwUser = (DWORD)wim;
     }
+    TRACE("Ok (stream=%08lx)\n", (DWORD)wim->hAcmStream);
     return MMSYSERR_NOERROR;
 }
 


More information about the wine-patches mailing list