]> git.sesse.net Git - vlc/blobdiff - libs/loader/afl.c
Test pointers against NULL instead of 0.
[vlc] / libs / loader / afl.c
index 5f6b59a26bc18a5d232389b4e3e0d4f41355649d..7cb0eb8f180ed1c925df4f5a39ad37340f83437f 100644 (file)
@@ -33,7 +33,7 @@
   Its content will be based mainly on wine/dlls/msacm32
   actually, for audio decompression only the following functions
   are needed:
+  
   acmStreamOpen ( takes formats of src and dest, returns stream handle )
   acmStreamPrepareHeader ( takes stream handler and info on data )
   acmStreamConvert ( the same as PrepareHeader )
   acmStreamClose
   acmStreamSize
   maybe acmStreamReset
-  In future I'll also add functions for format enumeration,
+  
+  In future I'll also add functions for format enumeration, 
   but not right now.
 
   Modified for use with MPlayer, detailed CVS changelog at
   http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
+  
 ***************************************************************************/
 #include "config.h"
 
@@ -82,30 +82,30 @@ static inline PWINE_ACMSTREAM ACM_GetStream(HACMSTREAM has)
  *           acmDriverAddA (MSACM32.2)
  */
 MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule,
-                  LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
+                             LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
 {
     if (!phadid)
-    return MMSYSERR_INVALPARAM;
+       return MMSYSERR_INVALPARAM;
+    
     /* Check if any unknown flags */
-    if (fdwAdd &
-    ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
-      ACM_DRIVERADDF_GLOBAL))
-    return MMSYSERR_INVALFLAG;
+    if (fdwAdd & 
+       ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
+         ACM_DRIVERADDF_GLOBAL))
+       return MMSYSERR_INVALFLAG;
+    
     /* Check if any incompatible flags */
-    if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
-    (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
-    return MMSYSERR_INVALFLAG;
-    /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a
+    if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) && 
+       (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
+       return MMSYSERR_INVALFLAG;
+    
+    /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a 
      * LoadDriver on it, to be sure we can call SendDriverMessage on the
      * hDrvr handle.
      */
     *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, 0, hinstModule);
+    
     /* FIXME: lParam, dwPriority and fdwAdd ignored */
+    
     return MMSYSERR_NOERROR;
 }
 
@@ -116,26 +116,26 @@ MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose)
 {
     PWINE_ACMDRIVER  p;
     PWINE_ACMDRIVER* tp;
+    
     if (fdwClose)
-    return MMSYSERR_INVALFLAG;
+       return MMSYSERR_INVALFLAG;
+    
     p = MSACM_GetDriver(had);
     if (!p)
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
 
     for (tp = &(p->obj.pACMDriverID->pACMDriverList); *tp; *tp = (*tp)->pNextACMDriver) {
-    if (*tp == p) {
-        *tp = (*tp)->pNextACMDriver;
-        break;
+       if (*tp == p) {
+           *tp = (*tp)->pNextACMDriver;
+           break;
+       }
     }
-    }
+    
     if (p->hDrvr && !p->obj.pACMDriverID->pACMDriverList)
-    CloseDriver(p->hDrvr);
+       CloseDriver(p->hDrvr);
+    
     HeapFree(MSACM_hHeap, 0, p);
+    
     return MMSYSERR_NOERROR;
 }
 
@@ -144,28 +144,28 @@ MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose)
  */
 MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
 {
-    PWINE_ACMDRIVERID    p;
-    DWORD        fdwSupport;
+    PWINE_ACMDRIVERID  p;
+    DWORD              fdwSupport;
 
     if (!fnCallback) {
-    return MMSYSERR_INVALPARAM;
+       return MMSYSERR_INVALPARAM;
     }
+    
     if (fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) {
-    return MMSYSERR_INVALFLAG;
+       return MMSYSERR_INVALFLAG;
     }
+    
     for (p = MSACM_pFirstACMDriverID; p; p = p->pNextACMDriverID) {
-    fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
-    if (!p->bEnabled) {
-        if (fdwEnum & ACM_DRIVERENUMF_DISABLED)
-        fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
-        else
-        continue;
-    }
-    (*fnCallback)((HACMDRIVERID) p, dwInstance, fdwSupport);
+       fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+       if (!p->bEnabled) {
+           if (fdwEnum & ACM_DRIVERENUMF_DISABLED)
+               fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
+           else
+               continue;
+       }
+       (*fnCallback)((HACMDRIVERID) p, dwInstance, fdwSupport);
     }
+    
     return MMSYSERR_NOERROR;
 }
 
