Resubmission
Waldeck Schutzer
schutzer at math.rutgers.edu
Sun Jan 19 14:37:58 CST 2003
Hi again,
These are my patches to the multimedia system, now in the diff -u
format. This should fix the following problems: (1) not finding the
codecs at all, (2) mislisting the same codec multiple times. I now can
run VirtualDub 1.4.10 almost perfectly (the speed still sucks).
Best,
Waldeck
-------------- next part --------------
Index: wine/dlls/msacm/format.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/format.c,v
retrieving revision 1.20
diff -u -r1.20 format.c
--- wine/dlls/msacm/format.c 2 Dec 2002 18:10:59 -0000 1.20
+++ wine/dlls/msacm/format.c 19 Jan 2003 20:27:30 -0000
@@ -758,36 +758,69 @@
if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM;
- if (had) FIXME("had != NULL, not supported\n");
+ /* if (had) FIXME("had != NULL, not supported\n"); */
+
+ /* If had != 0, get tags for specific driver */
+ if (had) {
+
+ if (acmDriverID((HACMOBJ)had, (HACMDRIVERID *)&padid, 0) != MMSYSERR_NOERROR)
+ return MMSYSERR_INVALHANDLE;
+
+ for (i = 0; i < padid->cFormatTags; i++) {
+ paftd->dwFormatTagIndex = i;
+ if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
+ (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
+ if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
+ if (paftd->szFormatTag[0] == 0)
+ MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag,
+ sizeof(paftd->szFormatTag)/sizeof(WCHAR) );
+ /* FIXME (WS): I actually have no idea why one would
+ * have to do this. I just copied it from the block
+ * right below, where the EPP is not sure about it either.
+ * Oh, well...
+ */
+ if (bPcmDone) continue;
+ bPcmDone = TRUE;
+ }
+ if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport))
+ return MMSYSERR_NOERROR;
+ }
+ }
- for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
- /* should check for codec only */
- 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,
- (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
- if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
- if (paftd->szFormatTag[0] == 0)
- MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag,
- sizeof(paftd->szFormatTag)/sizeof(WCHAR) );
- /* FIXME (EPP): I'm not sure this is the correct
- * algorithm (should make more sense to apply the same
- * for all already loaded formats, but this will do
- * for now
- */
- if (bPcmDone) continue;
- bPcmDone = TRUE;
- }
- if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) {
- acmDriverClose(had, 0);
- return MMSYSERR_NOERROR;
- }
- }
- }
- }
- acmDriverClose(had, 0);
+ }
+
+ /* if had==0 then search for the first suitable driver */
+ else {
+ for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
+ /* should check for codec only */
+ 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,
+ (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
+ if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
+ if (paftd->szFormatTag[0] == 0)
+ MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag,
+ sizeof(paftd->szFormatTag)/sizeof(WCHAR) );
+ /* FIXME (EPP): I'm not sure this is the correct
+ * algorithm (should make more sense to apply the same
+ * for all already loaded formats, but this will do
+ * for now
+ */
+ if (bPcmDone) continue;
+ bPcmDone = TRUE;
+ }
+ if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) {
+ acmDriverClose(had, 0);
+ return MMSYSERR_NOERROR;
+ }
+ }
+ }
+ }
+ acmDriverClose(had, 0);
+ }
}
return MMSYSERR_NOERROR;
}
+
Index: wine/dlls/msacm/stream.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/stream.c,v
retrieving revision 1.12
diff -u -r1.12 stream.c
--- wine/dlls/msacm/stream.c 2 Dec 2002 18:10:59 -0000 1.12
+++ wine/dlls/msacm/stream.c 19 Jan 2003 20:27:30 -0000
@@ -147,7 +147,14 @@
pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec,
pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize);
+ /*
+ * The docs say if ACM_STREAMOPENF_QUERY, phas should be NULL. It does
+ * not say it MUST BE NULL. This is breaking down some applications
+ * that happen to pass a non-null (probably garbage) phas.
+
if ((fdwOpen & ACM_STREAMOPENF_QUERY) && phas) return MMSYSERR_INVALPARAM;
+ */
+
if (pwfltr && (pwfxSrc->wFormatTag != pwfxDst->wFormatTag)) return MMSYSERR_INVALPARAM;
wfxSrcSize = wfxDstSize = sizeof(WAVEFORMATEX);
@@ -230,14 +237,25 @@
ret = MMSYSERR_NOERROR;
was->drvInst.has = (HACMSTREAM)was;
if (!(fdwOpen & ACM_STREAMOPENF_QUERY)) {
- if (phas)
- *phas = (HACMSTREAM)was;
- TRACE("=> (%d)\n", ret);
- return ret;
+ /* if this is not query, then return the pointer to heap */
+ if (phas)
+ *phas = (HACMSTREAM)was;
}
+ else
+ /* otherwise, we release memory to avoid leaks, hehe! */
+ HeapFree(MSACM_hHeap, 0, was);
+ TRACE("=> (%d)\n", ret);
+ return ret;
+
errCleanUp:
- if (phas)
+ if (!(fdwOpen & ACM_STREAMOPENF_QUERY)) {
+ /* If it is not dirty, don't clean it up!
+ * The doc says that if ACM_STREAMOPENF_QUERY is set
+ * phas will not be set, even if there is an error.
+ */
+ if (phas)
*phas = NULL;
+ }
HeapFree(MSACM_hHeap, 0, was);
TRACE("=> (%d)\n", ret);
return ret;
Index: wine/dlls/msvideo/msvideo_main.c
===================================================================
RCS file: /home/wine/wine/dlls/msvideo/msvideo_main.c,v
retrieving revision 1.45
diff -u -r1.45 msvideo_main.c
--- wine/dlls/msvideo/msvideo_main.c 14 Jan 2003 23:43:42 -0000 1.45
+++ wine/dlls/msvideo/msvideo_main.c 19 Jan 2003 20:27:30 -0000
@@ -79,13 +79,16 @@
char buf[2000];
TRACE("(%.4s,%.4s,%p)\n", (char*)&fccType, (char*)&fccHandler, lpicinfo);
+ // The "Case of the missing codecs"
+ // A fix proposed by Waldeck Schutzer <waldeck at dm.ufscar.br>
if (GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini"))
{
char *s = buf;
while (*s)
{
- if (!strncasecmp((char*)&fccType, s, 4) && s[4] == '.' && s[9] == '=')
+ if (!strncasecmp((char*)&fccType, s, 4) && s[4] == '.' /* && s[9] == '=' */ )
+ // buf is a list of keys, not keys followed by their values!
{
if (!fccHandler--)
{
@@ -95,11 +98,16 @@
hic = ICOpen(fccType, lpicinfo->fccHandler, ICMODE_QUERY);
if (hic)
{
+ // Some bad codecs can make wine crash right here.
+ // It would be nice to know why and to find ways
+ // to preventing it from happening. I can't do it.
ICGetInfo(hic, lpicinfo, lpicinfo->dwSize);
ICClose(hic);
return TRUE;
}
- return FALSE;
+ // return FALSE;
+ // This one failed to open, but keep going down the list!
+ fccHandler++;
}
}
s += strlen(s) + 1; /* either next char or \0 */
More information about the wine-patches
mailing list