Added cache for drivers information.
Fixed a few bugs (memory handling, version info...)
Enhanced validity checks.
diff --git a/dlls/msacm/filter.c b/dlls/msacm/filter.c
index 02044c9..abeec5c 100644
--- a/dlls/msacm/filter.c
+++ b/dlls/msacm/filter.c
@@ -101,14 +101,12 @@
}
}
} else {
- mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
- (LPARAM)pafd, (LPARAM)fdwDetails);
+ mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails);
}
break;
case ACM_FILTERDETAILSF_INDEX:
/* should check pafd->dwFilterIndex < aftd->cStandardFilters */
- mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
- (LPARAM)pafd, (LPARAM)fdwDetails);
+ mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails);
break;
default:
WARN("Unknown fdwDetails %08lx\n", fdwDetails);
@@ -175,15 +173,10 @@
ACMFILTERENUMCBW fnCallback, DWORD dwInstance,
DWORD fdwEnum)
{
- ACMDRIVERDETAILSW add;
ACMFILTERTAGDETAILSW aftd;
int i, j;
- add.cbStruct = sizeof(add);
-
- if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) != MMSYSERR_NOERROR) return FALSE;
-
- for (i = 0; i < add.cFilterTags; i++) {
+ for (i = 0; i < padid->cFilterTags; i++) {
memset(&aftd, 0, sizeof(aftd));
aftd.cbStruct = sizeof(aftd);
aftd.dwFilterTagIndex = i;
@@ -200,7 +193,7 @@
if (acmFilterDetailsW(had, pafd, ACM_FILTERDETAILSF_INDEX) != MMSYSERR_NOERROR)
continue;
- if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, add.fdwSupport))
+ if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport))
return FALSE;
}
}
@@ -295,22 +288,19 @@
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
- mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
- (LPARAM)paftd, (LPARAM)fdwDetails);
+ mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
acmDriverClose(had, 0);
if (mmr == MMSYSERR_NOERROR) break;
}
}
} else {
- mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
- (LPARAM)paftd, (LPARAM)fdwDetails);
+ mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
}
break;
case ACM_FILTERTAGDETAILSF_INDEX:
/* FIXME should check paftd->dwFilterTagIndex < add.cFilterTags */
- mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
- (LPARAM)paftd, (LPARAM)fdwDetails);
+ mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
break;
case ACM_FILTERTAGDETAILSF_LARGESTSIZE:
@@ -328,9 +318,8 @@
tmp.cbStruct = sizeof(tmp);
tmp.dwFilterTag = ft;
- if (MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
- (LPARAM)&tmp,
- (LPARAM)fdwDetails) == MMSYSERR_NOERROR) {
+ if (MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
+ (LPARAM)&tmp, fdwDetails) == MMSYSERR_NOERROR) {
if (mmr == ACMERR_NOTPOSSIBLE ||
paftd->cbFilterSize < tmp.cbFilterSize) {
*paftd = tmp;
@@ -341,8 +330,7 @@
}
}
} else {
- mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
- (LPARAM)paftd, (LPARAM)fdwDetails);
+ mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
}
break;
@@ -417,7 +405,6 @@
DWORD fdwEnum)
{
PWINE_ACMDRIVERID padid;
- ACMDRIVERDETAILSW add;
int i;
TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
@@ -430,17 +417,13 @@
for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
/* should check for codec only */
if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
- add.cbStruct = sizeof(add);
- if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) == MMSYSERR_NOERROR) {
- for (i = 0; i < add.cFilterTags; i++) {
- paftd->dwFilterTagIndex = i;
- if (acmFilterTagDetailsW(had, paftd, ACM_FILTERTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
- if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance,
- add.fdwSupport)) {
- padid = NULL;
- break;
- }
+ for (i = 0; i < padid->cFilterTags; i++) {
+ paftd->dwFilterTagIndex = i;
+ if (acmFilterTagDetailsW(had, paftd, ACM_FILTERTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
+ if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) {
+ padid = NULL;
+ break;
}
}
}