@@ -175,19 +175,19 @@ MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWOR
 MMRESULT WINAPI acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID)
 {
     PWINE_ACMOBJ pao;
+    
     pao = MSACM_GetObj(hao);
     if (!pao)
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
+    
     if (!phadid)
-    return MMSYSERR_INVALPARAM;
+       return MMSYSERR_INVALPARAM;
+    
     if (fdwDriverID)
-    return MMSYSERR_INVALFLAG;
+       return MMSYSERR_INVALFLAG;
+    
     *phadid = (HACMDRIVERID) pao->pACMDriverID;
+    
     return MMSYSERR_NOERROR;
 }
 
@@ -200,13 +200,13 @@ LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARA
 {
     PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
     if (!pad)
-    return MMSYSERR_INVALPARAM;
+       return MMSYSERR_INVALPARAM;
+    
     /* FIXME: Check if uMsg legal */
+    
     if (!SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2))
-    return MMSYSERR_NOTSUPPORTED;
+       return MMSYSERR_NOTSUPPORTED;
+    
     return MMSYSERR_NOERROR;
 }
 
@@ -216,43 +216,43 @@ LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARA
  */
 MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
 {
-    PWINE_ACMDRIVERID    padid;
-    PWINE_ACMDRIVER    pad;
-    ICOPEN        icopen;
-    HDRVR        hdrv;
+    PWINE_ACMDRIVERID  padid;
+    PWINE_ACMDRIVER    pad;
+    ICOPEN             icopen;
+    HDRVR              hdrv;
 
 
     TRACE("(%p, %x, %08lu)\n", phad, hadid, fdwOpen);
 
     if (!phad)
-    return MMSYSERR_INVALPARAM;
-    padid = MSACM_GetDriverID(hadid);
+       return MMSYSERR_INVALPARAM;
+    
+    padid = MSACM_GetDriverID(hadid); 
     if (!padid)
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
+    
     if (fdwOpen)
-    return MMSYSERR_INVALFLAG;
+       return MMSYSERR_INVALFLAG;
+    
     pad = (PWINE_ACMDRIVER) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER));
     if (!pad)
-    return MMSYSERR_NOMEM;
+       return MMSYSERR_NOMEM;
 
     pad->obj.pACMDriverID = padid;
-    icopen.fccType        = mmioFOURCC('a', 'u', 'd', 'c');
-    icopen.fccHandler        = (long)padid->pszFileName;
-    icopen.dwSize        = sizeof(ICOPEN);
-    icopen.dwFlags        = 0;
+    icopen.fccType             = mmioFOURCC('a', 'u', 'd', 'c');
+    icopen.fccHandler          = (long)padid->pszFileName;
+    icopen.dwSize              = sizeof(ICOPEN);
+    icopen.dwFlags             = 0;
 
     icopen.pV1Reserved = padid->pszFileName;
     if (!padid->hInstModule)
-    pad->hDrvr = OpenDriverA((long)&icopen);
+       pad->hDrvr = OpenDriverA((long)&icopen);
     else
-    pad->hDrvr = padid->hInstModule;
+       pad->hDrvr = padid->hInstModule;
+    
     if (!pad->hDrvr) {
-    HeapFree(MSACM_hHeap, 0, pad);
-    return MMSYSERR_ERROR;
+       HeapFree(MSACM_hHeap, 0, pad);
+       return MMSYSERR_ERROR;
     }
 
     pad->pfnDriverProc = GetProcAddress(pad->hDrvr, "DriverProc");
@@ -273,16 +273,16 @@ MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpe
 MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove)
 {
     PWINE_ACMDRIVERID padid;
+    
     padid = MSACM_GetDriverID(hadid);
     if (!padid)
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
+    
     if (fdwRemove)
-    return MMSYSERR_INVALFLAG;
+       return MMSYSERR_INVALFLAG;
+    
     MSACM_UnregisterDriver(padid);
+    
     return MMSYSERR_NOERROR;
 }
 
