msacm fix
eric pouech
eric.pouech at wanadoo.fr
Mon May 21 03:34:25 CDT 2001
this patch is needed to let some native ACM codecs to run (namely
imaadpcm32)
Windows, when requested to open an ACM codec, does two things
- open the codec without any conversion information ; this instance will
only be
use to father information on the codec (capabilities, supported format
tags...)
- then it re-opens the codec (the previous instance is maintained opened
as long
as the session exists), this time with context for conversion
the patch also simplifies the inner bits of the driver structure
A+
--
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: msacm
ChangeLog: mimic more closely Windows' behavior (a MSACM driver is always opened twice: first time for info gathering, subsequent openings for conversions)
added format suggestion for PCM
cleaned up internal structures
GenDate: 2001/05/21 08:06:25 UTC
ModifiedFiles: dlls/msacm/driver.c dlls/msacm/filter.c dlls/msacm/format.c dlls/msacm/internal.c dlls/msacm/msacm32_main.c dlls/msacm/pcmconverter.c dlls/msacm/stream.c dlls/msacm/wineacm.h
AddedFiles:
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/driver.c,v
retrieving revision 1.9
diff -u -u -r1.9 driver.c
--- dlls/msacm/driver.c 2001/04/23 18:14:41 1.9
+++ dlls/msacm/driver.c 2001/04/27 14:28:29
@@ -177,7 +177,7 @@
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
fdwSupport = padid->fdwSupport;
- if (!padid->bEnabled) {
+ if (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) {
if (fdwEnum & ACM_DRIVERENUMF_DISABLED)
fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
else
@@ -226,6 +226,62 @@
return MMSYSERR_INVALPARAM;
}
+static MMRESULT MSACM_DriverOpenHelper(PWINE_ACMDRIVER* ppad, PWINE_ACMDRIVERID padid, DWORD fdwOpen, BOOL useDesc)
+{
+ MMRESULT ret = MMSYSERR_ERROR;
+ PWINE_ACMDRIVER pad;
+
+ *ppad = NULL;
+
+ pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER));
+ if (!pad) return MMSYSERR_NOMEM;
+
+ pad->obj.dwType = WINE_ACMOBJ_DRIVER;
+ pad->obj.pACMDriverID = padid;
+
+ if (!(pad->hDrvr = padid->hInstModule)) {
+ /* this is not an externally added driver... need to load it */
+ if (!padid->pszDriverAlias) goto gotError;
+
+ if (useDesc) {
+ ACMDRVOPENDESCW adod;
+ int len;
+
+ adod.cbStruct = sizeof(adod);
+ adod.fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC;
+ adod.fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED;
+ adod.dwVersion = acmGetVersion();
+ adod.dwFlags = fdwOpen;
+ adod.dwError = 0;
+ len = strlen("Drivers32") + 1;
+ adod.pszSectionName = HeapAlloc(MSACM_hHeap, 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, "Drivers32", -1, (LPWSTR)adod.pszSectionName, len);
+ len = strlen(padid->pszDriverAlias) + 1;
+ adod.pszAliasName = HeapAlloc(MSACM_hHeap, 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, padid->pszDriverAlias, -1, (LPWSTR)adod.pszAliasName, len);
+ adod.dnDevNode = 0;
+
+ pad->hDrvr = OpenDriverA(padid->pszDriverAlias, NULL, (DWORD)&adod);
+
+ HeapFree(MSACM_hHeap, 0, (LPWSTR)adod.pszSectionName);
+ HeapFree(MSACM_hHeap, 0, (LPWSTR)adod.pszAliasName);
+ if (!pad->hDrvr) {
+ ret = adod.dwError;
+ goto gotError;
+ }
+ } else {
+ if (!(pad->hDrvr = OpenDriverA(padid->pszDriverAlias, 0L, 0L))) {
+ ret = MMSYSERR_ERROR;
+ goto gotError;
+ }
+ }
+ }
+ *ppad = pad;
+ return MMSYSERR_NOERROR;
+ gotError:
+ HeapFree(MSACM_hHeap, 0, pad);
+ return ret;
+}
/***********************************************************************
* acmDriverOpen (MSACM32.10)
@@ -233,8 +289,8 @@
MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
{
PWINE_ACMDRIVERID padid;
- PWINE_ACMDRIVER pad;
- MMRESULT ret = MMSYSERR_ERROR;
+ PWINE_ACMDRIVER pad, first_pad = NULL;
+ MMRESULT ret;
TRACE("(%p, %x, %08lu)\n", phad, hadid, fdwOpen);
@@ -247,30 +303,23 @@
padid = MSACM_GetDriverID(hadid);
if (!padid)
return MMSYSERR_INVALHANDLE;
-
- pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER));
- if (!pad) return MMSYSERR_NOMEM;
- pad->obj.dwType = WINE_ACMOBJ_DRIVER;
- pad->obj.pACMDriverID = padid;
-
- if (!(pad->hDrvr = padid->hInstModule) && padid->pszDriverAlias) {
- ACMDRVOPENDESCW adod;
+ /* first driver to be loaded ? */
+ if (!padid->pACMDriverList && !padid->hInstModule) {
+ ret = MSACM_DriverOpenHelper(&first_pad, padid, fdwOpen, FALSE);
+ if (ret) goto gotError;
+
+
+ /* insert new pad at beg of list */
+ first_pad->pNextACMDriver = NULL;
+ padid->pACMDriverList = first_pad;
+ }
- adod.cbStruct = sizeof(adod);
- adod.fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC;
- adod.fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED;
- adod.dwVersion = acmGetVersion();
- adod.dwFlags = fdwOpen;
- adod.dwError = 0;
- adod.pszSectionName = (LPCWSTR)"\0"; /* FIXME */
- adod.pszAliasName = (LPCWSTR)"\0"; /* FIXME */
- adod.dnDevNode = 0;
-
- if (!(pad->hDrvr = OpenDriverA(padid->pszDriverAlias, NULL, (DWORD)&adod))) {
- ret = adod.dwError;
- goto gotError;
- }
+ ret = MSACM_DriverOpenHelper(&pad, padid, fdwOpen, TRUE);
+ if (ret) {
+ if (first_pad)
+ acmDriverClose((HACMDRIVER)first_pad, 0L);
+ goto gotError;
}
/* insert new pad at beg of list */
@@ -280,6 +329,7 @@
/* FIXME: Create a WINE_ACMDRIVER32 */
*phad = (HACMDRIVER)pad;
TRACE("'%s' => %08lx\n", padid->pszDriverAlias, (DWORD)pad);
+
return MMSYSERR_NOERROR;
gotError:
if (!pad->hDrvr)
Index: dlls/msacm/filter.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/filter.c,v
retrieving revision 1.8
diff -u -u -r1.8 filter.c
--- dlls/msacm/filter.c 2001/04/23 18:14:41 1.8
+++ dlls/msacm/filter.c 2001/04/23 19:33:41
@@ -92,7 +92,7 @@
mmr = ACMERR_NOTPOSSIBLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled &&
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
(LPARAM)pafd, (LPARAM)fdwDetails);
@@ -229,7 +229,8 @@
}
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (!padid->bEnabled || acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
+ if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) ||
+ acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
continue;
ret = MSACM_FilterEnumHelper(padid, had, pafd,
fnCallback, dwInstance, fdwEnum);
@@ -287,7 +288,8 @@
mmr = ACMERR_NOTPOSSIBLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
+ acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
acmDriverClose(had, 0);
if (mmr == MMSYSERR_NOERROR) break;
@@ -311,7 +313,7 @@
mmr = ACMERR_NOTPOSSIBLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled &&
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
memset(&tmp, 0, sizeof(tmp));
@@ -416,7 +418,8 @@
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
+ acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
for (i = 0; i < padid->cFilterTags; i++) {
paftd->dwFilterTagIndex = i;
Index: dlls/msacm/format.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/format.c,v
retrieving revision 1.10
diff -u -u -r1.10 format.c
--- dlls/msacm/format.c 2001/04/23 18:14:41 1.10
+++ dlls/msacm/format.c 2001/04/23 19:34:08
@@ -319,7 +319,7 @@
mmr = ACMERR_NOTPOSSIBLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled &&
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS, (LPARAM)pafd, fdwDetails);
acmDriverClose(had, 0);
@@ -498,7 +498,8 @@
}
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (!padid->bEnabled || acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
+ if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) ||
+ acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
continue;
ret = MSACM_FormatEnumHelper(padid, had, pafd, &wfxRef,
fnCallback, dwInstance, fdwEnum);
@@ -541,7 +542,7 @@
mmr = ACMERR_NOTPOSSIBLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (!padid->bEnabled ||
+ if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) ||
acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
continue;
@@ -604,7 +605,7 @@
if (had == (HACMDRIVER)NULL) {
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled &&
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
MSACM_FindFormatTagInCache(padid, paftd->dwFormatTag, NULL) &&
acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)paftd, fdwDetails);
@@ -636,7 +637,7 @@
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled &&
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
memset(&tmp, 0, sizeof(tmp));
@@ -742,8 +743,8 @@
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
- if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
-
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
+ acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
for (i = 0; i < padid->cFormatTags; i++) {
paftd->dwFormatTagIndex = i;
if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
Index: dlls/msacm/internal.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/internal.c,v
retrieving revision 1.9
diff -u -u -r1.9 internal.c
--- dlls/msacm/internal.c 2001/04/23 18:14:41 1.9
+++ dlls/msacm/internal.c 2001/04/27 14:29:31
@@ -224,7 +224,7 @@
PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName,
HINSTANCE hinstModule)
{
- PWINE_ACMDRIVERID padid;
+ PWINE_ACMDRIVERID padid;
TRACE("('%s', '%s', 0x%08x)\n", pszDriverAlias, pszFileName, hinstModule);
@@ -245,7 +245,6 @@
}
padid->hInstModule = hinstModule;
- padid->bEnabled = TRUE;
padid->pACMDriverList = NULL;
padid->pNextACMDriverID = NULL;
padid->pPrevACMDriverID = MSACM_pLastACMDriverID;
Index: dlls/msacm/msacm32_main.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/msacm32_main.c,v
retrieving revision 1.6
diff -u -u -r1.6 msacm32_main.c
--- dlls/msacm/msacm32_main.c 2001/04/23 18:14:41 1.6
+++ dlls/msacm/msacm32_main.c 2001/04/23 19:35:36
@@ -106,7 +106,7 @@
case ACM_METRIC_COUNT_LOCAL_DRIVERS:
if (hao) return MMSYSERR_INVALHANDLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
- if (padid->bEnabled && CheckLocal(padid))
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
val++;
*(LPDWORD)pMetric = val;
break;
@@ -117,8 +117,9 @@
case ACM_METRIC_COUNT_LOCAL_CODECS:
if (hao) return MMSYSERR_INVALHANDLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
- if (padid->bEnabled && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC)
- && CheckLocal(padid))
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
+ (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) &&
+ CheckLocal(padid))
val++;
*(LPDWORD)pMetric = val;
break;
@@ -129,8 +130,9 @@
case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
if (hao) return MMSYSERR_INVALHANDLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
- if (padid->bEnabled && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER)
- && CheckLocal(padid))
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
+ (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) &&
+ CheckLocal(padid))
val++;
*(LPDWORD)pMetric = val;
break;
@@ -141,8 +143,9 @@
case ACM_METRIC_COUNT_LOCAL_FILTERS:
if (hao) return MMSYSERR_INVALHANDLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
- if (padid->bEnabled && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER)
- && CheckLocal(padid))
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
+ (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) &&
+ CheckLocal(padid))
val++;
*(LPDWORD)pMetric = val;
break;
@@ -153,7 +156,7 @@
case ACM_METRIC_COUNT_LOCAL_DISABLED:
if (hao) return MMSYSERR_INVALHANDLE;
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
- if (!padid->bEnabled && CheckLocal(padid))
+ if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
val++;
*(LPDWORD)pMetric = val;
break;
@@ -161,7 +164,7 @@
case ACM_METRIC_MAX_SIZE_FORMAT:
if (hao == (HACMOBJ)NULL) {
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
- if (padid->bEnabled) {
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
for (i = 0; i < padid->cFormatTags; i++) {
if (val < padid->aFormatTag[i].cbwfx)
val = padid->aFormatTag[i].cbwfx;
@@ -177,7 +180,7 @@
default:
return MMSYSERR_INVALHANDLE;
}
- if (padid->bEnabled) {
+ if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
for (i = 0; i < padid->cFormatTags; i++) {
if (val < padid->aFormatTag[i].cbwfx)
val = padid->aFormatTag[i].cbwfx;
Index: dlls/msacm/pcmconverter.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/pcmconverter.c,v
retrieving revision 1.6
diff -u -u -r1.6 pcmconverter.c
--- dlls/msacm/pcmconverter.c 2001/04/23 18:14:41 1.6
+++ dlls/msacm/pcmconverter.c 2001/04/23 19:31:46
@@ -32,9 +32,9 @@
*/
static DWORD PCM_drvOpen(LPCSTR str, PACMDRVOPENDESCW adod)
{
- return
- adod->fccType == ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC &&
- adod->fccComp == ACMDRIVERDETAILS_FCCCOMP_UNDEFINED;
+ return (adod == NULL) ||
+ (adod->fccType == ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC &&
+ adod->fccComp == ACMDRIVERDETAILS_FCCCOMP_UNDEFINED);
}
/***********************************************************************
@@ -789,8 +789,33 @@
*/
static LRESULT PCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
{
- FIXME("(%p);\n", adfs);
- return MMSYSERR_NOTSUPPORTED;
+ /* some tests ... */
+ if (adfs->cbwfxSrc < sizeof(PCMWAVEFORMAT) ||
+ adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) ||
+ PCM_GetFormatIndex(adfs->pwfxSrc) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE;
+
+ /* is no suggestion for destination, then copy source value */
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NCHANNELS)) {
+ adfs->pwfxDst->nChannels = adfs->pwfxSrc->nChannels;
+ }
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC)) {
+ adfs->pwfxDst->nSamplesPerSec = adfs->pwfxSrc->nSamplesPerSec;
+ }
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE)) {
+ adfs->pwfxDst->wBitsPerSample = adfs->pwfxSrc->wBitsPerSample;
+ }
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG)) {
+ if (adfs->pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) return ACMERR_NOTPOSSIBLE;
+ adfs->pwfxDst->wFormatTag = adfs->pwfxSrc->wFormatTag;
+ }
+ /* check if result is ok */
+ if (PCM_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE;
+
+ /* recompute other values */
+ adfs->pwfxDst->nBlockAlign = (adfs->pwfxDst->nChannels * adfs->pwfxDst->wBitsPerSample) / 8;
+ adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * adfs->pwfxDst->nBlockAlign;
+
+ return MMSYSERR_NOERROR;
}
/***********************************************************************
Index: dlls/msacm/stream.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/stream.c,v
retrieving revision 1.6
diff -u -u -r1.6 stream.c
--- dlls/msacm/stream.c 2001/04/23 18:14:41 1.6
+++ dlls/msacm/stream.c 2001/04/27 14:29:57
@@ -140,7 +140,8 @@
if (pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) wfxSrcSize += pwfxSrc->cbSize;
if (pwfxDst->wFormatTag != WAVE_FORMAT_PCM) wfxDstSize += pwfxDst->cbSize;
- was = HeapAlloc(MSACM_hHeap, 0, sizeof(*was) + wfxSrcSize + wfxDstSize + ((pwfltr) ? sizeof(WAVEFILTER) : 0));
+ was = HeapAlloc(MSACM_hHeap, 0, sizeof(*was) + wfxSrcSize + wfxDstSize +
+ ((pwfltr) ? sizeof(WAVEFILTER) : 0));
if (was == NULL)
return MMSYSERR_NOMEM;
@@ -160,7 +161,8 @@
was->drvInst.fdwOpen = fdwOpen;
was->drvInst.fdwDriver = 0L;
was->drvInst.dwDriver = 0L;
- was->drvInst.has = (HACMSTREAM)was;
+ /* real value will be stored once ACMDM_STREAM_OPEN succeeds */
+ was->drvInst.has = 0L;
if (had) {
if (!(wad = MSACM_GetDriver(had))) {
@@ -181,7 +183,7 @@
ret = ACMERR_NOTPOSSIBLE;
for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID) {
- if (!wadi->bEnabled ||
+ if ((wadi->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) ||
!MSACM_FindFormatTagInCache(wadi, pwfxSrc->wFormatTag, NULL) ||
!MSACM_FindFormatTagInCache(wadi, pwfxDst->wFormatTag, NULL))
continue;
@@ -195,7 +197,7 @@
was->hAcmDriver = had;
ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
- TRACE("%s => %08x\n", wadi->pszFileName, ret);
+ TRACE("%s => %08x\n", wadi->pszDriverAlias, ret);
if (ret == MMSYSERR_NOERROR) {
if (fdwOpen & ACM_STREAMOPENF_QUERY) {
acmDriverClose(had, 0L);
@@ -212,6 +214,7 @@
}
}
ret = MMSYSERR_NOERROR;
+ was->drvInst.has = (HACMSTREAM)was;
if (!(fdwOpen & ACM_STREAMOPENF_QUERY)) {
if (phas)
*phas = (HACMSTREAM)was;
Index: dlls/msacm/wineacm.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msacm/wineacm.h,v
retrieving revision 1.6
diff -u -u -r1.6 wineacm.h
--- dlls/msacm/wineacm.h 2001/04/23 18:14:41 1.6
+++ dlls/msacm/wineacm.h 2001/04/27 14:29:35
@@ -299,11 +299,9 @@
typedef struct _WINE_ACMDRIVERID
{
WINE_ACMOBJ obj;
- LPSTR pszDriverAlias;
+ LPSTR pszDriverAlias;
LPSTR pszFileName;
HINSTANCE hInstModule; /* NULL if global */
- DWORD dwProcessID; /* ID of process which installed a local driver */
- BOOL bEnabled;
PWINE_ACMDRIVER pACMDriverList;
PWINE_ACMDRIVERID pNextACMDriverID;
PWINE_ACMDRIVERID pPrevACMDriverID;
More information about the wine-patches
mailing list