wave handling
Eric Pouech
eric.pouech at wanadoo.fr
Sun Oct 6 14:29:25 CDT 2002
it seems latest winmm allows to call acm when a device doesn't support a
given format (and allow an automatic conversion) while processing
wave(Out|In)Open
this patch implements this feature (as well as the WAVE_FORMAT_DIRECT
which turns this feature off)
it also requires the other patch to wavemapper to be applied
A+
-------------- next part --------------
Name: womap
ChangeLog: let wave(Out|In)Open call the wave mapper when the low level device doesn't handle the wave descriptor
License: X11
GenDate: 2002/10/06 19:18:18 UTC
ModifiedFiles: dlls/winmm/mmsystem.c
AddedFiles:
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/mmsystem.c,v
retrieving revision 1.69
diff -u -u -r1.69 mmsystem.c
--- dlls/winmm/mmsystem.c 12 Sep 2002 22:07:04 -0000 1.69
+++ dlls/winmm/mmsystem.c 6 Oct 2002 19:16:45 -0000
@@ -3794,19 +3794,31 @@
wod.dwInstance = dwInstance;
wod.dnDevNode = 0L;
- if (dwFlags & WAVE_MAPPED) {
- wod.uMappedDeviceID = uDeviceID;
- uDeviceID = WAVE_MAPPER;
- } else {
- wod.uMappedDeviceID = -1;
+ for (;;) {
+ if (dwFlags & WAVE_MAPPED) {
+ wod.uMappedDeviceID = uDeviceID;
+ uDeviceID = WAVE_MAPPER;
+ } else {
+ wod.uMappedDeviceID = -1;
+ }
+ wmld->uDeviceID = uDeviceID;
+
+ dwRet = MMDRV_Open(wmld, (uType == MMDRV_WAVEOUT) ? WODM_OPEN : WIDM_OPEN,
+ (DWORD)&wod, dwFlags);
+
+ if (dwRet != WAVERR_BADFORMAT ||
+ (dwFlags & (WAVE_MAPPED|WAVE_FORMAT_DIRECT)) != 0) break;
+ /* if we ask for a format which isn't supported by the physical driver,
+ * let's try to map it through the wave mapper (except, if we already tried
+ * or user didn't allow us to use acm codecs)
+ */
+ dwFlags |= WAVE_MAPPED;
+ /* we shall loop only one */
}
- wmld->uDeviceID = uDeviceID;
-
- dwRet = MMDRV_Open(wmld, (uType == MMDRV_WAVEOUT) ? WODM_OPEN : WIDM_OPEN, (DWORD)&wod, dwFlags);
if ((dwFlags & WAVE_FORMAT_QUERY) || dwRet != MMSYSERR_NOERROR) {
- MMDRV_Free(handle, wmld);
- handle = 0;
+ MMDRV_Free(handle, wmld);
+ handle = 0;
}
if (lphndl != NULL) *lphndl = handle;
@@ -3965,7 +3977,7 @@
DWORD dwInstance, DWORD dwFlags)
{
return MMSYSTEM_waveOpen(lphWaveOut, uDeviceID, MMDRV_WAVEOUT, lpFormat,
- dwCallback, dwInstance, dwFlags, TRUE);
+ dwCallback, dwInstance, dwFlags, TRUE);
}
/**************************************************************************
@@ -3984,7 +3996,7 @@
* (0xFFFFFFFF and not 0x0000FFFF)
*/
ret = MMSYSTEM_waveOpen(&hWaveOut, (uDeviceID == (UINT16)-1) ? (UINT)-1 : uDeviceID,
- MMDRV_WAVEOUT, lpFormat, dwCallback, dwInstance, dwFlags, FALSE);
+ MMDRV_WAVEOUT, lpFormat, dwCallback, dwInstance, dwFlags, FALSE);
if (lphWaveOut != NULL) *lphWaveOut = HWAVEOUT_16(hWaveOut);
return ret;
@@ -4608,7 +4620,7 @@
DWORD dwInstance, DWORD dwFlags)
{
return MMSYSTEM_waveOpen(lphWaveIn, uDeviceID, MMDRV_WAVEIN, lpFormat,
- dwCallback, dwInstance, dwFlags, TRUE);
+ dwCallback, dwInstance, dwFlags, TRUE);
}
/**************************************************************************
More information about the wine-patches
mailing list