@@ -295,18 +295,18 @@ PWINE_ACMDRIVERID MSACM_pFirstACMDriverID = NULL;
 PWINE_ACMDRIVERID MSACM_pLastACMDriverID = NULL;
 
 /***********************************************************************
- *           MSACM_RegisterDriver32()
+ *           MSACM_RegisterDriver32() 
  */
 PWINE_ACMDRIVERID MSACM_RegisterDriver(const char* pszFileName,
-                       WORD wFormatTag,
-                       HINSTANCE hinstModule)
+                                      WORD wFormatTag,
+                                      HINSTANCE hinstModule)
 {
     PWINE_ACMDRIVERID padid;
 
     TRACE("('%s', '%x', 0x%08x)\n", pszFileName, wFormatTag, hinstModule);
 
 #ifndef WIN32_LOADER
-    MSACM_hHeap = GetProcessHeap();
+       MSACM_hHeap = GetProcessHeap();
 #endif
     padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID));
     padid->pszFileName = (char*)malloc(strlen(pszFileName)+1);
@@ -319,11 +319,11 @@ PWINE_ACMDRIVERID MSACM_RegisterDriver(const char* pszFileName,
     padid->pNextACMDriverID = NULL;
     padid->pPrevACMDriverID = MSACM_pLastACMDriverID;
     if (MSACM_pLastACMDriverID)
-    MSACM_pLastACMDriverID->pNextACMDriverID = padid;
+       MSACM_pLastACMDriverID->pNextACMDriverID = padid;
     MSACM_pLastACMDriverID = padid;
     if (!MSACM_pFirstACMDriverID)
-    MSACM_pFirstACMDriverID = padid;
+       MSACM_pFirstACMDriverID = padid;
+    
     return padid;
 }
 
@@ -334,27 +334,26 @@ PWINE_ACMDRIVERID MSACM_RegisterDriver(const char* pszFileName,
 PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p)
 {
     PWINE_ACMDRIVERID pNextACMDriverID;
+    
     while (p->pACMDriverList)
-    acmDriverClose((HACMDRIVER) p->pACMDriverList, 0);
-    if (p->pszFileName)
-    free(p->pszFileName);
+       acmDriverClose((HACMDRIVER) p->pACMDriverList, 0);
+    
+    free( p->pszFileName );
+    
     if (p == MSACM_pFirstACMDriverID)
-    MSACM_pFirstACMDriverID = p->pNextACMDriverID;
+       MSACM_pFirstACMDriverID = p->pNextACMDriverID;
     if (p == MSACM_pLastACMDriverID)
-    MSACM_pLastACMDriverID = p->pPrevACMDriverID;
+       MSACM_pLastACMDriverID = p->pPrevACMDriverID;
 
     if (p->pPrevACMDriverID)
-    p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
+       p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
     if (p->pNextACMDriverID)
-    p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID;
+       p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID;
+    
     pNextACMDriverID = p->pNextACMDriverID;
+    
     HeapFree(MSACM_hHeap, 0, p);
+    
     return pNextACMDriverID;
 }
 
@@ -371,7 +370,7 @@ void MSACM_UnregisterAllDrivers(void)
 }
 
 /***********************************************************************
- *           MSACM_GetDriverID32()
+ *           MSACM_GetDriverID32() 
  */
 PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID)
 {
@@ -400,25 +399,25 @@ PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj)
  *           acmStreamOpen (MSACM32.40)
  */
 MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc,
-                  PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback,
-                  DWORD dwInstance, DWORD fdwOpen)
+                             PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback,
+                             DWORD dwInstance, DWORD fdwOpen)
 {
-    PWINE_ACMSTREAM    was;
-    PWINE_ACMDRIVER    wad;
-    MMRESULT        ret;
-    int            wfxSrcSize;
-    int            wfxDstSize;
+    PWINE_ACMSTREAM    was;
+    PWINE_ACMDRIVER    wad;
+    MMRESULT           ret;
+    int                        wfxSrcSize;
+    int                        wfxDstSize;
+    
     TRACE("(%p, 0x%08x, %p, %p, %p, %ld, %ld, %ld)\n",
-      phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen);
+         phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen);
 
-    TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n",
-      pwfxSrc->wFormatTag, pwfxSrc->nChannels, pwfxSrc->nSamplesPerSec, pwfxSrc->nAvgBytesPerSec,
-      pwfxSrc->nBlockAlign, pwfxSrc->wBitsPerSample, pwfxSrc->cbSize);
+    TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", 
+         pwfxSrc->wFormatTag, pwfxSrc->nChannels, pwfxSrc->nSamplesPerSec, pwfxSrc->nAvgBytesPerSec, 
+         pwfxSrc->nBlockAlign, pwfxSrc->wBitsPerSample, pwfxSrc->cbSize);
 
-    TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n",
-      pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec,
-      pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize);
+    TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", 
+         pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec, 
+         pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize);
 
 #define SIZEOF_WFX(wfx) (sizeof(WAVEFORMATEX) + ((wfx->wFormatTag == WAVE_FORMAT_PCM) ? 0 : wfx->cbSize))
     wfxSrcSize = SIZEOF_WFX(pwfxSrc);
@@ -427,7 +426,7 @@ MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pw
 
     was = (PWINE_ACMSTREAM) HeapAlloc(MSACM_hHeap, 0, sizeof(*was) + wfxSrcSize + wfxDstSize + ((pwfltr) ? sizeof(WAVEFILTER) : 0));
     if (was == NULL)
-    return MMSYSERR_NOMEM;
+       return MMSYSERR_NOMEM;
     was->drvInst.cbStruct = sizeof(was->drvInst);
     was->drvInst.pwfxSrc = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was));
     memcpy(was->drvInst.pwfxSrc, pwfxSrc, wfxSrcSize);
@@ -437,106 +436,106 @@ MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pw
     was->drvInst.pwfxDst = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was) + wfxSrcSize);
     memcpy(was->drvInst.pwfxDst, pwfxDst, wfxDstSize);
     if (pwfltr) {
-    was->drvInst.pwfltr = (PWAVEFILTER)((LPSTR)was + sizeof(*was) + wfxSrcSize + wfxDstSize);
-    memcpy(was->drvInst.pwfltr, pwfltr, sizeof(WAVEFILTER));
+       was->drvInst.pwfltr = (PWAVEFILTER)((LPSTR)was + sizeof(*was) + wfxSrcSize + wfxDstSize);
+       memcpy(was->drvInst.pwfltr, pwfltr, sizeof(WAVEFILTER));
     } else {
-    was->drvInst.pwfltr = NULL;
+       was->drvInst.pwfltr = NULL;
     }
-    was->drvInst.dwCallback = dwCallback;
+    was->drvInst.dwCallback = dwCallback;    
     was->drvInst.dwInstance = dwInstance;
     was->drvInst.fdwOpen = fdwOpen;
-    was->drvInst.fdwDriver = 0L;
-    was->drvInst.dwDriver = 0L;
+    was->drvInst.fdwDriver = 0L;  
+    was->drvInst.dwDriver = 0L;     
     was->drvInst.has = (HACMSTREAM)was;
-    if (had) {
-    if (!(wad = MSACM_GetDriver(had))) {
-        ret = MMSYSERR_INVALPARAM;
-        goto errCleanUp;
-    }
     
-    was->obj.pACMDriverID = wad->obj.pACMDriverID;
-    was->pDrv = wad;
-    was->hAcmDriver = 0; /* not to close it in acmStreamClose */
-
-    ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
-    if (ret != MMSYSERR_NOERROR)
-        goto errCleanUp;
+    if (had) {
+       if (!(wad = MSACM_GetDriver(had))) {
+           ret = MMSYSERR_INVALPARAM;
+           goto errCleanUp;
+       }
+       
+       was->obj.pACMDriverID = wad->obj.pACMDriverID;
+       was->pDrv = wad;
+       was->hAcmDriver = 0; /* not to close it in acmStreamClose */
+
+       ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
+       if (ret != MMSYSERR_NOERROR)
+           goto errCleanUp;
     } else {
-    PWINE_ACMDRIVERID wadi;
-    short drv_tag;
-    ret = ACMERR_NOTPOSSIBLE;
-/*    if(pwfxSrc->wFormatTag==1)//compression
-        drv_tag=pwfxDst->wFormatTag;
-        else
-        if(pwfxDst->wFormatTag==1)//decompression
-        drv_tag=pwfxSrc->wFormatTag;
-        else
-        goto errCleanUp;
-
-        ret=acmDriverOpen2(drv_tag);
-        if (ret == MMSYSERR_NOERROR) {
-        if ((wad = MSACM_GetDriver(had)) != 0) {
-            was->obj.pACMDriverID = wad->obj.pACMDriverID;
-            was->pDrv = wad;
-            was->hAcmDriver = had;
-        
-            ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
-            if (ret == MMSYSERR_NOERROR) {
-            if (fdwOpen & ACM_STREAMOPENF_QUERY) {
-                acmDriverClose(had, 0L);
-            }
-            break;
-            }
-        }
-        acmDriverClose(had, 0L);*/
-    //if(MSACM_pFirstACMDriverID==NULL)
-    //    MSACM_RegisterAllDrivers();
-    
-    for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID)
-    {
-        /* Check Format */
-        if ((int)wadi->wFormatTag != (int)pwfxSrc->wFormatTag) continue;
-
-        ret = acmDriverOpen(&had, (HACMDRIVERID)wadi, 0L);
-        if (ret == MMSYSERR_NOERROR) {
-        if ((wad = MSACM_GetDriver(had)) != 0) {
-            was->obj.pACMDriverID = wad->obj.pACMDriverID;
-            was->pDrv = wad;
-            was->hAcmDriver = had;
-        
-            ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
-            //lhacm - crash printf("RETOPEN %d\n", ret);
+       PWINE_ACMDRIVERID wadi;
+       short drv_tag;
+       ret = ACMERR_NOTPOSSIBLE;
+/*     if(pwfxSrc->wFormatTag==1)//compression
+           drv_tag=pwfxDst->wFormatTag;
+           else
+           if(pwfxDst->wFormatTag==1)//decompression
+               drv_tag=pwfxSrc->wFormatTag;
+               else
+               goto errCleanUp;
+
+           ret=acmDriverOpen2(drv_tag); 
+           if (ret == MMSYSERR_NOERROR) {
+               if ((wad = MSACM_GetDriver(had)) != 0) {
+                   was->obj.pACMDriverID = wad->obj.pACMDriverID;
+                   was->pDrv = wad;
+                   was->hAcmDriver = had;
+                   
+                   ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
+                   if (ret == MMSYSERR_NOERROR) {
+                       if (fdwOpen & ACM_STREAMOPENF_QUERY) {
+                           acmDriverClose(had, 0L);
+                       }
+                       break;
+                   }
+               }
+               acmDriverClose(had, 0L);*/
+       //if(MSACM_pFirstACMDriverID==NULL)
+       //    MSACM_RegisterAllDrivers();
+       
+       for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID)
+       {
+           /* Check Format */
+           if ((int)wadi->wFormatTag != (int)pwfxSrc->wFormatTag) continue;
+
+           ret = acmDriverOpen(&had, (HACMDRIVERID)wadi, 0L);
+           if (ret == MMSYSERR_NOERROR) {
+               if ((wad = MSACM_GetDriver(had)) != NULL) {
+                   was->obj.pACMDriverID = wad->obj.pACMDriverID;
+                   was->pDrv = wad;
+                   was->hAcmDriver = had;
+                   
+                   ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
+                   //lhacm - crash printf("RETOPEN %d\n", ret);
                     //ret = 0;
-            if (ret == MMSYSERR_NOERROR) {
-            if (fdwOpen & ACM_STREAMOPENF_QUERY) {
-                acmDriverClose(had, 0L);
-            }
-            break;
-            }
-        }
-        // no match, close this acm driver and try next one
-        acmDriverClose(had, 0L);
-        }
-    }
-    if (ret != MMSYSERR_NOERROR) {
-        ret = ACMERR_NOTPOSSIBLE;
-        goto errCleanUp;
-    }
+                   if (ret == MMSYSERR_NOERROR) {
+                       if (fdwOpen & ACM_STREAMOPENF_QUERY) {
+                           acmDriverClose(had, 0L);
+                       }
+                       break;
+                   }
+               }
+               // no match, close this acm driver and try next one 
+               acmDriverClose(had, 0L);
+           }
+       }
+       if (ret != MMSYSERR_NOERROR) {
+           ret = ACMERR_NOTPOSSIBLE;
+           goto errCleanUp;
+       }
     }
     ret = MMSYSERR_NOERROR;
     if (!(fdwOpen & ACM_STREAMOPENF_QUERY)) {
-    if (phas)
-        *phas = (HACMSTREAM)was;
-    TRACE("=> (%d)\n", ret);
+       if (phas)
+           *phas = (HACMSTREAM)was;
+       TRACE("=> (%d)\n", ret);
 #ifdef WIN32_LOADER
         CodecAlloc();
 #endif
-    return ret;
+       return ret;
     }
-errCleanUp:        
+errCleanUp:            
     if (phas)
-    *phas = (HACMSTREAM)0;
+       *phas = (HACMSTREAM)0;
     HeapFree(MSACM_hHeap, 0, was);
     TRACE("=> (%d)\n", ret);
     return ret;
@@ -545,19 +544,19 @@ errCleanUp:
 
 MMRESULT WINAPI acmStreamClose(HACMSTREAM has, DWORD fdwClose)
 {
-    PWINE_ACMSTREAM    was;
-    MMRESULT        ret;
-        
+    PWINE_ACMSTREAM    was;
+    MMRESULT           ret;
+               
     TRACE("(0x%08x, %ld)\n", has, fdwClose);
+    
     if ((was = ACM_GetStream(has)) == NULL) {
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
     }
     ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_CLOSE, (DWORD)&was->drvInst, 0);
     if (ret == MMSYSERR_NOERROR) {
-    if (was->hAcmDriver)
-        acmDriverClose(was->hAcmDriver, 0L);    
-    HeapFree(MSACM_hHeap, 0, was);
+       if (was->hAcmDriver)
+           acmDriverClose(was->hAcmDriver, 0L);        
+       HeapFree(MSACM_hHeap, 0, was);
 #ifdef WIN32_LOADER
         CodecRelease();
 #endif
@@ -569,22 +568,22 @@ MMRESULT WINAPI acmStreamClose(HACMSTREAM has, DWORD fdwClose)
 /***********************************************************************
  *           acmStreamConvert (MSACM32.38)
  */
-MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash,
-                 DWORD fdwConvert)
+MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash, 
+                                DWORD fdwConvert)
 {
-    PWINE_ACMSTREAM    was;
-    MMRESULT        ret = MMSYSERR_NOERROR;
-    PACMDRVSTREAMHEADER    padsh;
+    PWINE_ACMSTREAM    was;
+    MMRESULT           ret = MMSYSERR_NOERROR;
+    PACMDRVSTREAMHEADER        padsh;
 
     TRACE("(0x%08x, %p, %ld)\n", has, pash, fdwConvert);
 
     if ((was = ACM_GetStream(has)) == NULL)
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
     if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER))
-    return MMSYSERR_INVALPARAM;
+       return MMSYSERR_INVALPARAM;
 
     if (!(pash->fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED))
-    return ACMERR_UNPREPARED;
+       return ACMERR_UNPREPARED;
 
     /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
      * size. some fields are private to msacm internals, and are exposed
@@ -594,17 +593,17 @@ MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash,
 
     /* check that pointers have not been modified */
     if (padsh->pbPreparedSrc != padsh->pbSrc ||
-    padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
-    padsh->pbPreparedDst != padsh->pbDst ||
-    padsh->cbPreparedDstLength < padsh->cbDstLength) {
-    return MMSYSERR_INVALPARAM;
-    }    
+       padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
+       padsh->pbPreparedDst != padsh->pbDst ||
+       padsh->cbPreparedDstLength < padsh->cbDstLength) {
+       return MMSYSERR_INVALPARAM;
+    }  
 
     padsh->fdwConvert = fdwConvert;
 
     ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_CONVERT, (DWORD)&was->drvInst, (DWORD)padsh);
     if (ret == MMSYSERR_NOERROR) {
-    padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_DONE;
+       padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_DONE;
     }
     TRACE("=> (%d)\n", ret);
     return ret;
@@ -614,24 +613,24 @@ MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash,
 /***********************************************************************
  *           acmStreamPrepareHeader (MSACM32.41)
  */
-MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
-                       DWORD fdwPrepare)
+MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, 
+                                      DWORD fdwPrepare)
 {
-    PWINE_ACMSTREAM    was;
-    MMRESULT        ret = MMSYSERR_NOERROR;
-    PACMDRVSTREAMHEADER    padsh;
+    PWINE_ACMSTREAM    was;
+    MMRESULT           ret = MMSYSERR_NOERROR;
+    PACMDRVSTREAMHEADER        padsh;
 
     TRACE("(0x%08x, %p, %ld)\n", has, pash, fdwPrepare);
+    
     if ((was = ACM_GetStream(has)) == NULL)
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
     if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER))
-    return MMSYSERR_INVALPARAM;
+       return MMSYSERR_INVALPARAM;
     if (fdwPrepare)
-    ret = MMSYSERR_INVALFLAG;
+       ret = MMSYSERR_INVALFLAG;
 
     if (pash->fdwStatus & ACMSTREAMHEADER_STATUSF_DONE)
-    return MMSYSERR_NOERROR;
+       return MMSYSERR_NOERROR;
 
     /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
      * size. some fields are private to msacm internals, and are exposed
@@ -652,22 +651,22 @@ MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
 
     ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_PREPARE, (DWORD)&was->drvInst, (DWORD)padsh);
     if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) {
-    ret = MMSYSERR_NOERROR;
-    padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE);
-    padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_PREPARED;
-    padsh->fdwPrepared = padsh->fdwStatus;
-    padsh->dwPrepared = 0;
-    padsh->pbPreparedSrc = padsh->pbSrc;
-    padsh->cbPreparedSrcLength = padsh->cbSrcLength;
-    padsh->pbPreparedDst = padsh->pbDst;
-    padsh->cbPreparedDstLength = padsh->cbDstLength;
+       ret = MMSYSERR_NOERROR;
+       padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE);
+       padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_PREPARED;
+       padsh->fdwPrepared = padsh->fdwStatus;
+       padsh->dwPrepared = 0;
+       padsh->pbPreparedSrc = padsh->pbSrc;
+       padsh->cbPreparedSrcLength = padsh->cbSrcLength;
+       padsh->pbPreparedDst = padsh->pbDst;
+       padsh->cbPreparedDstLength = padsh->cbDstLength;
     } else {
-    padsh->fdwPrepared = 0;
-    padsh->dwPrepared = 0;
-    padsh->pbPreparedSrc = 0;
-    padsh->cbPreparedSrcLength = 0;
-    padsh->pbPreparedDst = 0;
-    padsh->cbPreparedDstLength = 0;
+       padsh->fdwPrepared = 0;
+       padsh->dwPrepared = 0;
+       padsh->pbPreparedSrc = 0;
+       padsh->cbPreparedSrcLength = 0;
+       padsh->pbPreparedDst = 0;
+       padsh->cbPreparedDstLength = 0;
     }
     TRACE("=> (%d)\n", ret);
     return ret;
@@ -678,17 +677,17 @@ MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
  */
 MMRESULT WINAPI acmStreamReset(HACMSTREAM has, DWORD fdwReset)
 {
-    PWINE_ACMSTREAM    was;
-    MMRESULT        ret = MMSYSERR_NOERROR;
+    PWINE_ACMSTREAM    was;
+    MMRESULT           ret = MMSYSERR_NOERROR;
 
     TRACE("(0x%08x, %ld)\n", has, fdwReset);
 
     if (fdwReset) {
-    ret = MMSYSERR_INVALFLAG;
+       ret = MMSYSERR_INVALFLAG;
     } else if ((was = ACM_GetStream(has)) == NULL) {
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
     } else if (was->drvInst.fdwOpen & ACM_STREAMOPENF_ASYNC) {
-    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_RESET, (DWORD)&was->drvInst, 0);
+       ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_RESET, (DWORD)&was->drvInst, 0);
     }
     TRACE("=> (%d)\n", ret);
     return ret;
@@ -697,50 +696,50 @@ MMRESULT WINAPI acmStreamReset(HACMSTREAM has, DWORD fdwReset)
 /***********************************************************************
  *           acmStreamSize (MSACM32.43)
  */
-MMRESULT WINAPI acmStreamSize(HACMSTREAM has, DWORD cbInput,
-                  LPDWORD pdwOutputBytes, DWORD fdwSize)
+MMRESULT WINAPI acmStreamSize(HACMSTREAM has, DWORD cbInput, 
+                             LPDWORD pdwOutputBytes, DWORD fdwSize)
 {
-    PWINE_ACMSTREAM    was;
-    ACMDRVSTREAMSIZE    adss;
-    MMRESULT        ret;
+    PWINE_ACMSTREAM    was;
+    ACMDRVSTREAMSIZE   adss;
+    MMRESULT           ret;
+    
     TRACE("(0x%08x, %ld, %p, %ld)\n", has, cbInput, pdwOutputBytes, fdwSize);
+    
     if ((was = ACM_GetStream(has)) == NULL) {
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
     }
     if ((fdwSize & ~ACM_STREAMSIZEF_QUERYMASK) != 0) {
-    return MMSYSERR_INVALFLAG;
+       return MMSYSERR_INVALFLAG;
     }
 
     *pdwOutputBytes = 0L;
+    
     switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) {
     case ACM_STREAMSIZEF_DESTINATION:
-    adss.cbDstLength = cbInput;
-    adss.cbSrcLength = 0;
-    break;
+       adss.cbDstLength = cbInput;
+       adss.cbSrcLength = 0;
+       break;
     case ACM_STREAMSIZEF_SOURCE:
-    adss.cbSrcLength = cbInput;
-    adss.cbDstLength = 0;
-    break;
-    default:    
-    return MMSYSERR_INVALFLAG;
+       adss.cbSrcLength = cbInput;
+       adss.cbDstLength = 0;
+       break;
+    default:   
+       return MMSYSERR_INVALFLAG;
     }
+    
     adss.cbStruct = sizeof(adss);
     adss.fdwSize = fdwSize;
-    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_SIZE,
-                (DWORD)&was->drvInst, (DWORD)&adss);
+    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_SIZE, 
+                           (DWORD)&was->drvInst, (DWORD)&adss);
     if (ret == MMSYSERR_NOERROR) {
-    switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) {
-    case ACM_STREAMSIZEF_DESTINATION:
-        *pdwOutputBytes = adss.cbSrcLength;
-        break;
-    case ACM_STREAMSIZEF_SOURCE:
-        *pdwOutputBytes = adss.cbDstLength;
-        break;
-    }
+       switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) {
+       case ACM_STREAMSIZEF_DESTINATION:
+           *pdwOutputBytes = adss.cbSrcLength;
+           break;
+       case ACM_STREAMSIZEF_SOURCE:
+           *pdwOutputBytes = adss.cbDstLength;
+           break;
+       }
     }
     TRACE("=> (%d) [%lu]\n", ret, *pdwOutputBytes);
     return ret;
@@ -749,22 +748,22 @@ MMRESULT WINAPI acmStreamSize(HACMSTREAM has, DWORD cbInput,
 /***********************************************************************
  *           acmStreamUnprepareHeader (MSACM32.44)
  */
-MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
-                     DWORD fdwUnprepare)
+MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, 
+                                        DWORD fdwUnprepare)
 {
-    PWINE_ACMSTREAM    was;
-    MMRESULT        ret = MMSYSERR_NOERROR;
-    PACMDRVSTREAMHEADER    padsh;
+    PWINE_ACMSTREAM    was;
+    MMRESULT           ret = MMSYSERR_NOERROR;
+    PACMDRVSTREAMHEADER        padsh;
 
     TRACE("(0x%08x, %p, %ld)\n", has, pash, fdwUnprepare);
+    
     if ((was = ACM_GetStream(has)) == NULL)
-    return MMSYSERR_INVALHANDLE;
+       return MMSYSERR_INVALHANDLE;
     if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER))
-    return MMSYSERR_INVALPARAM;
+       return MMSYSERR_INVALPARAM;
 
     if (!(pash->fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED))
-    return ACMERR_UNPREPARED;
+       return ACMERR_UNPREPARED;
 
     /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
      * size. some fields are private to msacm internals, and are exposed
@@ -774,18 +773,18 @@ MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
 
     /* check that pointers have not been modified */
     if (padsh->pbPreparedSrc != padsh->pbSrc ||
-    padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
-    padsh->pbPreparedDst != padsh->pbDst ||
-    padsh->cbPreparedDstLength < padsh->cbDstLength) {
-    return MMSYSERR_INVALPARAM;
-    }    
+       padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
+       padsh->pbPreparedDst != padsh->pbDst ||
+       padsh->cbPreparedDstLength < padsh->cbDstLength) {
+       return MMSYSERR_INVALPARAM;
+    }  
 
     padsh->fdwConvert = fdwUnprepare;
 
     ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_UNPREPARE, (DWORD)&was->drvInst, (DWORD)padsh);
     if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) {
-    ret = MMSYSERR_NOERROR;
-    padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE|ACMSTREAMHEADER_STATUSF_PREPARED);
+       ret = MMSYSERR_NOERROR;
+       padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE|ACMSTREAMHEADER_STATUSF_PREPARED);
     }
     TRACE("=> (%d)\n", ret);
     return ret;