Changeset 6712 for trunk/src/msacm32


Ignore:
Timestamp:
Sep 15, 2001, 11:47:44 AM (24 years ago)
Author:
sandervl
Message:

restored old version

Location:
trunk/src/msacm32
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/msacm32/driver.c

    r6648 r6712  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 /* $Id: driver.c,v 1.2 2001-09-05 13:11:25 bird Exp $ */
     2
    33/*
    44 *      MSACM32 library
    55 *
    66 *      Copyright 1998  Patrik Stridvall
    7  *        1999  Eric Pouech
     7 *                1999  Eric Pouech
    88 */
    99
     
    2929
    3030DEFAULT_DEBUG_CHANNEL(msacm);
    31 
     31       
    3232/***********************************************************************
    3333 *           acmDriverAddA (MSACM32.2)
    3434 */
    3535MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule,
    36                   LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
     36                              LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
    3737{
    3838    if (!phadid)
    39     return MMSYSERR_INVALPARAM;
    40 
     39        return MMSYSERR_INVALPARAM;
     40   
    4141    /* Check if any unknown flags */
    42     if (fdwAdd &
    43     ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
    44       ACM_DRIVERADDF_GLOBAL))
    45     return MMSYSERR_INVALFLAG;
    46 
     42    if (fdwAdd & 
     43        ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
     44          ACM_DRIVERADDF_GLOBAL))
     45        return MMSYSERR_INVALFLAG;
     46   
    4747    /* Check if any incompatible flags */
    48     if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
    49     (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
    50     return MMSYSERR_INVALFLAG;
    51 
    52     /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a
     48    if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) && 
     49        (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
     50        return MMSYSERR_INVALFLAG;
     51   
     52    /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a 
    5353     * LoadDriver on it, to be sure we can call SendDriverMessage on the
    5454     * hDrvr handle.
    5555     */
    5656    *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL, hinstModule);
    57 
     57   
    5858    /* FIXME: lParam, dwPriority and fdwAdd ignored */
    59 
     59   
    6060    return MMSYSERR_NOERROR;
    6161}
     
    6767 */
    6868MMRESULT WINAPI acmDriverAddW(PHACMDRIVERID phadid, HINSTANCE hinstModule,
    69                   LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
     69                              LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
    7070{
    7171    FIXME("(%p, 0x%08x, %ld, %ld, %ld): stub\n",
    72       phadid, hinstModule, lParam, dwPriority, fdwAdd);
    73 
     72          phadid, hinstModule, lParam, dwPriority, fdwAdd);
     73   
    7474    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
    7575    return MMSYSERR_ERROR;
     
    8181MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose)
    8282{
    83     PWINE_ACMDRIVER pad;
    84     PWINE_ACMDRIVERID   padid;
    85     PWINE_ACMDRIVER*    tpad;
     83    PWINE_ACMDRIVER     pad;
     84    PWINE_ACMDRIVERID   padid;
     85    PWINE_ACMDRIVER*    tpad;
    8686
    8787    if (fdwClose)
    88     return MMSYSERR_INVALFLAG;
    89 
     88        return MMSYSERR_INVALFLAG;
     89   
    9090    pad = MSACM_GetDriver(had);
    9191    if (!pad)
    92     return MMSYSERR_INVALHANDLE;
     92        return MMSYSERR_INVALHANDLE;
    9393
    9494    padid = pad->obj.pACMDriverID;
     
    9696    /* remove driver from list */
    9797    for (tpad = &(padid->pACMDriverList); *tpad; *tpad = (*tpad)->pNextACMDriver) {
    98     if (*tpad == pad) {
    99         *tpad = (*tpad)->pNextACMDriver;
    100         break;
    101     }
    102     }
    103 
     98        if (*tpad == pad) {
     99            *tpad = (*tpad)->pNextACMDriver;
     100            break;
     101        }
     102    }
     103   
    104104    /* close driver if it has been opened */
    105105    if (pad->hDrvr && !padid->hInstModule)
    106     CloseDriver(pad->hDrvr, 0, 0);
    107 
     106        CloseDriver(pad->hDrvr, 0, 0);
     107   
    108108    HeapFree(MSACM_hHeap, 0, pad);
    109 
     109   
    110110    return MMSYSERR_NOERROR;
    111111}
     
    117117{
    118118    MMRESULT mmr;
    119     ACMDRIVERDETAILSW   addw;
    120 
     119    ACMDRIVERDETAILSW   addw;
     120   
    121121    addw.cbStruct = sizeof(addw);
    122122    mmr = acmDriverDetailsW(hadid, &addw, fdwDetails);
    123123    if (mmr == 0) {
    124     padd->fccType = addw.fccType;
    125     padd->fccComp = addw.fccComp;
    126     padd->wMid = addw.wMid;
    127     padd->wPid = addw.wPid;
    128     padd->vdwACM = addw.vdwACM;
    129     padd->vdwDriver = addw.vdwDriver;
    130     padd->fdwSupport = addw.fdwSupport;
    131     padd->cFormatTags = addw.cFormatTags;
    132     padd->cFilterTags = addw.cFilterTags;
    133     padd->hicon = addw.hicon;
     124        padd->fccType = addw.fccType;
     125        padd->fccComp = addw.fccComp;
     126        padd->wMid = addw.wMid;
     127        padd->wPid = addw.wPid;
     128        padd->vdwACM = addw.vdwACM;
     129        padd->vdwDriver = addw.vdwDriver;
     130        padd->fdwSupport = addw.fdwSupport;
     131        padd->cFormatTags = addw.cFormatTags;
     132        padd->cFilterTags = addw.cFilterTags;
     133        padd->hicon = addw.hicon;
    134134        WideCharToMultiByte( CP_ACP, 0, addw.szShortName, -1, padd->szShortName,
    135135                             sizeof(padd->szShortName), NULL, NULL );
     
    153153    HACMDRIVER acmDrvr;
    154154    MMRESULT mmr;
    155 
     155   
    156156    if (fdwDetails)
    157     return MMSYSERR_INVALFLAG;
    158 
     157        return MMSYSERR_INVALFLAG;
     158   
    159159    mmr = acmDriverOpen(&acmDrvr, hadid, 0);
    160160    if (mmr == MMSYSERR_NOERROR) {
    161     mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)padd,  0);
    162 
    163     acmDriverClose(acmDrvr, 0);
    164     }
    165 
     161        mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)padd,  0);
     162   
     163        acmDriverClose(acmDrvr, 0);
     164    }
     165   
    166166    return mmr;
    167167}
     
    172172MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
    173173{
    174     PWINE_ACMDRIVERID   p;
    175     ACMDRIVERDETAILSW   add;
     174    PWINE_ACMDRIVERID   p;
     175    ACMDRIVERDETAILSW   add;
    176176
    177177    if (!fnCallback) return MMSYSERR_INVALPARAM;
    178 
     178   
    179179    if (fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED))
    180     return MMSYSERR_INVALFLAG;
    181 
     180        return MMSYSERR_INVALFLAG;
     181   
    182182    add.cbStruct = sizeof(add);
    183183    for (p = MSACM_pFirstACMDriverID; p; p = p->pNextACMDriverID) {
    184     if (acmDriverDetailsW((HACMDRIVERID)p, &add, 0) != MMSYSERR_NOERROR)
    185         continue;
    186     if (!p->bEnabled) {
    187         if (fdwEnum & ACM_DRIVERENUMF_DISABLED)
    188         add.fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
    189         else
    190         continue;
    191     }
    192     if (!(*fnCallback)((HACMDRIVERID)p, dwInstance, add.fdwSupport))
    193         break;
    194     }
    195 
     184        if (acmDriverDetailsW((HACMDRIVERID)p, &add, 0) != MMSYSERR_NOERROR)
     185            continue;
     186        if (!p->bEnabled) {
     187            if (fdwEnum & ACM_DRIVERENUMF_DISABLED)
     188                add.fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
     189            else
     190                continue;
     191        }
     192        if (!(*fnCallback)((HACMDRIVERID)p, dwInstance, add.fdwSupport))
     193            break;
     194    }
     195   
    196196    return MMSYSERR_NOERROR;
    197197}
     
    203203{
    204204    PWINE_ACMOBJ pao;
    205 
     205   
    206206    if (!phadid)
    207     return MMSYSERR_INVALPARAM;
    208 
     207        return MMSYSERR_INVALPARAM;
     208   
    209209    if (fdwDriverID)
    210     return MMSYSERR_INVALFLAG;
    211 
     210        return MMSYSERR_INVALFLAG;
     211   
    212212    pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
    213213    if (!pao)
    214     return MMSYSERR_INVALHANDLE;
    215 
     214        return MMSYSERR_INVALHANDLE;
     215   
    216216    *phadid = (HACMDRIVERID) pao->pACMDriverID;
    217 
     217   
    218218    return MMSYSERR_NOERROR;
    219219}
     
    226226{
    227227    if ((uMsg >= ACMDM_USER && uMsg < ACMDM_RESERVED_LOW) ||
    228     uMsg == ACMDM_DRIVER_ABOUT ||
    229     uMsg == DRV_QUERYCONFIGURE ||
    230     uMsg == DRV_CONFIGURE)
    231     return MSACM_Message(had, uMsg, lParam1, lParam2);
     228        uMsg == ACMDM_DRIVER_ABOUT ||
     229        uMsg == DRV_QUERYCONFIGURE ||
     230        uMsg == DRV_CONFIGURE)
     231        return MSACM_Message(had, uMsg, lParam1, lParam2);
    232232    return MMSYSERR_INVALPARAM;
    233233}
     
    239239MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
    240240{
    241     PWINE_ACMDRIVERID   padid;
    242     PWINE_ACMDRIVER pad;
     241    PWINE_ACMDRIVERID   padid;
     242    PWINE_ACMDRIVER     pad;
    243243
    244244    TRACE("(%p, %x, %08lu)\n", phad, hadid, fdwOpen);
    245245
    246246    if (!phad)
    247     return MMSYSERR_INVALPARAM;
    248 
     247        return MMSYSERR_INVALPARAM;
     248   
    249249    if (fdwOpen)
    250     return MMSYSERR_INVALFLAG;
    251 
    252     padid = MSACM_GetDriverID(hadid);
     250        return MMSYSERR_INVALFLAG;
     251   
     252    padid = MSACM_GetDriverID(hadid); 
    253253    if (!padid)
    254     return MMSYSERR_INVALHANDLE;
    255 
     254        return MMSYSERR_INVALHANDLE;
     255   
    256256    pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER));
    257257    if (!pad) return MMSYSERR_NOMEM;
     
    259259    pad->obj.dwType = WINE_ACMOBJ_DRIVER;
    260260    pad->obj.pACMDriverID = padid;
    261 
     261   
    262262    if (!(pad->hDrvr = padid->hInstModule) && padid->pszDriverAlias)
    263     pad->hDrvr = OpenDriverA(padid->pszDriverAlias, NULL, 0);
     263        pad->hDrvr = OpenDriverA(padid->pszDriverAlias, NULL, 0);
    264264    if (!pad->hDrvr) {
    265     HeapFree(MSACM_hHeap, 0, pad);
    266     return MMSYSERR_ERROR;
     265        HeapFree(MSACM_hHeap, 0, pad);
     266        return MMSYSERR_ERROR;
    267267    }
    268268
     
    289289    HKEY hPriorityKey;
    290290    DWORD dwPriorityCounter;
    291 
     291   
    292292    padid = MSACM_GetDriverID(hadid);
    293293    if (!padid)
    294     return MMSYSERR_INVALHANDLE;
    295 
     294        return MMSYSERR_INVALHANDLE;
     295   
    296296    /* Check for unknown flags */
    297     if (fdwPriority &
    298     ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE|
    299       ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END))
    300     return MMSYSERR_INVALFLAG;
    301 
     297    if (fdwPriority & 
     298        ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE|
     299          ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END))
     300        return MMSYSERR_INVALFLAG;
     301   
    302302    /* Check for incompatible flags */
    303303    if ((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) &&
    304     (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE))
    305     return MMSYSERR_INVALFLAG;
    306 
     304        (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE))
     305        return MMSYSERR_INVALFLAG;
     306   
    307307    /* Check for incompatible flags */
    308308    if ((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) &&
    309     (fdwPriority & ACM_DRIVERPRIORITYF_END))
    310     return MMSYSERR_INVALFLAG;
    311 
    312     lError = RegOpenKeyA(HKEY_CURRENT_USER,
    313             "Software\\Microsoft\\Multimedia\\"
    314             "Audio Compression Manager\\Priority v4.00",
    315             &hPriorityKey
    316             );
     309        (fdwPriority & ACM_DRIVERPRIORITYF_END))
     310        return MMSYSERR_INVALFLAG;
     311   
     312    lError = RegOpenKeyA(HKEY_CURRENT_USER, 
     313                        "Software\\Microsoft\\Multimedia\\"
     314                        "Audio Compression Manager\\Priority v4.00",
     315                        &hPriorityKey
     316                        );
    317317    /* FIXME: Create key */
    318318    if (lError != ERROR_SUCCESS)
     319        return MMSYSERR_ERROR;
     320   
     321    for (dwPriorityCounter = 1; ; dwPriorityCounter++)  {
     322        snprintf(szSubKey, 17, "Priorty%ld", dwPriorityCounter);
     323        lError = RegQueryValueA(hPriorityKey, szSubKey, szBuffer, &lBufferLength);
     324        if (lError != ERROR_SUCCESS)
     325            break;
     326       
     327        FIXME("(0x%08x, %ld, %ld): stub (partial)\n",
     328              hadid, dwPriority, fdwPriority);
     329        break;
     330    }
     331   
     332    RegCloseKey(hPriorityKey);
     333   
    319334    return MMSYSERR_ERROR;
    320 
    321     for (dwPriorityCounter = 1; ; dwPriorityCounter++)  {
    322     snprintf(szSubKey, 17, "Priorty%ld", dwPriorityCounter);
    323     lError = RegQueryValueA(hPriorityKey, szSubKey, szBuffer, &lBufferLength);
    324     if (lError != ERROR_SUCCESS)
    325         break;
    326 
    327     FIXME("(0x%08x, %ld, %ld): stub (partial)\n",
    328           hadid, dwPriority, fdwPriority);
    329     break;
    330     }
    331 
    332     RegCloseKey(hPriorityKey);
    333 
    334     return MMSYSERR_ERROR;
    335335}
    336336
     
    341341{
    342342    PWINE_ACMDRIVERID padid;
    343 
     343   
    344344    padid = MSACM_GetDriverID(hadid);
    345345    if (!padid)
    346     return MMSYSERR_INVALHANDLE;
    347 
     346        return MMSYSERR_INVALHANDLE;
     347   
    348348    if (fdwRemove)
    349     return MMSYSERR_INVALFLAG;
    350 
     349        return MMSYSERR_INVALFLAG;
     350   
    351351    MSACM_UnregisterDriver(padid);
    352 
    353     return MMSYSERR_NOERROR;
    354 }
    355 
     352   
     353    return MMSYSERR_NOERROR;
     354}
     355
  • trunk/src/msacm32/filter.c

    r6648 r6712  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 /* $Id: filter.c,v 1.2 2001-09-05 13:11:25 bird Exp $ */
     2
    33/*
    44 *      MSACM32 library
     
    4242 *           acmFilterDetailsA (MSACM32.15)
    4343 */
    44 MMRESULT WINAPI acmFilterDetailsA(HACMDRIVER had, PACMFILTERDETAILSA pafd,
    45                   DWORD fdwDetails)
    46 {
    47     ACMFILTERDETAILSW   afdw;
    48     MMRESULT        mmr;
     44MMRESULT WINAPI acmFilterDetailsA(HACMDRIVER had, PACMFILTERDETAILSA pafd, 
     45                                  DWORD fdwDetails)
     46{
     47    ACMFILTERDETAILSW   afdw;
     48    MMRESULT            mmr;
    4949
    5050    memset(&afdw, 0, sizeof(afdw));
    5151    afdw.cbStruct = sizeof(afdw);
    5252    afdw.dwFilterIndex = pafd->dwFilterIndex;
    53     afdw.dwFilterTag = pafd->dwFilterTag;
     53    afdw.dwFilterTag = pafd->dwFilterTag; 
    5454    afdw.pwfltr = pafd->pwfltr;
    5555    afdw.cbwfltr = pafd->cbwfltr;
     
    5757    mmr = acmFilterDetailsW(had, &afdw, fdwDetails);
    5858    if (mmr == MMSYSERR_NOERROR) {
    59     pafd->dwFilterTag = afdw.dwFilterTag;
    60     pafd->fdwSupport = afdw.fdwSupport;
     59        pafd->dwFilterTag = afdw.dwFilterTag;
     60        pafd->fdwSupport = afdw.fdwSupport;
    6161        WideCharToMultiByte( CP_ACP, 0, afdw.szFilter, -1, pafd->szFilter,
    6262                             sizeof(pafd->szFilter), NULL, NULL );
     
    6868 *           acmFilterDetailsW (MSACM32.16)
    6969 */
    70 MMRESULT WINAPI acmFilterDetailsW(HACMDRIVER had, PACMFILTERDETAILSW pafd,
    71                   DWORD fdwDetails)
    72 {
    73     MMRESULT            mmr;
    74     ACMFILTERTAGDETAILSA    aftd;
     70MMRESULT WINAPI acmFilterDetailsW(HACMDRIVER had, PACMFILTERDETAILSW pafd, 
     71                                  DWORD fdwDetails)
     72{
     73    MMRESULT                    mmr;
     74    ACMFILTERTAGDETAILSA        aftd;
    7575
    7676    TRACE("(0x%08x, %p, %ld)\n", had, pafd, fdwDetails);
     
    8080
    8181    if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
    82 
     82       
    8383    switch (fdwDetails) {
    8484    case ACM_FILTERDETAILSF_FILTER:
    85     if (pafd->dwFilterTag != pafd->pwfltr->dwFilterTag) {
    86         mmr = MMSYSERR_INVALPARAM;
    87         break;
    88     }
    89     if (had == (HACMDRIVER)NULL) {
    90         PWINE_ACMDRIVERID       padid;
    91 
    92         mmr = ACMERR_NOTPOSSIBLE;
    93         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    94         /* should check for codec only */
    95         if (padid->bEnabled &&
    96             acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
    97             mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
    98                     (LPARAM)pafd, (LPARAM)fdwDetails);
    99             acmDriverClose(had, 0);
    100             if (mmr == MMSYSERR_NOERROR) break;
    101         }
    102         }
    103     } else {
    104         mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
    105                 (LPARAM)pafd, (LPARAM)fdwDetails);
    106     }
    107     break;
     85        if (pafd->dwFilterTag != pafd->pwfltr->dwFilterTag) {
     86            mmr = MMSYSERR_INVALPARAM;
     87            break;
     88        }
     89        if (had == (HACMDRIVER)NULL) {
     90            PWINE_ACMDRIVERID           padid;
     91
     92            mmr = ACMERR_NOTPOSSIBLE;
     93            for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     94                /* should check for codec only */
     95                if (padid->bEnabled &&
     96                    acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
     97                    mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
     98                                        (LPARAM)pafd, (LPARAM)fdwDetails);
     99                    acmDriverClose(had, 0);
     100                    if (mmr == MMSYSERR_NOERROR) break;
     101                }
     102            }               
     103        } else {
     104            mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
     105                                (LPARAM)pafd, (LPARAM)fdwDetails);
     106        }
     107        break;
    108108    case ACM_FILTERDETAILSF_INDEX:
    109     /* should check pafd->dwFilterIndex < aftd->cStandardFilters */
    110     mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
    111                 (LPARAM)pafd, (LPARAM)fdwDetails);
    112     break;
     109        /* should check pafd->dwFilterIndex < aftd->cStandardFilters */
     110        mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
     111                            (LPARAM)pafd, (LPARAM)fdwDetails);
     112        break;
    113113    default:
    114     WARN("Unknown fdwDetails %08lx\n", fdwDetails);
    115     mmr = MMSYSERR_INVALFLAG;
    116     break;
     114        WARN("Unknown fdwDetails %08lx\n", fdwDetails);
     115        mmr = MMSYSERR_INVALFLAG;
     116        break;
    117117    }
    118118
     
    122122
    123123struct MSACM_FilterEnumWtoA_Instance {
    124     PACMFILTERDETAILSA  pafda;
    125     DWORD       dwInstance;
    126     ACMFILTERENUMCBA    fnCallback;
     124    PACMFILTERDETAILSA  pafda;
     125    DWORD               dwInstance;
     126    ACMFILTERENUMCBA    fnCallback;
    127127};
    128128
    129129static BOOL CALLBACK MSACM_FilterEnumCallbackWtoA(HACMDRIVERID hadid,
    130                           PACMFILTERDETAILSW pafdw,
    131                           DWORD dwInstance,
    132                           DWORD fdwSupport)
     130                                                  PACMFILTERDETAILSW pafdw, 
     131                                                  DWORD dwInstance,             
     132                                                  DWORD fdwSupport)
    133133{
    134134    struct MSACM_FilterEnumWtoA_Instance* pafei;
     
    136136    pafei = (struct MSACM_FilterEnumWtoA_Instance*)dwInstance;
    137137
    138     pafei->pafda->dwFilterIndex = pafdw->dwFilterIndex;
    139     pafei->pafda->dwFilterTag = pafdw->dwFilterTag;
    140     pafei->pafda->fdwSupport = pafdw->fdwSupport;
     138    pafei->pafda->dwFilterIndex = pafdw->dwFilterIndex; 
     139    pafei->pafda->dwFilterTag = pafdw->dwFilterTag; 
     140    pafei->pafda->fdwSupport = pafdw->fdwSupport; 
    141141    WideCharToMultiByte( CP_ACP, 0, pafdw->szFilter, -1, pafei->pafda->szFilter,
    142142                         sizeof(pafei->pafda->szFilter), NULL, NULL );
    143143
    144     return (pafei->fnCallback)(hadid, pafei->pafda,
    145                    pafei->dwInstance, fdwSupport);
     144    return (pafei->fnCallback)(hadid, pafei->pafda, 
     145                               pafei->dwInstance, fdwSupport);
    146146}
    147147
     
    149149 *           acmFilterEnumA (MSACM32.17)
    150150 */
    151 MMRESULT WINAPI acmFilterEnumA(HACMDRIVER had, PACMFILTERDETAILSA pafda,
    152                    ACMFILTERENUMCBA fnCallback, DWORD dwInstance,
    153                    DWORD fdwEnum)
    154 {
    155     ACMFILTERDETAILSW       afdw;
     151MMRESULT WINAPI acmFilterEnumA(HACMDRIVER had, PACMFILTERDETAILSA pafda, 
     152                               ACMFILTERENUMCBA fnCallback, DWORD dwInstance,
     153                               DWORD fdwEnum)
     154{
     155    ACMFILTERDETAILSW           afdw;
    156156    struct MSACM_FilterEnumWtoA_Instance afei;
    157157
     
    167167    afei.fnCallback = fnCallback;
    168168
    169     return acmFilterEnumW(had, &afdw, MSACM_FilterEnumCallbackWtoA,
    170               (DWORD)&afei, fdwEnum);
    171 }
    172 
    173 static BOOL MSACM_FilterEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had,
    174                    PACMFILTERDETAILSW pafd,
    175                    ACMFILTERENUMCBW fnCallback, DWORD dwInstance,
    176                    DWORD fdwEnum)
    177 {
    178     ACMDRIVERDETAILSW       add;
    179     ACMFILTERTAGDETAILSW    aftd;
    180     int             i, j;
     169    return acmFilterEnumW(had, &afdw, MSACM_FilterEnumCallbackWtoA, 
     170                          (DWORD)&afei, fdwEnum);
     171}
     172
     173static BOOL MSACM_FilterEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, 
     174                                   PACMFILTERDETAILSW pafd,
     175                                   ACMFILTERENUMCBW fnCallback, DWORD dwInstance, 
     176                                   DWORD fdwEnum)
     177{
     178    ACMDRIVERDETAILSW           add;
     179    ACMFILTERTAGDETAILSW        aftd;
     180    int                         i, j;
    181181
    182182    add.cbStruct = sizeof(add);
    183 
     183   
    184184    if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) != MMSYSERR_NOERROR) return FALSE;
    185185
    186186    for (i = 0; i < add.cFilterTags; i++) {
    187     memset(&aftd, 0, sizeof(aftd));
    188     aftd.cbStruct = sizeof(aftd);
    189     aftd.dwFilterTagIndex = i;
    190     if (acmFilterTagDetailsW(had, &aftd, ACM_FILTERTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
    191         continue;
    192 
    193     if ((fdwEnum & ACM_FILTERENUMF_DWFILTERTAG) &&
    194         aftd.dwFilterTag != pafd->pwfltr->dwFilterTag)
    195         continue;
    196 
    197     for (j = 0; j < aftd.cStandardFilters; j++) {
    198         pafd->dwFilterIndex = j;
    199         pafd->dwFilterTag = aftd.dwFilterTag;
    200         if (acmFilterDetailsW(had, pafd, ACM_FILTERDETAILSF_INDEX) != MMSYSERR_NOERROR)
    201         continue;
    202 
    203         if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, add.fdwSupport))
    204         return FALSE;
    205     }
     187        memset(&aftd, 0, sizeof(aftd));
     188        aftd.cbStruct = sizeof(aftd);
     189        aftd.dwFilterTagIndex = i;
     190        if (acmFilterTagDetailsW(had, &aftd, ACM_FILTERTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
     191            continue;
     192       
     193        if ((fdwEnum & ACM_FILTERENUMF_DWFILTERTAG) &&
     194            aftd.dwFilterTag != pafd->pwfltr->dwFilterTag)
     195            continue;
     196       
     197        for (j = 0; j < aftd.cStandardFilters; j++) {
     198            pafd->dwFilterIndex = j;
     199            pafd->dwFilterTag = aftd.dwFilterTag;
     200            if (acmFilterDetailsW(had, pafd, ACM_FILTERDETAILSF_INDEX) != MMSYSERR_NOERROR)
     201                continue;
     202           
     203            if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, add.fdwSupport))
     204                return FALSE;
     205        }
    206206    }
    207207    return TRUE;
     
    211211 *           acmFilterEnumW (MSACM32.18)
    212212 */
    213 MMRESULT WINAPI acmFilterEnumW(HACMDRIVER had, PACMFILTERDETAILSW pafd,
    214                    ACMFILTERENUMCBW fnCallback, DWORD dwInstance,
    215                    DWORD fdwEnum)
    216 {
    217     PWINE_ACMDRIVERID       padid;
    218     BOOL            ret;
     213MMRESULT WINAPI acmFilterEnumW(HACMDRIVER had, PACMFILTERDETAILSW pafd, 
     214                               ACMFILTERENUMCBW fnCallback, DWORD dwInstance,
     215                               DWORD fdwEnum)
     216{
     217    PWINE_ACMDRIVERID           padid;
     218    BOOL                        ret;
    219219
    220220    TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
    221       had, pafd, fnCallback, dwInstance, fdwEnum);
     221          had, pafd, fnCallback, dwInstance, fdwEnum);
    222222
    223223    if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
    224224
    225225    if (fdwEnum & ~(ACM_FILTERENUMF_DWFILTERTAG))
    226     FIXME("Unsupported fdwEnum values\n");
     226        FIXME("Unsupported fdwEnum values\n");
    227227
    228228    if (had) {
    229     HACMDRIVERID    hadid;
    230 
    231     if (acmDriverID(had, &hadid, 0) != MMSYSERR_NOERROR)
    232         return MMSYSERR_INVALHANDLE;
    233     MSACM_FilterEnumHelper(MSACM_GetDriverID(hadid), had, pafd,
    234                    fnCallback, dwInstance, fdwEnum);
     229        HACMDRIVERID    hadid;
     230
     231        if (acmDriverID(had, &hadid, 0) != MMSYSERR_NOERROR)
     232            return MMSYSERR_INVALHANDLE;
     233        MSACM_FilterEnumHelper(MSACM_GetDriverID(hadid), had, pafd,
     234                               fnCallback, dwInstance, fdwEnum);
     235        return MMSYSERR_NOERROR;
     236    }
     237    for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     238            /* should check for codec only */
     239            if (!padid->bEnabled || acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
     240                continue;
     241            ret = MSACM_FilterEnumHelper(padid, had, pafd,
     242                                         fnCallback, dwInstance, fdwEnum);
     243            acmDriverClose(had, 0);
     244            if (!ret) break;
     245    }
    235246    return MMSYSERR_NOERROR;
    236     }
    237     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    238         /* should check for codec only */
    239         if (!padid->bEnabled || acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
    240         continue;
    241         ret = MSACM_FilterEnumHelper(padid, had, pafd,
    242                      fnCallback, dwInstance, fdwEnum);
    243         acmDriverClose(had, 0);
    244         if (!ret) break;
    245     }
    246     return MMSYSERR_NOERROR;
    247247}
    248248
     
    250250 *           acmFilterTagDetailsA (MSACM32.19)
    251251 */
    252 MMRESULT WINAPI acmFilterTagDetailsA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda,
    253                      DWORD fdwDetails)
    254 {
    255     ACMFILTERTAGDETAILSW    aftdw;
    256     MMRESULT            mmr;
     252MMRESULT WINAPI acmFilterTagDetailsA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda, 
     253                                     DWORD fdwDetails)
     254{
     255    ACMFILTERTAGDETAILSW        aftdw;
     256    MMRESULT                    mmr;
    257257
    258258    memset(&aftdw, 0, sizeof(aftdw));
     
    263263    mmr = acmFilterTagDetailsW(had, &aftdw, fdwDetails);
    264264    if (mmr == MMSYSERR_NOERROR) {
    265     paftda->dwFilterTag = aftdw.dwFilterTag;
    266     paftda->dwFilterTagIndex = aftdw.dwFilterTagIndex;
    267     paftda->cbFilterSize = aftdw.cbFilterSize;
    268     paftda->fdwSupport = aftdw.fdwSupport;
    269     paftda->cStandardFilters = aftdw.cStandardFilters;
     265        paftda->dwFilterTag = aftdw.dwFilterTag;
     266        paftda->dwFilterTagIndex = aftdw.dwFilterTagIndex;
     267        paftda->cbFilterSize = aftdw.cbFilterSize;
     268        paftda->fdwSupport = aftdw.fdwSupport;
     269        paftda->cStandardFilters = aftdw.cStandardFilters;
    270270        WideCharToMultiByte( CP_ACP, 0, aftdw.szFilterTag, -1, paftda->szFilterTag,
    271271                             sizeof(paftda->szFilterTag), NULL, NULL );
     
    277277 *           acmFilterTagDetailsW (MSACM32.20)
    278278 */
    279 MMRESULT WINAPI acmFilterTagDetailsW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd,
    280                      DWORD fdwDetails)
    281 {
    282     PWINE_ACMDRIVERID   padid;
    283     MMRESULT        mmr;
     279MMRESULT WINAPI acmFilterTagDetailsW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, 
     280                                     DWORD fdwDetails)
     281{
     282    PWINE_ACMDRIVERID   padid;
     283    MMRESULT            mmr;
    284284
    285285    TRACE("(0x%08x, %p, %ld)\n", had, paftd, fdwDetails);
    286286
    287287    if (fdwDetails & ~(ACM_FILTERTAGDETAILSF_FILTERTAG|ACM_FILTERTAGDETAILSF_INDEX|
    288                ACM_FILTERTAGDETAILSF_LARGESTSIZE))
    289     return MMSYSERR_INVALFLAG;
     288                       ACM_FILTERTAGDETAILSF_LARGESTSIZE))
     289        return MMSYSERR_INVALFLAG;
    290290
    291291    switch (fdwDetails) {
    292292    case ACM_FILTERTAGDETAILSF_FILTERTAG:
    293     if (had == (HACMDRIVER)NULL) {
    294         mmr = ACMERR_NOTPOSSIBLE;
    295         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    296         /* should check for codec only */
    297         if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
    298             mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
    299                     (LPARAM)paftd, (LPARAM)fdwDetails);
    300             acmDriverClose(had, 0);
    301             if (mmr == MMSYSERR_NOERROR) break;
    302         }
    303         }
    304     } else {
    305         mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
    306                 (LPARAM)paftd, (LPARAM)fdwDetails);
    307     }
    308     break;
     293        if (had == (HACMDRIVER)NULL) {
     294            mmr = ACMERR_NOTPOSSIBLE;
     295            for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     296                /* should check for codec only */
     297                if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
     298                    mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
     299                                        (LPARAM)paftd, (LPARAM)fdwDetails);
     300                    acmDriverClose(had, 0);
     301                    if (mmr == MMSYSERR_NOERROR) break;
     302                }
     303            }
     304        } else {
     305            mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
     306                                (LPARAM)paftd, (LPARAM)fdwDetails);
     307        }
     308        break;
    309309
    310310    case ACM_FILTERTAGDETAILSF_INDEX:
    311     /* FIXME should check paftd->dwFilterTagIndex < add.cFilterTags */
    312     mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
    313                 (LPARAM)paftd, (LPARAM)fdwDetails);
    314     break;
     311        /* FIXME should check paftd->dwFilterTagIndex < add.cFilterTags */
     312        mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
     313                            (LPARAM)paftd, (LPARAM)fdwDetails);
     314        break;
    315315
    316316    case ACM_FILTERTAGDETAILSF_LARGESTSIZE:
    317     if (had == (HACMDRIVER)NULL) {
    318         ACMFILTERTAGDETAILSW    tmp;
    319         DWORD           ft = paftd->dwFilterTag;
    320 
    321         mmr = ACMERR_NOTPOSSIBLE;
    322         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    323         /* should check for codec only */
    324         if (padid->bEnabled &&
    325             acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
    326 
    327             memset(&tmp, 0, sizeof(tmp));
    328             tmp.cbStruct = sizeof(tmp);
    329             tmp.dwFilterTag = ft;
    330 
    331             if (MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
    332                       (LPARAM)&tmp,
    333                       (LPARAM)fdwDetails) == MMSYSERR_NOERROR) {
    334             if (mmr == ACMERR_NOTPOSSIBLE ||
    335                 paftd->cbFilterSize < tmp.cbFilterSize) {
    336                 *paftd = tmp;
    337                 mmr = MMSYSERR_NOERROR;
    338             }
    339             }
    340             acmDriverClose(had, 0);
    341         }
    342         }
    343     } else {
    344         mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
    345                 (LPARAM)paftd, (LPARAM)fdwDetails);
    346     }
    347     break;
     317        if (had == (HACMDRIVER)NULL) {
     318            ACMFILTERTAGDETAILSW        tmp;
     319            DWORD                       ft = paftd->dwFilterTag;
     320
     321            mmr = ACMERR_NOTPOSSIBLE;
     322            for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     323                /* should check for codec only */
     324                if (padid->bEnabled &&
     325                    acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
     326
     327                    memset(&tmp, 0, sizeof(tmp));
     328                    tmp.cbStruct = sizeof(tmp);
     329                    tmp.dwFilterTag = ft;
     330
     331                    if (MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
     332                                      (LPARAM)&tmp,
     333                                      (LPARAM)fdwDetails) == MMSYSERR_NOERROR) {
     334                        if (mmr == ACMERR_NOTPOSSIBLE ||
     335                            paftd->cbFilterSize < tmp.cbFilterSize) {
     336                            *paftd = tmp;
     337                            mmr = MMSYSERR_NOERROR;
     338                        }
     339                    }
     340                    acmDriverClose(had, 0);
     341                }
     342            }
     343        } else {
     344            mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
     345                                (LPARAM)paftd, (LPARAM)fdwDetails);
     346        }
     347        break;
    348348
    349349    default:
    350     WARN("Unsupported fdwDetails=%08lx\n", fdwDetails);
    351     mmr = MMSYSERR_ERROR;
    352     }
    353 
    354     if (mmr == MMSYSERR_NOERROR &&
    355     paftd->dwFilterTag == WAVE_FORMAT_PCM && paftd->szFilterTag[0] == 0)
     350        WARN("Unsupported fdwDetails=%08lx\n", fdwDetails);
     351        mmr = MMSYSERR_ERROR;
     352    }
     353
     354    if (mmr == MMSYSERR_NOERROR && 
     355        paftd->dwFilterTag == WAVE_FORMAT_PCM && paftd->szFilterTag[0] == 0)
    356356        MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFilterTag,
    357357                             sizeof(paftd->szFilterTag)/sizeof(WCHAR) );
     
    361361
    362362struct MSACM_FilterTagEnumWtoA_Instance {
    363     PACMFILTERTAGDETAILSA   paftda;
    364     DWORD           dwInstance;
    365     ACMFILTERTAGENUMCBA     fnCallback;
     363    PACMFILTERTAGDETAILSA       paftda;
     364    DWORD                       dwInstance;
     365    ACMFILTERTAGENUMCBA         fnCallback;
    366366};
    367367
    368368static BOOL CALLBACK MSACM_FilterTagEnumCallbackWtoA(HACMDRIVERID hadid,
    369                              PACMFILTERTAGDETAILSW paftdw,
    370                              DWORD dwInstance,
    371                              DWORD fdwSupport)
     369                                                     PACMFILTERTAGDETAILSW paftdw, 
     370                                                     DWORD dwInstance,             
     371                                                     DWORD fdwSupport)
    372372{
    373373    struct MSACM_FilterTagEnumWtoA_Instance* paftei;
     
    375375    paftei = (struct MSACM_FilterTagEnumWtoA_Instance*)dwInstance;
    376376
    377     paftei->paftda->dwFilterTagIndex = paftdw->dwFilterTagIndex;
    378     paftei->paftda->dwFilterTag = paftdw->dwFilterTag;
    379     paftei->paftda->cbFilterSize = paftdw->cbFilterSize;
    380     paftei->paftda->fdwSupport = paftdw->fdwSupport;
    381     paftei->paftda->cStandardFilters = paftdw->cStandardFilters;
     377    paftei->paftda->dwFilterTagIndex = paftdw->dwFilterTagIndex; 
     378    paftei->paftda->dwFilterTag = paftdw->dwFilterTag; 
     379    paftei->paftda->cbFilterSize = paftdw->cbFilterSize; 
     380    paftei->paftda->fdwSupport = paftdw->fdwSupport; 
     381    paftei->paftda->cStandardFilters = paftdw->cStandardFilters; 
    382382    WideCharToMultiByte( CP_ACP, 0, paftdw->szFilterTag, -1, paftei->paftda->szFilterTag,
    383383                         sizeof(paftei->paftda->szFilterTag), NULL, NULL );
    384384
    385     return (paftei->fnCallback)(hadid, paftei->paftda,
    386                 paftei->dwInstance, fdwSupport);
     385    return (paftei->fnCallback)(hadid, paftei->paftda, 
     386                                paftei->dwInstance, fdwSupport);
    387387}
    388388
     
    391391 */
    392392MMRESULT WINAPI acmFilterTagEnumA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda,
    393                   ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance,
    394                   DWORD fdwEnum)
    395 {
    396     ACMFILTERTAGDETAILSW    aftdw;
     393                                  ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance,
     394                                  DWORD fdwEnum)
     395{
     396    ACMFILTERTAGDETAILSW        aftdw;
    397397    struct MSACM_FilterTagEnumWtoA_Instance aftei;
    398398
     
    406406    aftei.fnCallback = fnCallback;
    407407
    408     return acmFilterTagEnumW(had, &aftdw, MSACM_FilterTagEnumCallbackWtoA,
    409                  (DWORD)&aftei, fdwEnum);
     408    return acmFilterTagEnumW(had, &aftdw, MSACM_FilterTagEnumCallbackWtoA, 
     409                             (DWORD)&aftei, fdwEnum);
    410410}
    411411
     
    414414 */
    415415MMRESULT WINAPI acmFilterTagEnumW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd,
    416                   ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance,
    417                   DWORD fdwEnum)
    418 {
    419     PWINE_ACMDRIVERID       padid;
    420     ACMDRIVERDETAILSW       add;
    421     int             i;
     416                                  ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance,
     417                                  DWORD fdwEnum)
     418{
     419    PWINE_ACMDRIVERID           padid;
     420    ACMDRIVERDETAILSW           add;
     421    int                         i;
    422422
    423423    TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
    424       had, paftd, fnCallback, dwInstance, fdwEnum);
     424          had, paftd, fnCallback, dwInstance, fdwEnum);
    425425
    426426    if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM;
    427427
    428428    if (had) FIXME("had != NULL, not supported\n");
    429 
     429   
    430430    for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    431     /* should check for codec only */
    432     if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
    433         add.cbStruct = sizeof(add);
    434 
    435         if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) == MMSYSERR_NOERROR) {
    436         for (i = 0; i < add.cFilterTags; i++) {
    437             paftd->dwFilterTagIndex = i;
    438             if (acmFilterTagDetailsW(had, paftd, ACM_FILTERTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
    439             if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance,
    440                       add.fdwSupport)) {
    441                 padid = NULL;
    442                 break;
    443             }
    444             }
    445         }
    446         }
    447     }
    448     acmDriverClose(had, 0);
     431        /* should check for codec only */
     432        if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
     433            add.cbStruct = sizeof(add);
     434
     435            if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) == MMSYSERR_NOERROR) {
     436                for (i = 0; i < add.cFilterTags; i++) {
     437                    paftd->dwFilterTagIndex = i;
     438                    if (acmFilterTagDetailsW(had, paftd, ACM_FILTERTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
     439                        if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance,
     440                                          add.fdwSupport)) {
     441                            padid = NULL;
     442                            break;
     443                        }
     444                    }
     445                }
     446            }
     447        }
     448        acmDriverClose(had, 0);
    449449    }
    450450    return MMSYSERR_NOERROR;
  • trunk/src/msacm32/format.c

    r6648 r6712  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 /* $Id: format.c,v 1.2 2001-09-05 13:11:25 bird Exp $ */
     2
    33/*
    44 *      MSACM32 library
    55 *
    66 *      Copyright 1998  Patrik Stridvall
    7  *        2000  Eric Pouech
     7 *                2000  Eric Pouech
    88 */
    99
     
    2424DEFAULT_DEBUG_CHANNEL(msacm);
    2525
    26 static  PACMFORMATCHOOSEA   afc;
     26static  PACMFORMATCHOOSEA       afc;
    2727
    2828struct MSACM_FillFormatData {
    29     HWND        hWnd;
    30 #define WINE_ACMFF_TAG      0
    31 #define WINE_ACMFF_FORMAT   1
    32 #define WINE_ACMFF_WFX      2
    33     int         mode;
    34     char        szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
    35     PACMFORMATCHOOSEA   afc;
    36     DWORD       ret;
     29    HWND                hWnd;
     30#define WINE_ACMFF_TAG          0
     31#define WINE_ACMFF_FORMAT       1
     32#define WINE_ACMFF_WFX          2
     33    int                 mode;
     34    char                szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
     35    PACMFORMATCHOOSEA   afc;
     36    DWORD               ret;
    3737};
    3838
    39 static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid,
    40                         PACMFORMATTAGDETAILSA paftd,
    41                         DWORD dwInstance, DWORD fdwSupport)
    42 {
    43     struct MSACM_FillFormatData*    affd = (struct MSACM_FillFormatData*)dwInstance;
     39static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid, 
     40                                            PACMFORMATTAGDETAILSA paftd,
     41                                            DWORD dwInstance, DWORD fdwSupport)
     42{
     43    struct MSACM_FillFormatData*        affd = (struct MSACM_FillFormatData*)dwInstance;
    4444
    4545    switch (affd->mode) {
    4646    case WINE_ACMFF_TAG:
    47     if (SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
    48                 CB_FINDSTRINGEXACT,
    49                 (WPARAM)-1, (LPARAM)paftd->szFormatTag) == CB_ERR)
    50         SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
    51                 CB_ADDSTRING, 0, (DWORD)paftd->szFormatTag);
    52     break;
     47        if (SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
     48                                CB_FINDSTRINGEXACT,
     49                                (WPARAM)-1, (LPARAM)paftd->szFormatTag) == CB_ERR)
     50            SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
     51                                CB_ADDSTRING, 0, (DWORD)paftd->szFormatTag);
     52        break;
    5353    case WINE_ACMFF_FORMAT:
    54     if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) {
    55         HACMDRIVER      had;
    56 
    57         if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
    58         ACMFORMATDETAILSA   afd;
    59         int         i, idx;
    60         MMRESULT        mmr;
    61         char            buffer[64];
    62 
    63         afd.cbStruct = sizeof(afd);
    64         afd.dwFormatTag = paftd->dwFormatTag;
    65         afd.pwfx = HeapAlloc(GetProcessHeap(), 0, paftd->cbFormatSize);
    66         afd.pwfx->wFormatTag = paftd->dwFormatTag;
    67         afd.pwfx->cbSize = paftd->cbFormatSize;
    68         afd.cbwfx = paftd->cbFormatSize;
    69 
    70         for (i = 0; i < paftd->cStandardFormats; i++) {
    71             afd.dwFormatIndex = i;
    72             mmr = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX);
    73             if (mmr == MMSYSERR_NOERROR) {
    74             strcpy(buffer, afd.szFormat);
    75             for (idx = strlen(buffer);
    76                  idx < ACMFORMATTAGDETAILS_FORMATTAG_CHARS; idx++)
    77                 buffer[idx] = ' ';
    78             wsprintfA(buffer + ACMFORMATTAGDETAILS_FORMATTAG_CHARS,
    79                   "%d Ko/s",
    80                   (afd.pwfx->nAvgBytesPerSec + 512) / 1024);
    81             SendDlgItemMessageA(affd->hWnd,
    82                         IDD_ACMFORMATCHOOSE_CMB_FORMAT,
    83                         CB_ADDSTRING, 0, (DWORD)buffer);
    84             }
    85         }
    86         acmDriverClose(had, 0);
    87         SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT,
    88                     CB_SETCURSEL, 0, 0);
    89         }
    90     }
    91     break;
     54        if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) {
     55            HACMDRIVER          had;
     56
     57            if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
     58                ACMFORMATDETAILSA       afd;
     59                int                     i, idx;
     60                MMRESULT                mmr;
     61                char                    buffer[64];
     62
     63                afd.cbStruct = sizeof(afd);
     64                afd.dwFormatTag = paftd->dwFormatTag;
     65                afd.pwfx = HeapAlloc(GetProcessHeap(), 0, paftd->cbFormatSize);
     66                afd.pwfx->wFormatTag = paftd->dwFormatTag;
     67                afd.pwfx->cbSize = paftd->cbFormatSize;
     68                afd.cbwfx = paftd->cbFormatSize;
     69
     70                for (i = 0; i < paftd->cStandardFormats; i++) {
     71                    afd.dwFormatIndex = i;
     72                    mmr = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX);
     73                    if (mmr == MMSYSERR_NOERROR) {
     74                        strcpy(buffer, afd.szFormat);
     75                        for (idx = strlen(buffer);
     76                             idx < ACMFORMATTAGDETAILS_FORMATTAG_CHARS; idx++)
     77                            buffer[idx] = ' ';
     78                        wsprintfA(buffer + ACMFORMATTAGDETAILS_FORMATTAG_CHARS,
     79                                  "%d Ko/s",
     80                                  (afd.pwfx->nAvgBytesPerSec + 512) / 1024);
     81                        SendDlgItemMessageA(affd->hWnd,
     82                                            IDD_ACMFORMATCHOOSE_CMB_FORMAT,
     83                                            CB_ADDSTRING, 0, (DWORD)buffer);
     84                    }
     85                }
     86                acmDriverClose(had, 0);
     87                SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT,
     88                                    CB_SETCURSEL, 0, 0);
     89            }
     90        }
     91        break;
    9292    case WINE_ACMFF_WFX:
    93     if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) {
    94         HACMDRIVER      had;
    95 
    96         if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
    97         ACMFORMATDETAILSA   afd;
    98 
    99         afd.cbStruct = sizeof(afd);
    100         afd.dwFormatTag = paftd->dwFormatTag;
    101         afd.pwfx = affd->afc->pwfx;
    102         afd.cbwfx = affd->afc->cbwfx;
    103 
    104         afd.dwFormatIndex = SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_GETCURSEL, 0, 0);;
    105         affd->ret = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX);
    106         acmDriverClose(had, 0);
    107         return TRUE;
    108         }
    109     }
    110     break;
     93        if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) {
     94            HACMDRIVER          had;
     95
     96            if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
     97                ACMFORMATDETAILSA       afd;
     98
     99                afd.cbStruct = sizeof(afd);
     100                afd.dwFormatTag = paftd->dwFormatTag;
     101                afd.pwfx = affd->afc->pwfx;
     102                afd.cbwfx = affd->afc->cbwfx;
     103
     104                afd.dwFormatIndex = SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_GETCURSEL, 0, 0);;
     105                affd->ret = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX);
     106                acmDriverClose(had, 0);
     107                return TRUE;
     108            }
     109        }
     110        break;
    111111    default:
    112     FIXME("Unknown mode (%d)\n", affd->mode);
    113     break;
     112        FIXME("Unknown mode (%d)\n", affd->mode);
     113        break;
    114114    }
    115115    return TRUE;
     
    118118static BOOL MSACM_FillFormatTags(HWND hWnd)
    119119{
    120     ACMFORMATTAGDETAILSA    aftd;
    121     struct MSACM_FillFormatData affd;
     120    ACMFORMATTAGDETAILSA        aftd;
     121    struct MSACM_FillFormatData affd;
    122122
    123123    memset(&aftd, 0, sizeof(aftd));
     
    134134static BOOL MSACM_FillFormat(HWND hWnd)
    135135{
    136     ACMFORMATTAGDETAILSA    aftd;
    137     struct MSACM_FillFormatData affd;
     136    ACMFORMATTAGDETAILSA        aftd;
     137    struct MSACM_FillFormatData affd;
    138138
    139139    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_RESETCONTENT, 0, 0);
     
    144144    affd.hWnd = hWnd;
    145145    affd.mode = WINE_ACMFF_FORMAT;
    146     SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
    147             CB_GETLBTEXT,
    148             SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
    149                         CB_GETCURSEL, 0, 0),
    150             (DWORD)affd.szFormatTag);
    151 
     146    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 
     147                        CB_GETLBTEXT,
     148                        SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
     149                                            CB_GETCURSEL, 0, 0),
     150                        (DWORD)affd.szFormatTag);
     151   
    152152    acmFormatTagEnumA((HACMDRIVER)0, &aftd, MSACM_FillFormatTagsCB, (DWORD)&affd, 0);
    153153    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_SETCURSEL, 0, 0);
     
    157157static MMRESULT MSACM_GetWFX(HWND hWnd, PACMFORMATCHOOSEA afc)
    158158{
    159     ACMFORMATTAGDETAILSA    aftd;
    160     struct MSACM_FillFormatData affd;
     159    ACMFORMATTAGDETAILSA        aftd;
     160    struct MSACM_FillFormatData affd;
    161161
    162162    memset(&aftd, 0, sizeof(aftd));
     
    172172}
    173173
    174 static BOOL WINAPI FormatChooseDlgProc(HWND hWnd, UINT msg,
    175                        WPARAM wParam, LPARAM lParam)
    176 {
    177 
     174static BOOL WINAPI FormatChooseDlgProc(HWND hWnd, UINT msg, 
     175                                       WPARAM wParam, LPARAM lParam)
     176{
     177   
    178178    TRACE("hwnd=%i msg=%i 0x%08x 0x%08lx\n", hWnd,  msg, wParam, lParam );
    179 
     179   
    180180    switch (msg) {
    181181    case WM_INITDIALOG:
    182     afc = (PACMFORMATCHOOSEA)lParam;
    183     MSACM_FillFormatTags(hWnd);
    184     MSACM_FillFormat(hWnd);
    185     if ((afc->fdwStyle & ~(ACMFORMATCHOOSE_STYLEF_CONTEXTHELP|
    186                    ACMFORMATCHOOSE_STYLEF_SHOWHELP)) != 0)
    187         FIXME("Unsupported style %08lx\n", ((PACMFORMATCHOOSEA)lParam)->fdwStyle);
    188     if (!(afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_SHOWHELP))
    189         ShowWindow(GetDlgItem(hWnd, IDD_ACMFORMATCHOOSE_BTN_HELP), SW_HIDE);
    190     return TRUE;
    191 
     182        afc = (PACMFORMATCHOOSEA)lParam;
     183        MSACM_FillFormatTags(hWnd);
     184        MSACM_FillFormat(hWnd);
     185        if ((afc->fdwStyle & ~(ACMFORMATCHOOSE_STYLEF_CONTEXTHELP|
     186                               ACMFORMATCHOOSE_STYLEF_SHOWHELP)) != 0)
     187            FIXME("Unsupported style %08lx\n", ((PACMFORMATCHOOSEA)lParam)->fdwStyle);
     188        if (!(afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_SHOWHELP))
     189            ShowWindow(GetDlgItem(hWnd, IDD_ACMFORMATCHOOSE_BTN_HELP), SW_HIDE);
     190        return TRUE;
     191       
    192192    case WM_COMMAND:
    193     switch (LOWORD(wParam)) {
    194     case IDOK:
    195         EndDialog(hWnd, MSACM_GetWFX(hWnd, afc));
    196         return TRUE;
    197     case IDCANCEL:
    198         EndDialog(hWnd, ACMERR_CANCELED);
    199         return TRUE;
    200     case IDD_ACMFORMATCHOOSE_CMB_FORMATTAG:
    201         switch (HIWORD(wParam)) {
    202         case CBN_SELCHANGE:
    203         MSACM_FillFormat(hWnd);
    204         break;
    205         default:
    206         TRACE("Dropped dlgNotif (fmtTag): 0x%08x 0x%08lx\n",
    207               HIWORD(wParam), lParam);
    208         break;
    209         }
    210         break;
    211     case IDD_ACMFORMATCHOOSE_BTN_HELP:
    212         if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_SHOWHELP)
    213         SendMessageA(afc->hwndOwner,
    214                  RegisterWindowMessageA(ACMHELPMSGSTRINGA), 0L, 0L);
    215         break;
    216 
    217     default:
    218         TRACE("Dropped dlgCmd: ctl=%d ntf=0x%04x 0x%08lx\n",
    219           LOWORD(wParam), HIWORD(wParam), lParam);
    220         break;
    221     }
    222     break;
     193        switch (LOWORD(wParam)) {
     194        case IDOK:
     195            EndDialog(hWnd, MSACM_GetWFX(hWnd, afc));
     196            return TRUE;
     197        case IDCANCEL:
     198            EndDialog(hWnd, ACMERR_CANCELED);
     199            return TRUE;
     200        case IDD_ACMFORMATCHOOSE_CMB_FORMATTAG:
     201            switch (HIWORD(wParam)) {
     202            case CBN_SELCHANGE:
     203                MSACM_FillFormat(hWnd);
     204                break;
     205            default:
     206                TRACE("Dropped dlgNotif (fmtTag): 0x%08x 0x%08lx\n",
     207                      HIWORD(wParam), lParam);
     208                break;
     209            }
     210            break;
     211        case IDD_ACMFORMATCHOOSE_BTN_HELP:
     212            if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_SHOWHELP)
     213                SendMessageA(afc->hwndOwner,
     214                             RegisterWindowMessageA(ACMHELPMSGSTRINGA), 0L, 0L);
     215            break;
     216           
     217        default:
     218            TRACE("Dropped dlgCmd: ctl=%d ntf=0x%04x 0x%08lx\n",
     219                  LOWORD(wParam), HIWORD(wParam), lParam);
     220            break;
     221        }
     222        break;
    223223    case WM_CONTEXTMENU:
    224     if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP)
    225         SendMessageA(afc->hwndOwner,
    226              RegisterWindowMessageA(ACMHELPMSGCONTEXTMENUA),
    227             wParam, lParam);
    228     break;
     224        if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP)
     225            SendMessageA(afc->hwndOwner,
     226                         RegisterWindowMessageA(ACMHELPMSGCONTEXTMENUA),
     227                        wParam, lParam);
     228        break;
    229229#if defined(WM_CONTEXTHELP)
    230230    case WM_CONTEXTHELP:
    231     if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP)
    232         SendMessageA(afc->hwndOwner,
    233              RegisterWindowMessageA(ACMHELPMSGCONTEXTHELPA),
    234             wParam, lParam);
    235     break;
    236 #endif
     231        if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP)
     232            SendMessageA(afc->hwndOwner,
     233                         RegisterWindowMessageA(ACMHELPMSGCONTEXTHELPA),
     234                        wParam, lParam);
     235        break;
     236#endif       
    237237    default:
    238     TRACE("Dropped dlgMsg: hwnd=%i msg=%i 0x%08x 0x%08lx\n",
    239           hWnd,  msg, wParam, lParam );
    240     break;
     238        TRACE("Dropped dlgMsg: hwnd=%i msg=%i 0x%08x 0x%08lx\n",
     239              hWnd,  msg, wParam, lParam );
     240        break;
    241241    }
    242242    return FALSE;
     
    249249{
    250250    return DialogBoxParamA(MSACM_hInstance32, MAKEINTRESOURCEA(DLG_ACMFORMATCHOOSE_ID),
    251                pafmtc->hwndOwner, FormatChooseDlgProc, (INT)pafmtc);
     251                           pafmtc->hwndOwner, FormatChooseDlgProc, (INT)pafmtc);
    252252}
    253253
     
    265265 *           acmFormatDetailsA (MSACM32.25)
    266266 */
    267 MMRESULT WINAPI acmFormatDetailsA(HACMDRIVER had, PACMFORMATDETAILSA pafd,
    268                   DWORD fdwDetails)
    269 {
    270     ACMFORMATDETAILSW   afdw;
    271     MMRESULT        mmr;
     267MMRESULT WINAPI acmFormatDetailsA(HACMDRIVER had, PACMFORMATDETAILSA pafd, 
     268                                  DWORD fdwDetails)
     269{
     270    ACMFORMATDETAILSW   afdw;
     271    MMRESULT            mmr;
    272272
    273273    memset(&afdw, 0, sizeof(afdw));
    274274    afdw.cbStruct = sizeof(afdw);
    275275    afdw.dwFormatIndex = pafd->dwFormatIndex;
    276     afdw.dwFormatTag = pafd->dwFormatTag;
    277     afdw.pwfx = pafd->pwfx;
    278     afdw.cbwfx = pafd->cbwfx;
     276    afdw.dwFormatTag = pafd->dwFormatTag; 
     277    afdw.pwfx = pafd->pwfx; 
     278    afdw.cbwfx = pafd->cbwfx; 
    279279
    280280    mmr = acmFormatDetailsW(had, &afdw, fdwDetails);
    281281    if (mmr == MMSYSERR_NOERROR) {
    282     pafd->dwFormatTag = afdw.dwFormatTag;
    283     pafd->fdwSupport = afdw.fdwSupport;
     282        pafd->dwFormatTag = afdw.dwFormatTag;
     283        pafd->fdwSupport = afdw.fdwSupport;
    284284        WideCharToMultiByte( CP_ACP, 0, afdw.szFormat, -1,
    285285                             pafd->szFormat, sizeof(pafd->szFormat), NULL, NULL );
     
    291291 *           acmFormatDetailsW (MSACM32.26)
    292292 */
    293 MMRESULT WINAPI acmFormatDetailsW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
    294                   DWORD fdwDetails)
    295 {
    296     MMRESULT            mmr;
    297     static WCHAR        fmt1[] = {'%','d',' ','H','z',0};
    298     static WCHAR        fmt2[] = {';',' ','%','d',' ','b','i','t','s',0};
    299     ACMFORMATTAGDETAILSA    aftd;
     293MMRESULT WINAPI acmFormatDetailsW(HACMDRIVER had, PACMFORMATDETAILSW pafd, 
     294                                  DWORD fdwDetails)
     295{
     296    MMRESULT                    mmr;
     297    static WCHAR                fmt1[] = {'%','d',' ','H','z',0};
     298    static WCHAR                fmt2[] = {';',' ','%','d',' ','b','i','t','s',0};
     299    ACMFORMATTAGDETAILSA        aftd;
    300300
    301301    TRACE("(0x%08x, %p, %ld)\n", had, pafd, fdwDetails);
     
    305305
    306306    if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
    307 
     307       
    308308    switch (fdwDetails) {
    309309    case ACM_FORMATDETAILSF_FORMAT:
    310     if (pafd->dwFormatTag != pafd->pwfx->wFormatTag) {
    311         mmr = MMSYSERR_INVALPARAM;
    312         break;
    313     }
    314     if (had == (HACMDRIVER)NULL) {
    315         PWINE_ACMDRIVERID       padid;
    316 
    317         mmr = ACMERR_NOTPOSSIBLE;
    318         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    319         /* should check for codec only */
    320         if (padid->bEnabled &&
    321             acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
    322             mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS,
    323                     (LPARAM)pafd, (LPARAM)fdwDetails);
    324             acmDriverClose(had, 0);
    325             if (mmr == MMSYSERR_NOERROR) break;
    326         }
    327         }
    328     } else {
    329         mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS,
    330                 (LPARAM)pafd, (LPARAM)fdwDetails);
    331     }
    332     break;
     310        if (pafd->dwFormatTag != pafd->pwfx->wFormatTag) {
     311            mmr = MMSYSERR_INVALPARAM;
     312            break;
     313        }
     314        if (had == (HACMDRIVER)NULL) {
     315            PWINE_ACMDRIVERID           padid;
     316
     317            mmr = ACMERR_NOTPOSSIBLE;
     318            for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     319                /* should check for codec only */
     320                if (padid->bEnabled &&
     321                    acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
     322                    mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS,
     323                                        (LPARAM)pafd, (LPARAM)fdwDetails);
     324                    acmDriverClose(had, 0);
     325                    if (mmr == MMSYSERR_NOERROR) break;
     326                }
     327            }               
     328        } else {
     329            mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS,
     330                                (LPARAM)pafd, (LPARAM)fdwDetails);
     331        }
     332        break;
    333333    case ACM_FORMATDETAILSF_INDEX:
    334     /* should check pafd->dwFormatIndex < aftd->cStandardFormats */
    335     mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS,
    336                 (LPARAM)pafd, (LPARAM)fdwDetails);
    337     break;
     334        /* should check pafd->dwFormatIndex < aftd->cStandardFormats */
     335        mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS,
     336                            (LPARAM)pafd, (LPARAM)fdwDetails);
     337        break;
    338338    default:
    339     WARN("Unknown fdwDetails %08lx\n", fdwDetails);
    340     mmr = MMSYSERR_INVALFLAG;
    341     break;
     339        WARN("Unknown fdwDetails %08lx\n", fdwDetails);
     340        mmr = MMSYSERR_INVALFLAG;
     341        break;
    342342    }
    343343
    344344    if (mmr == MMSYSERR_NOERROR && pafd->szFormat[0] == (WCHAR)0) {
    345     wsprintfW(pafd->szFormat, fmt1, pafd->pwfx->nSamplesPerSec);
    346     if (pafd->pwfx->wBitsPerSample) {
    347         wsprintfW(pafd->szFormat + lstrlenW(pafd->szFormat), fmt2,
    348               pafd->pwfx->wBitsPerSample);
    349     }
     345        wsprintfW(pafd->szFormat, fmt1, pafd->pwfx->nSamplesPerSec);
     346        if (pafd->pwfx->wBitsPerSample) {
     347            wsprintfW(pafd->szFormat + lstrlenW(pafd->szFormat), fmt2,
     348                      pafd->pwfx->wBitsPerSample);
     349        }
    350350        MultiByteToWideChar( CP_ACP, 0, (pafd->pwfx->nChannels == 1) ? "; Mono" : "; Stereo", -1,
    351351                             pafd->szFormat + strlenW(pafd->szFormat),
     
    358358
    359359struct MSACM_FormatEnumWtoA_Instance {
    360     PACMFORMATDETAILSA  pafda;
    361     DWORD       dwInstance;
    362     ACMFORMATENUMCBA    fnCallback;
     360    PACMFORMATDETAILSA  pafda;
     361    DWORD               dwInstance;
     362    ACMFORMATENUMCBA    fnCallback;
    363363};
    364364
    365365static BOOL CALLBACK MSACM_FormatEnumCallbackWtoA(HACMDRIVERID hadid,
    366                           PACMFORMATDETAILSW pafdw,
    367                           DWORD dwInstance,
    368                           DWORD fdwSupport)
     366                                                  PACMFORMATDETAILSW pafdw, 
     367                                                  DWORD dwInstance,             
     368                                                  DWORD fdwSupport)
    369369{
    370370    struct MSACM_FormatEnumWtoA_Instance* pafei;
     
    372372    pafei = (struct MSACM_FormatEnumWtoA_Instance*)dwInstance;
    373373
    374     pafei->pafda->dwFormatIndex = pafdw->dwFormatIndex;
    375     pafei->pafda->dwFormatTag = pafdw->dwFormatTag;
    376     pafei->pafda->fdwSupport = pafdw->fdwSupport;
     374    pafei->pafda->dwFormatIndex = pafdw->dwFormatIndex; 
     375    pafei->pafda->dwFormatTag = pafdw->dwFormatTag; 
     376    pafei->pafda->fdwSupport = pafdw->fdwSupport; 
    377377    WideCharToMultiByte( CP_ACP, 0, pafdw->szFormat, -1,
    378378                         pafei->pafda->szFormat, sizeof(pafei->pafda->szFormat), NULL, NULL );
    379379
    380     return (pafei->fnCallback)(hadid, pafei->pafda,
    381                    pafei->dwInstance, fdwSupport);
     380    return (pafei->fnCallback)(hadid, pafei->pafda, 
     381                               pafei->dwInstance, fdwSupport);
    382382}
    383383
     
    386386 */
    387387MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda,
    388                    ACMFORMATENUMCBA fnCallback, DWORD dwInstance,
    389                    DWORD fdwEnum)
    390 {
    391     ACMFORMATDETAILSW       afdw;
     388                               ACMFORMATENUMCBA fnCallback, DWORD dwInstance,
     389                               DWORD fdwEnum)
     390{
     391    ACMFORMATDETAILSW           afdw;
    392392    struct MSACM_FormatEnumWtoA_Instance afei;
    393393
     
    403403    afei.fnCallback = fnCallback;
    404404
    405     return acmFormatEnumW(had, &afdw, MSACM_FormatEnumCallbackWtoA,
    406               (DWORD)&afei, fdwEnum);
     405    return acmFormatEnumW(had, &afdw, MSACM_FormatEnumCallbackWtoA, 
     406                          (DWORD)&afei, fdwEnum);
    407407}
    408408
     
    410410 *           acmFormatEnumW (MSACM32.28)
    411411 */
    412 static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had,
    413                    PACMFORMATDETAILSW pafd, PWAVEFORMATEX pwfxRef,
    414                    ACMFORMATENUMCBW fnCallback, DWORD dwInstance,
    415                    DWORD fdwEnum)
    416 {
    417     ACMDRIVERDETAILSW       add;
    418     ACMFORMATTAGDETAILSW    aftd;
    419     int             i, j;
     412static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, 
     413                                   PACMFORMATDETAILSW pafd, PWAVEFORMATEX pwfxRef,
     414                                   ACMFORMATENUMCBW fnCallback, DWORD dwInstance, 
     415                                   DWORD fdwEnum)
     416{
     417    ACMDRIVERDETAILSW           add;
     418    ACMFORMATTAGDETAILSW        aftd;
     419    int                         i, j;
    420420
    421421    add.cbStruct = sizeof(add);
    422 
     422   
    423423    if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) != MMSYSERR_NOERROR) return FALSE;
    424424
    425425    for (i = 0; i < add.cFormatTags; i++) {
    426     memset(&aftd, 0, sizeof(aftd));
    427     aftd.cbStruct = sizeof(aftd);
    428     aftd.dwFormatTagIndex = i;
    429     if (acmFormatTagDetailsW(had, &aftd, ACM_FORMATTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
    430         continue;
    431 
    432     if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) && aftd.dwFormatTag != pwfxRef->wFormatTag)
    433         continue;
    434 
    435     for (j = 0; j < aftd.cStandardFormats; j++) {
    436         pafd->dwFormatIndex = j;
    437         pafd->dwFormatTag = aftd.dwFormatTag;
    438         if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_INDEX) != MMSYSERR_NOERROR)
    439         continue;
    440 
    441         if ((fdwEnum & ACM_FORMATENUMF_NCHANNELS) &&
    442         pafd->pwfx->nChannels != pwfxRef->nChannels)
    443         continue;
    444         if ((fdwEnum & ACM_FORMATENUMF_NSAMPLESPERSEC) &&
    445         pafd->pwfx->nSamplesPerSec != pwfxRef->nSamplesPerSec)
    446         continue;
    447         if ((fdwEnum & ACM_FORMATENUMF_WBITSPERSAMPLE) &&
    448         pafd->pwfx->wBitsPerSample != pwfxRef->wBitsPerSample)
    449         continue;
    450         if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) &&
    451         !(pafd->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_HARDWARE))
    452         continue;
    453 
    454         /* more checks to be done on fdwEnum */
    455 
    456         if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, add.fdwSupport))
    457         return FALSE;
    458     }
    459     /* the "formats" used by the filters are also reported */
     426        memset(&aftd, 0, sizeof(aftd));
     427        aftd.cbStruct = sizeof(aftd);
     428        aftd.dwFormatTagIndex = i;
     429        if (acmFormatTagDetailsW(had, &aftd, ACM_FORMATTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
     430            continue;
     431       
     432        if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) && aftd.dwFormatTag != pwfxRef->wFormatTag)
     433            continue;
     434       
     435        for (j = 0; j < aftd.cStandardFormats; j++) {
     436            pafd->dwFormatIndex = j;
     437            pafd->dwFormatTag = aftd.dwFormatTag;
     438            if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_INDEX) != MMSYSERR_NOERROR)
     439                continue;
     440           
     441            if ((fdwEnum & ACM_FORMATENUMF_NCHANNELS) &&
     442                pafd->pwfx->nChannels != pwfxRef->nChannels)
     443                continue;
     444            if ((fdwEnum & ACM_FORMATENUMF_NSAMPLESPERSEC) &&
     445                pafd->pwfx->nSamplesPerSec != pwfxRef->nSamplesPerSec)
     446                continue;
     447            if ((fdwEnum & ACM_FORMATENUMF_WBITSPERSAMPLE) &&
     448                pafd->pwfx->wBitsPerSample != pwfxRef->wBitsPerSample)
     449                continue;
     450            if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) &&
     451                !(pafd->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_HARDWARE))
     452                continue;
     453           
     454            /* more checks to be done on fdwEnum */
     455
     456            if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, add.fdwSupport))
     457                return FALSE;
     458        }
     459        /* the "formats" used by the filters are also reported */
    460460    }
    461461    return TRUE;
     
    465465
    466466MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
    467                    ACMFORMATENUMCBW fnCallback, DWORD dwInstance,
    468                    DWORD fdwEnum)
    469 {
    470     PWINE_ACMDRIVERID       padid;
    471     WAVEFORMATEX        wfxRef;
    472     BOOL            ret;
     467                               ACMFORMATENUMCBW fnCallback, DWORD dwInstance, 
     468                               DWORD fdwEnum)
     469{
     470    PWINE_ACMDRIVERID           padid;
     471    WAVEFORMATEX                wfxRef;
     472    BOOL                        ret;
    473473
    474474    TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
    475       had, pafd, fnCallback, dwInstance, fdwEnum);
     475          had, pafd, fnCallback, dwInstance, fdwEnum);
    476476
    477477    if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
    478478
    479479    if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS|
    480            ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE|
    481            ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST))
     480                   ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE|
     481                   ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST))
    482482        wfxRef = *pafd->pwfx;
    483483
    484     if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) &&
    485     !(fdwEnum & (ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT)))
    486     return MMSYSERR_INVALPARAM;
     484    if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) && 
     485        !(fdwEnum & (ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT)))
     486        return MMSYSERR_INVALPARAM;
    487487
    488488    if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) &&
    489     (pafd->dwFormatTag != pafd->pwfx->wFormatTag))
    490     return MMSYSERR_INVALPARAM;
     489        (pafd->dwFormatTag != pafd->pwfx->wFormatTag))
     490        return MMSYSERR_INVALPARAM;
    491491
    492492    if (fdwEnum & (ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST|
    493            ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT))
    494     FIXME("Unsupported fdwEnum values %08lx\n", fdwEnum);
     493                   ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT))
     494        FIXME("Unsupported fdwEnum values %08lx\n", fdwEnum);
    495495
    496496    if (had) {
    497     HACMDRIVERID    hadid;
    498 
    499     if (acmDriverID(had, &hadid, 0) != MMSYSERR_NOERROR)
    500         return MMSYSERR_INVALHANDLE;
    501     MSACM_FormatEnumHelper(MSACM_GetDriverID(hadid), had, pafd, &wfxRef,
    502                    fnCallback, dwInstance, fdwEnum);
     497        HACMDRIVERID    hadid;
     498
     499        if (acmDriverID(had, &hadid, 0) != MMSYSERR_NOERROR)
     500            return MMSYSERR_INVALHANDLE;
     501        MSACM_FormatEnumHelper(MSACM_GetDriverID(hadid), had, pafd, &wfxRef,
     502                               fnCallback, dwInstance, fdwEnum);
     503        return MMSYSERR_NOERROR;
     504    }
     505    for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     506            /* should check for codec only */
     507            if (!padid->bEnabled || acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
     508                continue;
     509            ret = MSACM_FormatEnumHelper(padid, had, pafd, &wfxRef,
     510                                         fnCallback, dwInstance, fdwEnum);
     511            acmDriverClose(had, 0);
     512            if (!ret) break;
     513    }
    503514    return MMSYSERR_NOERROR;
    504     }
    505     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    506         /* should check for codec only */
    507         if (!padid->bEnabled || acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
    508         continue;
    509         ret = MSACM_FormatEnumHelper(padid, had, pafd, &wfxRef,
    510                      fnCallback, dwInstance, fdwEnum);
    511         acmDriverClose(had, 0);
    512         if (!ret) break;
    513     }
    514     return MMSYSERR_NOERROR;
    515515}
    516516
     
    518518 *           acmFormatSuggest (MSACM32.29)
    519519 */
    520 MMRESULT WINAPI acmFormatSuggest(HACMDRIVER had, PWAVEFORMATEX pwfxSrc,
    521                 PWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest)
    522 {
    523     ACMDRVFORMATSUGGEST adfg;
    524     MMRESULT        mmr;
    525 
    526     TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
    527       had, pwfxSrc, pwfxDst, cbwfxDst, fdwSuggest);
     520MMRESULT WINAPI acmFormatSuggest(HACMDRIVER had, PWAVEFORMATEX pwfxSrc, 
     521                                PWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest)
     522{
     523    ACMDRVFORMATSUGGEST adfg;
     524    MMRESULT            mmr;
     525
     526    TRACE("(0x%08x, %p, %p, %ld, %ld)\n", 
     527          had, pwfxSrc, pwfxDst, cbwfxDst, fdwSuggest);
    528528
    529529    if (fdwSuggest & ~(ACM_FORMATSUGGESTF_NCHANNELS|ACM_FORMATSUGGESTF_NSAMPLESPERSEC|
    530                ACM_FORMATSUGGESTF_WBITSPERSAMPLE|ACM_FORMATSUGGESTF_WFORMATTAG))
    531     return MMSYSERR_INVALFLAG;
     530                       ACM_FORMATSUGGESTF_WBITSPERSAMPLE|ACM_FORMATSUGGESTF_WFORMATTAG))
     531        return MMSYSERR_INVALFLAG;
    532532
    533533    adfg.cbStruct = sizeof(adfg);
     
    535535    adfg.pwfxSrc = pwfxSrc;
    536536    adfg.cbwfxSrc = (pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) ?
    537     sizeof(WAVEFORMATEX) : pwfxSrc->cbSize;
     537        sizeof(WAVEFORMATEX) : pwfxSrc->cbSize;
    538538    adfg.pwfxDst = pwfxDst;
    539539    adfg.cbwfxDst = cbwfxDst;
    540540
    541541    if (had == (HACMDRIVER)NULL) {
    542     PWINE_ACMDRIVERID   padid;
    543 
    544     /* MS doc says: ACM finds the best suggestion.
    545     * Well, first found will be the "best"
    546     */
    547     mmr = ACMERR_NOTPOSSIBLE;
    548     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    549         /* should check for codec only */
    550         if (!padid->bEnabled ||
    551         acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
    552         continue;
    553 
    554         if (MSACM_Message(had, ACMDM_FORMAT_SUGGEST,
    555                   (LPARAM)&adfg, 0L) == MMSYSERR_NOERROR) {
    556         mmr = MMSYSERR_NOERROR;
    557         break;
    558         }
    559         acmDriverClose(had, 0);
    560     }
     542        PWINE_ACMDRIVERID       padid;
     543       
     544        /* MS doc says: ACM finds the best suggestion.
     545        * Well, first found will be the "best"
     546        */
     547        mmr = ACMERR_NOTPOSSIBLE;
     548        for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     549            /* should check for codec only */
     550            if (!padid->bEnabled ||
     551                acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
     552                continue;
     553           
     554            if (MSACM_Message(had, ACMDM_FORMAT_SUGGEST,
     555                              (LPARAM)&adfg, 0L) == MMSYSERR_NOERROR) {
     556                mmr = MMSYSERR_NOERROR;
     557                break;
     558            }
     559            acmDriverClose(had, 0);
     560        }
    561561    } else {
    562     mmr = MSACM_Message(had, ACMDM_FORMAT_SUGGEST, (LPARAM)&adfg, 0L);
     562        mmr = MSACM_Message(had, ACMDM_FORMAT_SUGGEST, (LPARAM)&adfg, 0L);
    563563    }
    564564    return mmr;
     
    568568 *           acmFormatTagDetailsA (MSACM32.30)
    569569 */
    570 MMRESULT WINAPI acmFormatTagDetailsA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda,
    571                      DWORD fdwDetails)
    572 {
    573     ACMFORMATTAGDETAILSW    aftdw;
    574     MMRESULT            mmr;
     570MMRESULT WINAPI acmFormatTagDetailsA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda, 
     571                                     DWORD fdwDetails)
     572{
     573    ACMFORMATTAGDETAILSW        aftdw;
     574    MMRESULT                    mmr;
    575575
    576576    memset(&aftdw, 0, sizeof(aftdw));
     
    581581    mmr = acmFormatTagDetailsW(had, &aftdw, fdwDetails);
    582582    if (mmr == MMSYSERR_NOERROR) {
    583     paftda->dwFormatTag = aftdw.dwFormatTag;
    584     paftda->dwFormatTagIndex = aftdw.dwFormatTagIndex;
    585     paftda->cbFormatSize = aftdw.cbFormatSize;
    586     paftda->fdwSupport = aftdw.fdwSupport;
    587     paftda->cStandardFormats = aftdw.cStandardFormats;
     583        paftda->dwFormatTag = aftdw.dwFormatTag;
     584        paftda->dwFormatTagIndex = aftdw.dwFormatTagIndex;
     585        paftda->cbFormatSize = aftdw.cbFormatSize;
     586        paftda->fdwSupport = aftdw.fdwSupport;
     587        paftda->cStandardFormats = aftdw.cStandardFormats;
    588588        WideCharToMultiByte( CP_ACP, 0, aftdw.szFormatTag, -1, paftda->szFormatTag,
    589589                             sizeof(paftda->szFormatTag), NULL, NULL );
     
    595595 *           acmFormatTagDetailsW (MSACM32.31)
    596596 */
    597 MMRESULT WINAPI acmFormatTagDetailsW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd,
    598                      DWORD fdwDetails)
    599 {
    600     PWINE_ACMDRIVERID   padid;
    601     MMRESULT        mmr;
     597MMRESULT WINAPI acmFormatTagDetailsW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, 
     598                                     DWORD fdwDetails)
     599{
     600    PWINE_ACMDRIVERID   padid;
     601    MMRESULT            mmr;
    602602
    603603    TRACE("(0x%08x, %p, %ld)\n", had, paftd, fdwDetails);
    604604
    605605    if (fdwDetails & ~(ACM_FORMATTAGDETAILSF_FORMATTAG|ACM_FORMATTAGDETAILSF_INDEX|
    606                ACM_FORMATTAGDETAILSF_LARGESTSIZE))
    607     return MMSYSERR_INVALFLAG;
     606                       ACM_FORMATTAGDETAILSF_LARGESTSIZE))
     607        return MMSYSERR_INVALFLAG;
    608608
    609609    switch (fdwDetails) {
    610610    case ACM_FORMATTAGDETAILSF_FORMATTAG:
    611     if (had == (HACMDRIVER)NULL) {
    612         mmr = ACMERR_NOTPOSSIBLE;
    613         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    614         /* should check for codec only */
    615         if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
    616             mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
    617                     (LPARAM)paftd, (LPARAM)fdwDetails);
    618             acmDriverClose(had, 0);
    619             if (mmr == MMSYSERR_NOERROR) break;
    620         }
    621         }
    622     } else {
    623         mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
    624                 (LPARAM)paftd, (LPARAM)fdwDetails);
    625     }
    626     break;
     611        if (had == (HACMDRIVER)NULL) {
     612            mmr = ACMERR_NOTPOSSIBLE;
     613            for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     614                /* should check for codec only */
     615                if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
     616                    mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
     617                                        (LPARAM)paftd, (LPARAM)fdwDetails);
     618                    acmDriverClose(had, 0);
     619                    if (mmr == MMSYSERR_NOERROR) break;
     620                }
     621            }
     622        } else {
     623            mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
     624                                (LPARAM)paftd, (LPARAM)fdwDetails);
     625        }
     626        break;
    627627
    628628    case ACM_FORMATTAGDETAILSF_INDEX:
    629     /* FIXME should check paftd->dwFormatTagIndex < add.cFormatTags */
    630     mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
    631                 (LPARAM)paftd, (LPARAM)fdwDetails);
    632     break;
     629        /* FIXME should check paftd->dwFormatTagIndex < add.cFormatTags */
     630        mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
     631                            (LPARAM)paftd, (LPARAM)fdwDetails);
     632        break;
    633633
    634634    case ACM_FORMATTAGDETAILSF_LARGESTSIZE:
    635     if (had == (HACMDRIVER)NULL) {
    636         ACMFORMATTAGDETAILSW    tmp;
    637         DWORD           ft = paftd->dwFormatTag;
    638 
    639         mmr = ACMERR_NOTPOSSIBLE;
    640         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    641         /* should check for codec only */
    642         if (padid->bEnabled &&
    643             acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
    644 
    645             memset(&tmp, 0, sizeof(tmp));
    646             tmp.cbStruct = sizeof(tmp);
    647             tmp.dwFormatTag = ft;
    648 
    649             if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
    650                       (LPARAM)&tmp,
    651                       (LPARAM)fdwDetails) == MMSYSERR_NOERROR) {
    652             if (mmr == ACMERR_NOTPOSSIBLE ||
    653                 paftd->cbFormatSize < tmp.cbFormatSize) {
    654                 *paftd = tmp;
    655                 mmr = MMSYSERR_NOERROR;
    656             }
    657             }
    658             acmDriverClose(had, 0);
    659         }
    660         }
    661     } else {
    662         mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
    663                 (LPARAM)paftd, (LPARAM)fdwDetails);
    664     }
    665     break;
     635        if (had == (HACMDRIVER)NULL) {
     636            ACMFORMATTAGDETAILSW        tmp;
     637            DWORD                       ft = paftd->dwFormatTag;
     638
     639            mmr = ACMERR_NOTPOSSIBLE;
     640            for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
     641                /* should check for codec only */
     642                if (padid->bEnabled &&
     643                    acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
     644
     645                    memset(&tmp, 0, sizeof(tmp));
     646                    tmp.cbStruct = sizeof(tmp);
     647                    tmp.dwFormatTag = ft;
     648
     649                    if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
     650                                      (LPARAM)&tmp,
     651                                      (LPARAM)fdwDetails) == MMSYSERR_NOERROR) {
     652                        if (mmr == ACMERR_NOTPOSSIBLE ||
     653                            paftd->cbFormatSize < tmp.cbFormatSize) {
     654                            *paftd = tmp;
     655                            mmr = MMSYSERR_NOERROR;
     656                        }
     657                    }
     658                    acmDriverClose(had, 0);
     659                }
     660            }
     661        } else {
     662            mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
     663                                (LPARAM)paftd, (LPARAM)fdwDetails);
     664        }
     665        break;
    666666
    667667    default:
    668     WARN("Unsupported fdwDetails=%08lx\n", fdwDetails);
    669     mmr = MMSYSERR_ERROR;
    670     }
    671 
    672     if (mmr == MMSYSERR_NOERROR &&
    673     paftd->dwFormatTag == WAVE_FORMAT_PCM && paftd->szFormatTag[0] == 0)
     668        WARN("Unsupported fdwDetails=%08lx\n", fdwDetails);
     669        mmr = MMSYSERR_ERROR;
     670    }
     671
     672    if (mmr == MMSYSERR_NOERROR && 
     673        paftd->dwFormatTag == WAVE_FORMAT_PCM && paftd->szFormatTag[0] == 0)
    674674        MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag,
    675675                             sizeof(paftd->szFormatTag)/sizeof(WCHAR) );
     
    679679
    680680struct MSACM_FormatTagEnumWtoA_Instance {
    681     PACMFORMATTAGDETAILSA   paftda;
    682     DWORD           dwInstance;
    683     ACMFORMATTAGENUMCBA     fnCallback;
     681    PACMFORMATTAGDETAILSA       paftda;
     682    DWORD                       dwInstance;
     683    ACMFORMATTAGENUMCBA         fnCallback;
    684684};
    685685
    686686static BOOL CALLBACK MSACM_FormatTagEnumCallbackWtoA(HACMDRIVERID hadid,
    687                              PACMFORMATTAGDETAILSW paftdw,
    688                              DWORD dwInstance,
    689                              DWORD fdwSupport)
     687                                                     PACMFORMATTAGDETAILSW paftdw, 
     688                                                     DWORD dwInstance,             
     689                                                     DWORD fdwSupport)
    690690{
    691691    struct MSACM_FormatTagEnumWtoA_Instance* paftei;
     
    693693    paftei = (struct MSACM_FormatTagEnumWtoA_Instance*)dwInstance;
    694694
    695     paftei->paftda->dwFormatTagIndex = paftdw->dwFormatTagIndex;
    696     paftei->paftda->dwFormatTag = paftdw->dwFormatTag;
    697     paftei->paftda->cbFormatSize = paftdw->cbFormatSize;
    698     paftei->paftda->fdwSupport = paftdw->fdwSupport;
    699     paftei->paftda->cStandardFormats = paftdw->cStandardFormats;
     695    paftei->paftda->dwFormatTagIndex = paftdw->dwFormatTagIndex; 
     696    paftei->paftda->dwFormatTag = paftdw->dwFormatTag; 
     697    paftei->paftda->cbFormatSize = paftdw->cbFormatSize; 
     698    paftei->paftda->fdwSupport = paftdw->fdwSupport; 
     699    paftei->paftda->cStandardFormats = paftdw->cStandardFormats; 
    700700    WideCharToMultiByte( CP_ACP, 0, paftdw->szFormatTag, -1, paftei->paftda->szFormatTag,
    701701                         sizeof(paftei->paftda->szFormatTag), NULL, NULL );
    702702
    703     return (paftei->fnCallback)(hadid, paftei->paftda,
    704                 paftei->dwInstance, fdwSupport);
     703    return (paftei->fnCallback)(hadid, paftei->paftda, 
     704                                paftei->dwInstance, fdwSupport);
    705705}
    706706
     
    709709 */
    710710MMRESULT WINAPI acmFormatTagEnumA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda,
    711                   ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance,
    712                   DWORD fdwEnum)
    713 {
    714     ACMFORMATTAGDETAILSW    aftdw;
     711                                  ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance,
     712                                  DWORD fdwEnum)
     713{
     714    ACMFORMATTAGDETAILSW        aftdw;
    715715    struct MSACM_FormatTagEnumWtoA_Instance aftei;
    716716
     
    724724    aftei.fnCallback = fnCallback;
    725725
    726     return acmFormatTagEnumW(had, &aftdw, MSACM_FormatTagEnumCallbackWtoA,
    727                  (DWORD)&aftei, fdwEnum);
     726    return acmFormatTagEnumW(had, &aftdw, MSACM_FormatTagEnumCallbackWtoA, 
     727                             (DWORD)&aftei, fdwEnum);
    728728}
    729729
     
    732732 */
    733733MMRESULT WINAPI acmFormatTagEnumW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd,
    734                   ACMFORMATTAGENUMCBW fnCallback, DWORD dwInstance,
    735                   DWORD fdwEnum)
    736 {
    737     PWINE_ACMDRIVERID       padid;
    738     ACMDRIVERDETAILSW       add;
    739     int             i;
    740     BOOL            bPcmDone = FALSE;
     734                                  ACMFORMATTAGENUMCBW fnCallback, DWORD dwInstance,
     735                                  DWORD fdwEnum)
     736{
     737    PWINE_ACMDRIVERID           padid;
     738    ACMDRIVERDETAILSW           add;
     739    int                         i;
     740    BOOL                        bPcmDone = FALSE;
    741741
    742742    TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
    743       had, paftd, fnCallback, dwInstance, fdwEnum);
     743          had, paftd, fnCallback, dwInstance, fdwEnum);
    744744
    745745    if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM;
    746746
    747747    if (had) FIXME("had != NULL, not supported\n");
    748 
     748   
    749749    for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
    750     /* should check for codec only */
    751     if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
    752         add.cbStruct = sizeof(add);
    753 
    754         if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) == MMSYSERR_NOERROR) {
    755         for (i = 0; i < add.cFormatTags; i++) {
    756             paftd->dwFormatTagIndex = i;
    757             if (acmFormatTagDetailsW(had, paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
    758             if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
    759                 /* FIXME (EPP): I'm not sure this is the correct
    760                  * algorithm (should make more sense to apply the same
    761                  * for all already loaded formats, but this will do
    762                  * for now
    763                  */
    764                 if (bPcmDone) continue;
    765                 bPcmDone = TRUE;
    766             }
    767             if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance,
    768                       add.fdwSupport)) {
    769                 padid = NULL;
    770                 break;
    771             }
    772             }
    773         }
    774         }
    775     }
    776     acmDriverClose(had, 0);
     750        /* should check for codec only */
     751        if (padid->bEnabled && acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
     752            add.cbStruct = sizeof(add);
     753
     754            if (acmDriverDetailsW((HACMDRIVERID)padid, &add, 0) == MMSYSERR_NOERROR) {
     755                for (i = 0; i < add.cFormatTags; i++) {
     756                    paftd->dwFormatTagIndex = i;
     757                    if (acmFormatTagDetailsW(had, paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
     758                        if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
     759                            /* FIXME (EPP): I'm not sure this is the correct
     760                             * algorithm (should make more sense to apply the same
     761                             * for all already loaded formats, but this will do
     762                             * for now
     763                             */
     764                            if (bPcmDone) continue;
     765                            bPcmDone = TRUE;
     766                        }
     767                        if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance,
     768                                          add.fdwSupport)) {
     769                            padid = NULL;
     770                            break;
     771                        }
     772                    }
     773                }
     774            }
     775        }
     776        acmDriverClose(had, 0);
    777777    }
    778778    return MMSYSERR_NOERROR;
  • trunk/src/msacm32/initterm.cpp

    r6648 r6712  
    1 /* $Id: initterm.cpp,v 1.7 2001-09-05 13:11:25 bird Exp $
    2  *
     1/*
    32 * DLL entry point
    43 *
     
    5453   case DLL_THREAD_ATTACH:
    5554   case DLL_THREAD_DETACH:
    56     return MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
     55        return MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
    5756
    5857   case DLL_PROCESS_DETACH:
    59     MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
    60     ctordtorTerm();
    61     return TRUE;
     58        MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
     59        ctordtorTerm();
     60        return TRUE;
    6261   }
    6362   return FALSE;
     
    8988         CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed  98-03-18 05:28:48*/
    9089
    91     dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
    92          if(dllHandle == 0)
    93         return 0UL;
     90        dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
     91         if(dllHandle == 0) 
     92                return 0UL;
    9493
    9594         break;
    9695      case 1 :
    9796         if(dllHandle) {
    98         UnregisterLxDll(dllHandle);
     97                UnregisterLxDll(dllHandle);
    9998         }
    10099         break;
  • trunk/src/msacm32/internal.c

    r6648 r6712  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 /* $Id: internal.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
     2
    33/*
    44 *      MSACM32 library
    55 *
    66 *      Copyright 1998  Patrik Stridvall
    7  *        1999  Eric Pouech
     7 *                1999  Eric Pouech
    88 */
    99
     
    3434
    3535/***********************************************************************
    36  *           MSACM_RegisterDriver()
     36 *           MSACM_RegisterDriver() 
    3737 */
    3838PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName,
    39                        HINSTANCE hinstModule)
    40 {
     39                                       HINSTANCE hinstModule)
     40{ 
    4141    PWINE_ACMDRIVERID padid;
    4242
     
    6464    padid->pPrevACMDriverID = MSACM_pLastACMDriverID;
    6565    if (MSACM_pLastACMDriverID)
    66     MSACM_pLastACMDriverID->pNextACMDriverID = padid;
     66        MSACM_pLastACMDriverID->pNextACMDriverID = padid;
    6767    MSACM_pLastACMDriverID = padid;
    6868    if (!MSACM_pFirstACMDriverID)
    69     MSACM_pFirstACMDriverID = padid;
    70 
     69        MSACM_pFirstACMDriverID = padid;
     70   
    7171    return padid;
    7272}
    7373
    7474/***********************************************************************
    75  *           MSACM_RegisterAllDrivers()
     75 *           MSACM_RegisterAllDrivers() 
    7676 */
    7777void MSACM_RegisterAllDrivers(void)
     
    8080    DWORD dwBufferLength;
    8181
    82     /* FIXME
     82    /* FIXME 
    8383     *  What if the user edits system.ini while the program is running?
    8484     *  Does Windows handle that?
    8585     */
    8686    if (MSACM_pFirstACMDriverID)
    87     return;
    88 
     87        return;
     88   
    8989    /* FIXME: Do not work! How do I determine the section length? */
    9090    dwBufferLength = 1024;
    91 /* EPP  GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini"); */
    92 
     91/* EPP  GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini"); */
     92   
    9393    pszBuffer = (LPSTR) HeapAlloc(MSACM_hHeap, 0, dwBufferLength);
    9494    if (GetPrivateProfileSectionA("drivers32", pszBuffer, dwBufferLength, "system.ini")) {
    95     char* s = pszBuffer;
    96     while (*s) {
    97         if (!strncasecmp("MSACM.", s, 6)) {
    98         char *s2 = s;
    99         while (*s2 != '\0' && *s2 != '=') s2++;
    100         if (*s2) {
    101             *s2 = '\0';
    102             MSACM_RegisterDriver(s, s2 + 1, 0);
    103             *s2 = '=';
    104         }
    105         }
    106         s += strlen(s) + 1; /* Either next char or \0 */
     95        char* s = pszBuffer;
     96        while (*s) {
     97            if (!strncasecmp("MSACM.", s, 6)) {
     98                char *s2 = s;
     99                while (*s2 != '\0' && *s2 != '=') s2++;
     100                if (*s2) {
     101                    *s2 = '\0';
     102                    MSACM_RegisterDriver(s, s2 + 1, 0);
     103                    *s2 = '=';
     104                }
     105            } 
     106            s += strlen(s) + 1; /* Either next char or \0 */
     107        }
    107108    }
    108     }
    109 
     109   
    110110    HeapFree(MSACM_hHeap, 0, pszBuffer);
    111111
     
    119119{
    120120    PWINE_ACMDRIVERID pNextACMDriverID;
    121 
     121   
    122122    while (p->pACMDriverList)
    123     acmDriverClose((HACMDRIVER) p->pACMDriverList, 0);
    124 
     123        acmDriverClose((HACMDRIVER) p->pACMDriverList, 0);
     124   
    125125    if (p->pszDriverAlias)
    126     HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);
     126        HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);
    127127    if (p->pszFileName)
    128     HeapFree(MSACM_hHeap, 0, p->pszFileName);
    129 
     128        HeapFree(MSACM_hHeap, 0, p->pszFileName);
     129   
    130130    if (p == MSACM_pFirstACMDriverID)
    131     MSACM_pFirstACMDriverID = p->pNextACMDriverID;
     131        MSACM_pFirstACMDriverID = p->pNextACMDriverID;
    132132    if (p == MSACM_pLastACMDriverID)
    133     MSACM_pLastACMDriverID = p->pPrevACMDriverID;
     133        MSACM_pLastACMDriverID = p->pPrevACMDriverID;
    134134
    135135    if (p->pPrevACMDriverID)
    136     p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
     136        p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
    137137    if (p->pNextACMDriverID)
    138     p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID;
    139 
     138        p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID;
     139   
    140140    pNextACMDriverID = p->pNextACMDriverID;
    141 
     141   
    142142    HeapFree(MSACM_hHeap, 0, p);
    143 
     143   
    144144    return pNextACMDriverID;
    145145}
     
    162162PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj, DWORD type)
    163163{
    164     PWINE_ACMOBJ    pao = (PWINE_ACMOBJ)hObj;
     164    PWINE_ACMOBJ        pao = (PWINE_ACMOBJ)hObj;
    165165
    166166    if (pao == NULL || IsBadReadPtr(pao, sizeof(WINE_ACMOBJ)) ||
    167     ((type != WINE_ACMOBJ_DONTCARE) && (type != pao->dwType)))
    168     return NULL;
     167        ((type != WINE_ACMOBJ_DONTCARE) && (type != pao->dwType)))
     168        return NULL;
    169169    return pao;
    170170}
    171171
    172172/***********************************************************************
    173  *           MSACM_GetDriverID()
     173 *           MSACM_GetDriverID() 
    174174 */
    175175PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID)
     
    191191MMRESULT MSACM_Message(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
    192192{
    193     PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
     193    PWINE_ACMDRIVER     pad = MSACM_GetDriver(had);
    194194
    195195    return pad ? SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2) : MMSYSERR_INVALHANDLE;
  • trunk/src/msacm32/msacm32_main.c

    r6648 r6712  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 /* $Id: msacm32_main.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
     2
    33/*
    44 *      MSACM32 library
    55 *
    66 *      Copyright 1998  Patrik Stridvall
    7  *        1999  Eric Pouech
     7 *                1999  Eric Pouech
    88 */
    99
     
    1717
    1818DEFAULT_DEBUG_CHANNEL(msacm);
    19 
     19       
    2020/**********************************************************************/
    21 
    22 HINSTANCE   MSACM_hInstance32 = 0;
     21       
     22HINSTANCE       MSACM_hInstance32 = 0;
    2323
    2424/***********************************************************************
    25  *           MSACM_LibMain (MSACM32.init)
     25 *           MSACM_LibMain (MSACM32.init) 
    2626 */
    2727BOOL WINAPI MSACM32_LibMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
     
    3434        MSACM_hInstance32 = hInstDLL;
    3535        MSACM_RegisterAllDrivers();
    36     break;
     36        break;
    3737    case DLL_PROCESS_DETACH:
    3838        MSACM_UnregisterAllDrivers();
     
    4040        MSACM_hHeap = (HANDLE) NULL;
    4141        MSACM_hInstance32 = (HINSTANCE)NULL;
    42     break;
     42        break;
    4343    case DLL_THREAD_ATTACH:
    44     break;
     44        break;
    4545    case DLL_THREAD_DETACH:
    46     break;
     46        break;
    4747    default:
    48     break;
     48        break;
    4949    }
    5050    return TRUE;
     
    6767    {
    6868    case VER_PLATFORM_WIN32_NT:
    69     return 0x04000565; /* 4.0.1381 */
     69        return 0x04000565; /* 4.0.1381 */
    7070    default:
    7171        FIXME("%ld not supported",version.dwPlatformId);
    7272    case VER_PLATFORM_WIN32_WINDOWS:
    73     return 0x04000000; /* 4.0.0 */
     73        return 0x04000000; /* 4.0.0 */
    7474  }
    7575}
     
    8686MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric)
    8787{
    88     PWINE_ACMOBJ    pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
    89     BOOL        bLocal = TRUE;
    90     PWINE_ACMDRIVERID   padid;
    91     DWORD       val = 0;
    92     MMRESULT        mmr = MMSYSERR_NOERROR;
     88    PWINE_ACMOBJ        pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
     89    BOOL                bLocal = TRUE;
     90    PWINE_ACMDRIVERID   padid;
     91    DWORD               val = 0;
     92    MMRESULT            mmr = MMSYSERR_NOERROR;
    9393
    9494    TRACE("(0x%08x, %d, %p);\n", hao, uMetric, pMetric);
    95 
     95   
    9696    switch (uMetric) {
    9797    case ACM_METRIC_COUNT_DRIVERS:
    98     bLocal = FALSE;
    99     /* fall thru */
     98        bLocal = FALSE;
     99        /* fall thru */
    100100    case ACM_METRIC_COUNT_LOCAL_DRIVERS:
    101     if (!pao)
    102         return MMSYSERR_INVALHANDLE;
    103     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
    104         if (padid->bEnabled /* && (local(padid) || !bLocal) */)
    105         val++;
    106     *(LPDWORD)pMetric = val;
    107     break;
     101        if (!pao)
     102            return MMSYSERR_INVALHANDLE;
     103        for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
     104            if (padid->bEnabled /* && (local(padid) || !bLocal) */)
     105                val++;
     106        *(LPDWORD)pMetric = val;
     107        break;
    108108
    109109    case ACM_METRIC_COUNT_CODECS:
    110     if (!pao)
    111         return MMSYSERR_INVALHANDLE;
    112     bLocal = FALSE;
    113     /* fall thru */
     110        if (!pao)
     111            return MMSYSERR_INVALHANDLE;
     112        bLocal = FALSE;
     113        /* fall thru */
    114114    case ACM_METRIC_COUNT_LOCAL_CODECS:
    115     /* FIXME: don't know how to differentiate codec, converters & filters yet */
    116     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
    117         if (padid->bEnabled /* && (local(padid) || !bLocal) */)
    118         val++;
    119     *(LPDWORD)pMetric = val;
    120     break;
     115        /* FIXME: don't know how to differentiate codec, converters & filters yet */
     116        for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
     117            if (padid->bEnabled /* && (local(padid) || !bLocal) */)
     118                val++;
     119        *(LPDWORD)pMetric = val;
     120        break;
    121121
    122122    case ACM_METRIC_COUNT_CONVERTERS:
    123     bLocal = FALSE;
    124     /* fall thru */
     123        bLocal = FALSE;
     124        /* fall thru */
    125125    case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
    126     /* FIXME: don't know how to differentiate codec, converters & filters yet */
    127     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
    128         if (padid->bEnabled /* && (local(padid) || !bLocal) */)
    129         val++;
    130     *(LPDWORD)pMetric = val;
    131     break;
     126        /* FIXME: don't know how to differentiate codec, converters & filters yet */
     127        for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
     128            if (padid->bEnabled /* && (local(padid) || !bLocal) */)
     129                val++;
     130        *(LPDWORD)pMetric = val;
     131        break;
    132132
    133133    case ACM_METRIC_COUNT_FILTERS:
    134     bLocal = FALSE;
    135     /* fall thru */
     134        bLocal = FALSE;
     135        /* fall thru */
    136136    case ACM_METRIC_COUNT_LOCAL_FILTERS:
    137     /* FIXME: don't know how to differentiate codec, converters & filters yet */
    138     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
    139         if (padid->bEnabled /* && (local(padid) || !bLocal) */)
    140         val++;
    141     *(LPDWORD)pMetric = val;
    142     break;
     137        /* FIXME: don't know how to differentiate codec, converters & filters yet */
     138        for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
     139            if (padid->bEnabled /* && (local(padid) || !bLocal) */)
     140                val++;
     141        *(LPDWORD)pMetric = val;
     142        break;
    143143
    144144    case ACM_METRIC_COUNT_DISABLED:
    145     bLocal = FALSE;
    146     /* fall thru */
     145        bLocal = FALSE;
     146        /* fall thru */
    147147    case ACM_METRIC_COUNT_LOCAL_DISABLED:
    148     if (!pao)
    149         return MMSYSERR_INVALHANDLE;
    150     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
    151         if (!padid->bEnabled /* && (local(padid) || !bLocal) */)
    152         val++;
    153     *(LPDWORD)pMetric = val;
    154     break;
     148        if (!pao)
     149            return MMSYSERR_INVALHANDLE; 
     150        for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
     151            if (!padid->bEnabled /* && (local(padid) || !bLocal) */)
     152                val++;
     153        *(LPDWORD)pMetric = val;
     154        break;
     155   
     156    case ACM_METRIC_MAX_SIZE_FORMAT:
     157        {
     158            ACMFORMATTAGDETAILSW        aftd;
    155159
    156     case ACM_METRIC_MAX_SIZE_FORMAT:
    157     {
    158         ACMFORMATTAGDETAILSW    aftd;
     160            aftd.cbStruct = sizeof(aftd);
     161            aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
    159162
    160         aftd.cbStruct = sizeof(aftd);
    161         aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
    162 
    163         if (hao == (HACMOBJ)NULL) {
    164         mmr = acmFormatTagDetailsW((HACMDRIVER)NULL, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
    165         } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVER)) {
    166         mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
    167         } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVERID)) {
    168         HACMDRIVER  had;
    169 
    170         if (acmDriverOpen(&had, (HACMDRIVERID)hao, 0) == 0) {
    171             mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
    172             acmDriverClose(had, 0);
    173         }
    174         } else {
    175         mmr = MMSYSERR_INVALHANDLE;
    176         }
    177         if (mmr == MMSYSERR_NOERROR) *(LPDWORD)pMetric = aftd.cbFormatSize;
    178     }
     163            if (hao == (HACMOBJ)NULL) {
     164                mmr = acmFormatTagDetailsW((HACMDRIVER)NULL, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
     165            } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVER)) {
     166                mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
     167            } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVERID)) {
     168                HACMDRIVER      had;
     169               
     170                if (acmDriverOpen(&had, (HACMDRIVERID)hao, 0) == 0) {
     171                    mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
     172                    acmDriverClose(had, 0);
     173                }
     174            } else {
     175                mmr = MMSYSERR_INVALHANDLE;
     176            }
     177            if (mmr == MMSYSERR_NOERROR) *(LPDWORD)pMetric = aftd.cbFormatSize;
     178        }
    179179        break;
    180180
     
    186186    case ACM_METRIC_DRIVER_PRIORITY:
    187187    default:
    188     FIXME("(0x%08x, %d, %p): stub\n", hao, uMetric, pMetric);
    189     mmr = MMSYSERR_NOTSUPPORTED;
     188        FIXME("(0x%08x, %d, %p): stub\n", hao, uMetric, pMetric);
     189        mmr = MMSYSERR_NOTSUPPORTED;
    190190    }
    191191    return mmr;
  • trunk/src/msacm32/pcmconverter.c

    r6648 r6712  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 /* $Id: pcmconverter.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
     2
    33/*
    44 *      MSACM32 library
    55 *
    6  *      Copyright 2000      Eric Pouech
    7  *
    8  *  FIXME / TODO list
    9  *  + most of the computation should be done in fixed point arithmetic
    10  *    instead of floating point (16 bits for integral part, and 16 bits
    11  *    for fractional part for example)
    12  *  + implement PCM_FormatSuggest function
    13  *  + get rid of hack for PCM_DriverProc (msacm32.dll shouldn't export
    14  *    a DriverProc, but this would require implementing a generic
    15  *    embedded driver handling scheme in msacm32.dll which isn't done yet
     6 *      Copyright 2000          Eric Pouech
     7 *
     8 *      FIXME / TODO list
     9 *      + most of the computation should be done in fixed point arithmetic
     10 *        instead of floating point (16 bits for integral part, and 16 bits
     11 *        for fractional part for example)
     12 *      + implement PCM_FormatSuggest function
     13 *      + get rid of hack for PCM_DriverProc (msacm32.dll shouldn't export
     14 *        a DriverProc, but this would require implementing a generic
     15 *        embedded driver handling scheme in msacm32.dll which isn't done yet
    1616 */
    1717
     
    3535 *           PCM_drvOpen
    3636 */
    37 static  DWORD   PCM_drvOpen(LPCSTR str)
     37static  DWORD   PCM_drvOpen(LPCSTR str)
    3838{
    3939    return 1;
     
    4343 *           PCM_drvClose
    4444 */
    45 static  DWORD   PCM_drvClose(DWORD dwDevID)
     45static  DWORD   PCM_drvClose(DWORD dwDevID)
    4646{
    4747    return 1;
    4848}
    4949
    50 #define NUM_PCM_FORMATS (sizeof(PCM_Formats) / sizeof(PCM_Formats[0]))
    51 #define NUM_OF(a,b) (((a)+(b)-1)/(b))
     50#define NUM_PCM_FORMATS (sizeof(PCM_Formats) / sizeof(PCM_Formats[0]))
     51#define NUM_OF(a,b)     (((a)+(b)-1)/(b))
    5252
    5353/* flags for fdwDriver */
    54 #define PCM_RESAMPLE    1
     54#define PCM_RESAMPLE    1
    5555
    5656/* data used while converting */
     
    5858    /* conversion routine, depending if rate conversion is required */
    5959    union {
    60     void (*cvtKeepRate)(const unsigned char*, int, unsigned char*);
    61     void (*cvtChangeRate)(struct tagAcmPcmData*, const unsigned char*,
    62                   LPDWORD, unsigned char*, LPDWORD);
     60        void (*cvtKeepRate)(const unsigned char*, int, unsigned char*);
     61        void (*cvtChangeRate)(struct tagAcmPcmData*, const unsigned char*,
     62                              LPDWORD, unsigned char*, LPDWORD);
    6363    } cvt;
    6464    /* the following fields are used only with rate conversion) */
    65     DWORD   srcPos;     /* position in source stream */
    66     double  dstPos;     /* position in destination stream */
    67     double  dstIncr;    /* value to increment dst stream when src stream
    68                    is incremented by 1 */
     65    DWORD       srcPos;         /* position in source stream */
     66    double      dstPos;         /* position in destination stream */
     67    double      dstIncr;        /* value to increment dst stream when src stream
     68                                   is incremented by 1 */
    6969    /* last source stream value read */
    7070    union {
    71     unsigned char   b;  /*  8 bit value */
    72     short       s;  /* 16 bit value */
     71        unsigned char   b;      /*  8 bit value */
     72        short           s;      /* 16 bit value */
    7373    } last[2]; /* two channels max (stereo) */
    7474} AcmPcmData;
     
    7777 * also helps given a unique index to each of the supported formats
    7878 */
    79 static  struct {
    80     int     nChannels;
    81     int     nBits;
    82     int     rate;
     79static  struct {
     80    int         nChannels;
     81    int         nBits;
     82    int         rate;
    8383} PCM_Formats[] = {
    8484    {1,  8,  8000}, {2,  8,  8000}, {1, 16,  8000}, {2, 16,  8000},
     
    9191 *           PCM_GetFormatIndex
    9292 */
    93 static  DWORD   PCM_GetFormatIndex(LPWAVEFORMATEX wfx)
     93static  DWORD   PCM_GetFormatIndex(LPWAVEFORMATEX wfx)
    9494{
    9595    int i;
    96 
     96   
    9797    for (i = 0; i < NUM_PCM_FORMATS; i++) {
    98     if (wfx->nChannels == PCM_Formats[i].nChannels &&
    99         wfx->nSamplesPerSec == PCM_Formats[i].rate &&
    100         wfx->wBitsPerSample == PCM_Formats[i].nBits)
    101         return i;
     98        if (wfx->nChannels == PCM_Formats[i].nChannels &&
     99            wfx->nSamplesPerSec == PCM_Formats[i].rate &&
     100            wfx->wBitsPerSample == PCM_Formats[i].nBits)
     101            return i;
    102102    }
    103103    return 0xFFFFFFFF;
     
    107107 *
    108108 * parameters:
    109  *  + 8 bit unsigned vs 16 bit signed
    110  *  + mono vs stereo (1 or 2 channels)
    111  *  + sampling rate (8.0, 11.025, 22.05, 44.1 kHz are defined, but algo shall work
    112  *    in all cases)
     109 *      + 8 bit unsigned vs 16 bit signed
     110 *      + mono vs stereo (1 or 2 channels)
     111 *      + sampling rate (8.0, 11.025, 22.05, 44.1 kHz are defined, but algo shall work
     112 *        in all cases)
    113113 *
    114114 * mono => stereo: copy the same sample on Left & Right channels
    115115 * stereo =) mono: use the average value of samples from Left & Right channels
    116116 * resampling; we lookup for each destination sample the two source adjacent samples
    117  *  were src <= dst < src+1 (dst is increased by a fractional value which is
    118  *  equivalent to the increment by one on src); then we use a linear
    119  *  interpolation between src and src+1
     117 *      were src <= dst < src+1 (dst is increased by a fractional value which is
     118 *      equivalent to the increment by one on src); then we use a linear
     119 *      interpolation between src and src+1
    120120 */
    121121
     
    125125 * Converts a 8 bit sample to a 16 bit one
    126126 */
    127 static inline short C816(unsigned char b)
     127static inline short C816(unsigned char b) 
    128128{
    129129    return (short)(b ^ 0x80) * 256;
     
    135135 * Converts a 16 bit sample to a 8 bit one (data loss !!)
    136136 */
    137 static inline unsigned char C168(short s)
     137static inline unsigned char C168(short s) 
    138138{
    139139    return HIBYTE(s) ^ (unsigned char)0x80;
     
    164164 *           M16
    165165 *
    166  * Convert the (l,r) 16 bit stereo sample into a 16 bit mono
     166 * Convert the (l,r) 16 bit stereo sample into a 16 bit mono 
    167167 * (takes the mid-point of the two values)
    168168 */
     
    175175 *           M8
    176176 *
    177  * Convert the (l,r) 8 bit stereo sample into a 8 bit mono
     177 * Convert the (l,r) 8 bit stereo sample into a 8 bit mono 
    178178 * (takes the mid-point of the two values)
    179179 */
     
    194194 */
    195195
    196 static  void cvtMM88K(const unsigned char* src, int ns, unsigned char* dst)
     196static  void cvtMM88K(const unsigned char* src, int ns, unsigned char* dst)
    197197{
    198198    memcpy(dst, src, ns);
    199199}
    200200
    201 static  void cvtSS88K(const unsigned char* src, int ns, unsigned char* dst)
     201static  void cvtSS88K(const unsigned char* src, int ns, unsigned char* dst)
    202202{
    203203    memcpy(dst, src, ns * 2);
    204204}
    205205
    206 static  void cvtMM1616K(const unsigned char* src, int ns, unsigned char* dst)
     206static  void cvtMM1616K(const unsigned char* src, int ns, unsigned char* dst)
    207207{
    208208    memcpy(dst, src, ns * 2);
    209209}
    210210
    211 static  void cvtSS1616K(const unsigned char* src, int ns, unsigned char* dst)
     211static  void cvtSS1616K(const unsigned char* src, int ns, unsigned char* dst)
    212212{
    213213    memcpy(dst, src, ns * 4);
    214214}
    215215
    216 static  void cvtMS88K(const unsigned char* src, int ns, unsigned char* dst)
    217 {
    218     while (ns--) {
    219     *dst++ = *src;
    220     *dst++ = *src++;
    221     }
    222 }
    223 
    224 static  void cvtMS816K(const unsigned char* src, int ns, unsigned char* dst)
    225 {
    226     short   v;
    227 
    228     while (ns--) {
    229     v = C816(*src++);
    230     W16(dst, v);        dst += 2;
    231     W16(dst, v);        dst += 2;
    232     }
    233 }
    234 
    235 static  void cvtMS168K(const unsigned char* src, int ns, unsigned char* dst)
     216static  void cvtMS88K(const unsigned char* src, int ns, unsigned char* dst)
     217{
     218    while (ns--) {
     219        *dst++ = *src;
     220        *dst++ = *src++;
     221    }
     222}
     223
     224static  void cvtMS816K(const unsigned char* src, int ns, unsigned char* dst)
     225{
     226    short       v;
     227   
     228    while (ns--) {
     229        v = C816(*src++);
     230        W16(dst, v);            dst += 2;
     231        W16(dst, v);            dst += 2;
     232    }
     233}
     234
     235static  void cvtMS168K(const unsigned char* src, int ns, unsigned char* dst)
    236236{
    237237    unsigned char v;
    238 
    239     while (ns--) {
    240     v = C168(R16(src));     src += 2;
    241     *dst++ = v;
    242     *dst++ = v;
    243     }
    244 }
    245 
    246 static  void cvtMS1616K(const unsigned char* src, int ns, unsigned char* dst)
    247 {
    248     short   v;
    249 
    250     while (ns--) {
    251     v = R16(src);       src += 2;
    252     W16(dst, v);        dst += 2;
    253     W16(dst, v);        dst += 2;
    254     }
    255 }
    256 
    257 static  void cvtSM88K(const unsigned char* src, int ns, unsigned char* dst)
    258 {
    259     while (ns--) {
    260     *dst++ = M8(src[0], src[1]);
    261     src += 2;
    262     }
    263 }
    264 
    265 static  void cvtSM816K(const unsigned char* src, int ns, unsigned char* dst)
    266 {
    267     short   v;
    268 
    269     while (ns--) {
    270     v = M16(C816(src[0]), C816(src[1]));
    271     src += 2;
    272     W16(dst, v);        dst += 2;
    273     }
    274 }
    275 
    276 static  void cvtSM168K(const unsigned char* src, int ns, unsigned char* dst)
    277 {
    278     while (ns--) {
    279     *dst++ = C168(M16(R16(src), R16(src + 2)));
    280     src += 4;
    281     }
    282 }
    283 
    284 static  void cvtSM1616K(const unsigned char* src, int ns, unsigned char* dst)
    285 {
    286     while (ns--) {
    287     W16(dst, M16(R16(src),R16(src+2))); dst += 2;
    288     src += 4;
    289     }
    290 }
    291 
    292 static  void cvtMM816K(const unsigned char* src, int ns, unsigned char* dst)
    293 {
    294     while (ns--) {
    295     W16(dst, C816(*src++));     dst += 2;
    296     }
    297 }
    298 
    299 static  void cvtSS816K(const unsigned char* src, int ns, unsigned char* dst)
    300 {
    301     while (ns--) {
    302     W16(dst, C816(*src++)); dst += 2;
    303     W16(dst, C816(*src++)); dst += 2;
    304     }
    305 }
    306 
    307 static  void cvtMM168K(const unsigned char* src, int ns, unsigned char* dst)
    308 {
    309     while (ns--) {
    310     *dst++ = C168(R16(src));    src += 2;
    311     }
    312 }
    313 
    314 static  void cvtSS168K(const unsigned char* src, int ns, unsigned char* dst)
    315 {
    316     while (ns--) {
    317     *dst++ = C168(R16(src));    src += 2;
    318     *dst++ = C168(R16(src));    src += 2;
    319     }
    320 }
    321 
    322 static  void (*PCM_ConvertKeepRate[16])(const unsigned char*, int, unsigned char*) = {
    323     cvtSS88K,   cvtSM88K,   cvtMS88K,   cvtMM88K,
    324     cvtSS816K,  cvtSM816K,  cvtMS816K,  cvtMM816K,
    325     cvtSS168K,  cvtSM168K,  cvtMS168K,  cvtMM168K,
     238   
     239    while (ns--) {
     240        v = C168(R16(src));             src += 2;
     241        *dst++ = v;
     242        *dst++ = v;
     243    }
     244}
     245
     246static  void cvtMS1616K(const unsigned char* src, int ns, unsigned char* dst)
     247{
     248    short       v;
     249
     250    while (ns--) {
     251        v = R16(src);           src += 2;
     252        W16(dst, v);            dst += 2;
     253        W16(dst, v);            dst += 2;
     254    }
     255}
     256
     257static  void cvtSM88K(const unsigned char* src, int ns, unsigned char* dst)
     258{
     259    while (ns--) {
     260        *dst++ = M8(src[0], src[1]);
     261        src += 2;
     262    }
     263}
     264
     265static  void cvtSM816K(const unsigned char* src, int ns, unsigned char* dst)
     266{
     267    short       v;
     268   
     269    while (ns--) {
     270        v = M16(C816(src[0]), C816(src[1]));
     271        src += 2;
     272        W16(dst, v);            dst += 2;
     273    }
     274}
     275
     276static  void cvtSM168K(const unsigned char* src, int ns, unsigned char* dst)
     277{
     278    while (ns--) {
     279        *dst++ = C168(M16(R16(src), R16(src + 2)));
     280        src += 4;
     281    }
     282}
     283
     284static  void cvtSM1616K(const unsigned char* src, int ns, unsigned char* dst)
     285{
     286    while (ns--) {
     287        W16(dst, M16(R16(src),R16(src+2)));     dst += 2;
     288        src += 4;
     289    }
     290}
     291
     292static  void cvtMM816K(const unsigned char* src, int ns, unsigned char* dst)
     293{
     294    while (ns--) {
     295        W16(dst, C816(*src++));         dst += 2;
     296    }
     297}
     298
     299static  void cvtSS816K(const unsigned char* src, int ns, unsigned char* dst)
     300{
     301    while (ns--) {
     302        W16(dst, C816(*src++)); dst += 2;
     303        W16(dst, C816(*src++)); dst += 2;
     304    }
     305}
     306
     307static  void cvtMM168K(const unsigned char* src, int ns, unsigned char* dst)
     308{
     309    while (ns--) {
     310        *dst++ = C168(R16(src));        src += 2;
     311    }
     312}
     313
     314static  void cvtSS168K(const unsigned char* src, int ns, unsigned char* dst)
     315{
     316    while (ns--) {
     317        *dst++ = C168(R16(src));        src += 2;
     318        *dst++ = C168(R16(src));        src += 2;
     319    }
     320}
     321
     322static  void (*PCM_ConvertKeepRate[16])(const unsigned char*, int, unsigned char*) = {
     323    cvtSS88K,   cvtSM88K,   cvtMS88K,   cvtMM88K,
     324    cvtSS816K,  cvtSM816K,  cvtMS816K,  cvtMM816K,
     325    cvtSS168K,  cvtSM168K,  cvtMS168K,  cvtMM168K,
    326326    cvtSS1616K, cvtSM1616K, cvtMS1616K, cvtMM1616K,
    327327};
     
    333333 * Linear interpolation is used
    334334 */
    335 static  inline double   I(double v1, double v2, double r)
     335static  inline double   I(double v1, double v2, double r)
    336336{
    337337    if (0.0 >= r || r > 1.0) FIXME("r!! %f\n", r);
     
    339339}
    340340
    341 static  void cvtSS88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    342               unsigned char* dst, LPDWORD ndst)
    343 {
    344     double          r;
    345 
    346     while (*nsrc != 0 && *ndst != 0) {
    347     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    348         if (*nsrc == 0) return;
    349         apd->last[0].b = *src++;
    350         apd->last[1].b = *src++;
    351         apd->srcPos++;
    352         (*nsrc)--;
    353     }
    354     /* now do the interpolation */
    355     *dst++ = I(apd->last[0].b, src[0], r);
    356     *dst++ = I(apd->last[1].b, src[1], r);
    357     apd->dstPos += apd->dstIncr;
    358     (*ndst)--;
     341static  void cvtSS88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     342                      unsigned char* dst, LPDWORD ndst)
     343{
     344    double              r;
     345
     346    while (*nsrc != 0 && *ndst != 0) {
     347        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     348            if (*nsrc == 0) return;
     349            apd->last[0].b = *src++;
     350            apd->last[1].b = *src++;
     351            apd->srcPos++;
     352            (*nsrc)--;
     353        }
     354        /* now do the interpolation */
     355        *dst++ = I(apd->last[0].b, src[0], r);
     356        *dst++ = I(apd->last[1].b, src[1], r);
     357        apd->dstPos += apd->dstIncr;
     358        (*ndst)--;
    359359    }
    360360}
     
    368368 *
    369369 */
    370 static  void cvtSM88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    371               unsigned char* dst, LPDWORD ndst)
    372 {
    373     double      r;
    374 
    375     while (*nsrc != 0 && *ndst != 0) {
    376     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    377         if (*nsrc == 0) return;
    378         apd->last[0].b = *src++;
    379         apd->last[1].b = *src++;
    380         apd->srcPos++;
    381         (*nsrc)--;
    382     }
    383     /* now do the interpolation */
    384     *dst++ = I(M8(apd->last[0].b, apd->last[1].b), M8(src[0], src[1]), r);
    385     apd->dstPos += apd->dstIncr;
    386     (*ndst)--;
    387     }
    388 }
    389 
    390 static  void cvtMS88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    391               unsigned char* dst, LPDWORD ndst)
    392 {
    393     double  r;
    394 
    395     while (*nsrc != 0 && *ndst != 0) {
    396     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    397         if (*nsrc == 0) return;
    398         apd->last[0].b = *src++;
    399         apd->srcPos++;
    400         (*nsrc)--;
    401     }
    402     /* now do the interpolation */
    403     dst[0] = dst[1] = I(apd->last[0].b, src[0], r);
    404     dst += 2;
    405     apd->dstPos += apd->dstIncr;
    406     (*ndst)--;
    407     }
    408 }
    409 
    410 static  void cvtMM88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    411               unsigned char* dst, LPDWORD ndst)
    412 {
    413     double      r;
    414 
    415     while (*nsrc != 0 && *ndst != 0) {
    416     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    417         if (*nsrc == 0) return;
    418         apd->last[0].b = *src++;
    419         apd->srcPos++;
    420         (*nsrc)--;
    421     }
    422     /* now do the interpolation */
    423     *dst++ = I(apd->last[0].b, src[0], r);
    424     apd->dstPos += apd->dstIncr;
    425     (*ndst)--;
    426     }
    427 }
    428 
    429 static  void cvtSS816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    430                unsigned char* dst, LPDWORD ndst)
    431 {
    432     double  r;
    433 
    434     while (*nsrc != 0 && *ndst != 0) {
    435     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    436         if (*nsrc == 0) return;
    437         apd->last[0].b = *src++;
    438         apd->last[1].b = *src++;
    439         apd->srcPos++;
    440         (*nsrc)--;
    441     }
    442     /* now do the interpolation */
    443     W16(dst, I(C816(apd->last[0].b), C816(src[0]), r)); dst += 2;
    444     W16(dst, I(C816(apd->last[1].b), C816(src[1]), r)); dst += 2;
    445     apd->dstPos += apd->dstIncr;
    446     (*ndst)--;
    447     }
    448 }
    449 
    450 static  void cvtSM816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    451             unsigned char* dst, LPDWORD ndst)
    452 {
    453     double      r;
    454 
    455     while (*nsrc != 0 && *ndst != 0) {
    456     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    457         if (*nsrc == 0) return;
    458         apd->last[0].b = *src++;
    459         apd->last[1].b = *src++;
    460         apd->srcPos++;
    461         (*nsrc)--;
    462     }
    463     /* now do the interpolation */
    464     W16(dst, I(M16(C816(apd->last[0].b), C816(apd->last[1].b)),
    465             M16(C816(src[0]), C816(src[1])), r));
    466     dst += 2;
    467     apd->dstPos += apd->dstIncr;
    468     (*ndst)--;
    469     }
    470 }
    471 
    472 static  void cvtMS816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    473             unsigned char* dst, LPDWORD ndst)
    474 {
    475     double      r;
    476     short   v;
    477 
    478     while (*nsrc != 0 && *ndst != 0) {
    479     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    480         if (*nsrc == 0) return;
    481         apd->last[0].b = *src++;
    482         apd->srcPos++;
    483         (*nsrc)--;
    484     }
    485     /* now do the interpolation */
    486     v = I(C816(apd->last[0].b), C816(src[0]), r);
    487     W16(dst, v);        dst += 2;
    488     W16(dst, v);        dst += 2;
    489     apd->dstPos += apd->dstIncr;
    490     (*ndst)--;
    491     }
    492 }
    493 
    494 static  void cvtMM816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    495             unsigned char* dst, LPDWORD ndst)
    496 {
    497     double      r;
    498 
    499     while (*nsrc != 0 && *ndst != 0) {
    500     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    501         if (*nsrc == 0) return;
    502         apd->last[0].b = *src++;
    503         apd->srcPos++;
    504         (*nsrc)--;
    505     }
    506     /* now do the interpolation */
    507     W16(dst, I(C816(apd->last[0].b), C816(src[0]), r));
    508     dst += 2;
    509     apd->dstPos += apd->dstIncr;
    510     (*ndst)--;
    511     }
    512 }
    513 
    514 static  void cvtSS168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    515             unsigned char* dst, LPDWORD ndst)
    516 {
    517     double      r;
    518 
    519     while (*nsrc != 0 && *ndst != 0) {
    520     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    521         if (*nsrc == 0) return;
    522         apd->last[0].s = R16(src);  src += 2;
    523         apd->last[1].s = R16(src);  src += 2;
    524         apd->srcPos++;
    525         (*nsrc)--;
    526     }
    527     /* now do the interpolation */
    528     *dst++ = C168(I(apd->last[0].s, R16(src)  , r));
    529     *dst++ = C168(I(apd->last[1].s, R16(src+2), r));
    530     apd->dstPos += apd->dstIncr;
    531     (*ndst)--;
    532     }
    533 }
    534 
    535 static  void cvtSM168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    536             unsigned char* dst, LPDWORD ndst)
    537 {
    538     double      r;
    539 
    540     while (*nsrc != 0 && *ndst != 0) {
    541     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    542         if (*nsrc == 0) return;
    543         apd->last[0].s = R16(src);  src += 2;
    544         apd->last[1].s = R16(src);  src += 2;
    545         apd->srcPos++;
    546         (*nsrc)--;
    547     }
    548     /* now do the interpolation */
    549     *dst++ = C168(I(M16(apd->last[0].s, apd->last[1].s),
    550             M16(R16(src), R16(src + 2)), r));
    551     apd->dstPos += apd->dstIncr;
    552     (*ndst)--;
    553     }
    554 }
    555 
    556 
    557 static  void cvtMS168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    558             unsigned char* dst, LPDWORD ndst)
    559 {
    560     double      r;
    561 
    562     while (*nsrc != 0 && *ndst != 0) {
    563     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    564         if (*nsrc == 0) return;
    565         apd->last[0].s = R16(src);  src += 2;
    566         apd->srcPos++;
    567         (*nsrc)--;
    568     }
    569     /* now do the interpolation */
    570     dst[0] = dst[1] = C168(I(apd->last[0].s, R16(src), r)); dst += 2;
    571     apd->dstPos += apd->dstIncr;
    572     (*ndst)--;
    573     }
    574 }
    575 
    576 
    577 static  void cvtMM168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    578             unsigned char* dst, LPDWORD ndst)
    579 {
    580     double      r;
    581 
    582     while (*nsrc != 0 && *ndst != 0) {
    583     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    584         if (*nsrc == 0) return;
    585         apd->last[0].s = R16(src);  src += 2;
    586         apd->srcPos++;
    587         (*nsrc)--;
    588     }
    589     /* now do the interpolation */
    590     *dst++ = C168(I(apd->last[0].s, R16(src), r));
    591     apd->dstPos += apd->dstIncr;
    592     (*ndst)--;
    593     }
    594 }
    595 
    596 static  void cvtSS1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    597             unsigned char* dst, LPDWORD ndst)
    598 {
    599     double      r;
    600 
    601     while (*nsrc != 0 && *ndst != 0) {
    602     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    603         if (*nsrc == 0) return;
    604         apd->last[0].s = R16(src);  src += 2;
    605         apd->last[1].s = R16(src);  src += 2;
    606         apd->srcPos++;
    607         (*nsrc)--;
    608     }
    609     /* now do the interpolation */
    610     W16(dst, I(apd->last[0].s, R16(src)  , r)); dst += 2;
    611     W16(dst, I(apd->last[1].s, R16(src+2), r)); dst += 2;
    612     apd->dstPos += apd->dstIncr;
    613     (*ndst)--;
    614     }
    615 }
    616 
    617 static  void cvtSM1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    618             unsigned char* dst, LPDWORD ndst)
    619 {
    620     double      r;
    621 
    622     while (*nsrc != 0 && *ndst != 0) {
    623     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    624         if (*nsrc == 0) return;
    625         apd->last[0].s = R16(src);  src += 2;
    626         apd->last[1].s = R16(src);  src += 2;
    627         apd->srcPos++;
    628         (*nsrc)--;
    629     }
    630     /* now do the interpolation */
    631     W16(dst, I(M16(apd->last[0].s, apd->last[1].s),
    632            M16(R16(src), R16(src+2)), r));
    633     dst += 2;
    634     apd->dstPos += apd->dstIncr;
    635     (*ndst)--;
    636     }
    637 }
    638 
    639 static  void cvtMS1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    640             unsigned char* dst, LPDWORD ndst)
    641 {
    642     double      r;
    643     short   v;
    644 
    645     while (*nsrc != 0 && *ndst != 0) {
    646     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    647         if (*nsrc == 0) return;
    648         apd->last[0].s = R16(src);  src += 2;
    649         apd->srcPos++;
    650         (*nsrc)--;
    651     }
    652     /* now do the interpolation */
    653     v = I(apd->last[0].s, R16(src), r);
    654     W16(dst, v);        dst += 2;
    655     W16(dst, v);        dst += 2;
    656     apd->dstPos += apd->dstIncr;
    657     (*ndst)--;
    658     }
    659 }
    660 
    661 static  void cvtMM1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
    662             unsigned char* dst, LPDWORD ndst)
    663 {
    664     double      r;
    665 
    666     while (*nsrc != 0 && *ndst != 0) {
    667     while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
    668         if (*nsrc == 0) return;
    669         apd->last[0].s = R16(src);  src += 2;
    670         apd->srcPos++;
    671         (*nsrc)--;
    672     }
    673     /* now do the interpolation */
    674     W16(dst, I(apd->last[0].s, R16(src), r));   dst += 2;
    675     apd->dstPos += apd->dstIncr;
    676     (*ndst)--;
    677     }
    678 }
    679 
    680 static  void (*PCM_ConvertChangeRate[16])(AcmPcmData* apd,
    681                       const unsigned char* src, LPDWORD nsrc,
    682                       unsigned char* dst, LPDWORD ndst) = {
     370static  void cvtSM88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     371                      unsigned char* dst, LPDWORD ndst)
     372{
     373    double      r;
     374
     375    while (*nsrc != 0 && *ndst != 0) {
     376        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     377            if (*nsrc == 0) return;
     378            apd->last[0].b = *src++;
     379            apd->last[1].b = *src++;
     380            apd->srcPos++;
     381            (*nsrc)--;
     382        }
     383        /* now do the interpolation */
     384        *dst++ = I(M8(apd->last[0].b, apd->last[1].b), M8(src[0], src[1]), r);
     385        apd->dstPos += apd->dstIncr;
     386        (*ndst)--;
     387    }
     388}
     389
     390static  void cvtMS88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     391                      unsigned char* dst, LPDWORD ndst)
     392{
     393    double      r;
     394
     395    while (*nsrc != 0 && *ndst != 0) {
     396        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     397            if (*nsrc == 0) return;
     398            apd->last[0].b = *src++;
     399            apd->srcPos++;
     400            (*nsrc)--;
     401        }
     402        /* now do the interpolation */
     403        dst[0] = dst[1] = I(apd->last[0].b, src[0], r);
     404        dst += 2;
     405        apd->dstPos += apd->dstIncr;
     406        (*ndst)--;
     407    }
     408}
     409
     410static  void cvtMM88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     411                      unsigned char* dst, LPDWORD ndst)
     412{
     413    double      r;
     414
     415    while (*nsrc != 0 && *ndst != 0) {
     416        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     417            if (*nsrc == 0) return;
     418            apd->last[0].b = *src++;
     419            apd->srcPos++;
     420            (*nsrc)--;
     421        }
     422        /* now do the interpolation */
     423        *dst++ = I(apd->last[0].b, src[0], r);
     424        apd->dstPos += apd->dstIncr;
     425        (*ndst)--;
     426    }
     427}
     428
     429static  void cvtSS816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     430                       unsigned char* dst, LPDWORD ndst)
     431{
     432    double      r;
     433       
     434    while (*nsrc != 0 && *ndst != 0) {
     435        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     436            if (*nsrc == 0) return;
     437            apd->last[0].b = *src++;
     438            apd->last[1].b = *src++;
     439            apd->srcPos++;
     440            (*nsrc)--;
     441        }
     442        /* now do the interpolation */
     443        W16(dst, I(C816(apd->last[0].b), C816(src[0]), r));     dst += 2;
     444        W16(dst, I(C816(apd->last[1].b), C816(src[1]), r));     dst += 2;
     445        apd->dstPos += apd->dstIncr;
     446        (*ndst)--;
     447    }
     448}
     449
     450static  void cvtSM816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     451                        unsigned char* dst, LPDWORD ndst)
     452{
     453    double      r;
     454
     455    while (*nsrc != 0 && *ndst != 0) {
     456        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     457            if (*nsrc == 0) return;
     458            apd->last[0].b = *src++;
     459            apd->last[1].b = *src++;
     460            apd->srcPos++;
     461            (*nsrc)--;
     462        }
     463        /* now do the interpolation */
     464        W16(dst, I(M16(C816(apd->last[0].b), C816(apd->last[1].b)),
     465                    M16(C816(src[0]), C816(src[1])), r));
     466        dst += 2;
     467        apd->dstPos += apd->dstIncr;
     468        (*ndst)--;
     469    }
     470}
     471
     472static  void cvtMS816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     473                        unsigned char* dst, LPDWORD ndst)
     474{
     475    double      r;
     476    short       v;
     477
     478    while (*nsrc != 0 && *ndst != 0) {
     479        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     480            if (*nsrc == 0) return;
     481            apd->last[0].b = *src++;
     482            apd->srcPos++;
     483            (*nsrc)--;
     484        }
     485        /* now do the interpolation */
     486        v = I(C816(apd->last[0].b), C816(src[0]), r);
     487        W16(dst, v);            dst += 2;
     488        W16(dst, v);            dst += 2;
     489        apd->dstPos += apd->dstIncr;
     490        (*ndst)--;
     491    }
     492}
     493
     494static  void cvtMM816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     495                        unsigned char* dst, LPDWORD ndst)
     496{
     497    double      r;
     498
     499    while (*nsrc != 0 && *ndst != 0) {
     500        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     501            if (*nsrc == 0) return;
     502            apd->last[0].b = *src++;
     503            apd->srcPos++;
     504            (*nsrc)--;
     505        }
     506        /* now do the interpolation */
     507        W16(dst, I(C816(apd->last[0].b), C816(src[0]), r));
     508        dst += 2;
     509        apd->dstPos += apd->dstIncr;
     510        (*ndst)--;
     511    }
     512}
     513
     514static  void cvtSS168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     515                        unsigned char* dst, LPDWORD ndst)
     516{
     517    double      r;
     518
     519    while (*nsrc != 0 && *ndst != 0) {
     520        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     521            if (*nsrc == 0) return;
     522            apd->last[0].s = R16(src);  src += 2;
     523            apd->last[1].s = R16(src);  src += 2;
     524            apd->srcPos++;
     525            (*nsrc)--;
     526        }
     527        /* now do the interpolation */
     528        *dst++ = C168(I(apd->last[0].s, R16(src)  , r));
     529        *dst++ = C168(I(apd->last[1].s, R16(src+2), r));
     530        apd->dstPos += apd->dstIncr;
     531        (*ndst)--;
     532    }
     533}
     534
     535static  void cvtSM168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     536                        unsigned char* dst, LPDWORD ndst)
     537{
     538    double      r;
     539
     540    while (*nsrc != 0 && *ndst != 0) {
     541        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     542            if (*nsrc == 0) return;
     543            apd->last[0].s = R16(src);  src += 2;
     544            apd->last[1].s = R16(src);  src += 2;
     545            apd->srcPos++;
     546            (*nsrc)--;
     547        }
     548        /* now do the interpolation */
     549        *dst++ = C168(I(M16(apd->last[0].s, apd->last[1].s),
     550                        M16(R16(src), R16(src + 2)), r));
     551        apd->dstPos += apd->dstIncr;
     552        (*ndst)--;
     553    }
     554}
     555
     556
     557static  void cvtMS168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     558                        unsigned char* dst, LPDWORD ndst)
     559{
     560    double      r;
     561
     562    while (*nsrc != 0 && *ndst != 0) {
     563        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     564            if (*nsrc == 0) return;
     565            apd->last[0].s = R16(src);  src += 2;
     566            apd->srcPos++;
     567            (*nsrc)--;
     568        }
     569        /* now do the interpolation */
     570        dst[0] = dst[1] = C168(I(apd->last[0].s, R16(src), r)); dst += 2;
     571        apd->dstPos += apd->dstIncr;
     572        (*ndst)--;
     573    }
     574}
     575
     576
     577static  void cvtMM168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     578                        unsigned char* dst, LPDWORD ndst)
     579{
     580    double      r;
     581
     582    while (*nsrc != 0 && *ndst != 0) {
     583        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     584            if (*nsrc == 0) return;
     585            apd->last[0].s = R16(src);  src += 2;
     586            apd->srcPos++;
     587            (*nsrc)--;
     588        }
     589        /* now do the interpolation */
     590        *dst++ = C168(I(apd->last[0].s, R16(src), r));
     591        apd->dstPos += apd->dstIncr;
     592        (*ndst)--;
     593    }
     594}
     595
     596static  void cvtSS1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     597                        unsigned char* dst, LPDWORD ndst)
     598{
     599    double      r;
     600
     601    while (*nsrc != 0 && *ndst != 0) {
     602        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     603            if (*nsrc == 0) return;
     604            apd->last[0].s = R16(src);  src += 2;
     605            apd->last[1].s = R16(src);  src += 2;
     606            apd->srcPos++;
     607            (*nsrc)--;
     608        }
     609        /* now do the interpolation */
     610        W16(dst, I(apd->last[0].s, R16(src)  , r));     dst += 2;
     611        W16(dst, I(apd->last[1].s, R16(src+2), r));     dst += 2;
     612        apd->dstPos += apd->dstIncr;
     613        (*ndst)--;
     614    }
     615}
     616
     617static  void cvtSM1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     618                        unsigned char* dst, LPDWORD ndst)
     619{
     620    double      r;
     621
     622    while (*nsrc != 0 && *ndst != 0) {
     623        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     624            if (*nsrc == 0) return;
     625            apd->last[0].s = R16(src);  src += 2;
     626            apd->last[1].s = R16(src);  src += 2;
     627            apd->srcPos++;
     628            (*nsrc)--;
     629        }
     630        /* now do the interpolation */
     631        W16(dst, I(M16(apd->last[0].s, apd->last[1].s),
     632                   M16(R16(src), R16(src+2)), r));
     633        dst += 2;
     634        apd->dstPos += apd->dstIncr;
     635        (*ndst)--;
     636    }
     637}
     638
     639static  void cvtMS1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     640                        unsigned char* dst, LPDWORD ndst)
     641{
     642    double      r;
     643    short       v;
     644
     645    while (*nsrc != 0 && *ndst != 0) {
     646        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     647            if (*nsrc == 0) return;
     648            apd->last[0].s = R16(src);  src += 2;
     649            apd->srcPos++;
     650            (*nsrc)--;
     651        }
     652        /* now do the interpolation */
     653        v = I(apd->last[0].s, R16(src), r);
     654        W16(dst, v);            dst += 2;
     655        W16(dst, v);            dst += 2;
     656        apd->dstPos += apd->dstIncr;
     657        (*ndst)--;
     658    }
     659}
     660
     661static  void cvtMM1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc,
     662                        unsigned char* dst, LPDWORD ndst)
     663{
     664    double      r;
     665
     666    while (*nsrc != 0 && *ndst != 0) {
     667        while ((r = (double)apd->srcPos - apd->dstPos) <= 0) {
     668            if (*nsrc == 0) return;
     669            apd->last[0].s = R16(src);  src += 2;
     670            apd->srcPos++;
     671            (*nsrc)--;
     672        }
     673        /* now do the interpolation */
     674        W16(dst, I(apd->last[0].s, R16(src), r));       dst += 2;
     675        apd->dstPos += apd->dstIncr;
     676        (*ndst)--;
     677    }
     678}
     679
     680static  void (*PCM_ConvertChangeRate[16])(AcmPcmData* apd,
     681                                          const unsigned char* src, LPDWORD nsrc,
     682                                          unsigned char* dst, LPDWORD ndst) = {
    683683    cvtSS88C,   cvtSM88C,   cvtMS88C,   cvtMM88C,
    684     cvtSS816C,  cvtSM816C,  cvtMS816C,  cvtMM816C,
    685     cvtSS168C,  cvtSM168C,  cvtMS168C,  cvtMM168C,
     684    cvtSS816C,  cvtSM816C,  cvtMS816C,  cvtMM816C,
     685    cvtSS168C,  cvtSM168C,  cvtMS168C,  cvtMM168C,
    686686    cvtSS1616C, cvtSM1616C, cvtMS1616C, cvtMM1616C,
    687687};
     
    691691 *
    692692 */
    693 static  LRESULT PCM_DriverDetails(PACMDRIVERDETAILSW add)
     693static  LRESULT PCM_DriverDetails(PACMDRIVERDETAILSW add)
    694694{
    695695    add->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC;
     
    712712                         add->szLicensing, sizeof(add->szLicensing)/sizeof(WCHAR) );
    713713    add->szFeatures[0] = 0;
    714 
     714   
    715715    return MMSYSERR_NOERROR;
    716716}
     
    720720 *
    721721 */
    722 static  LRESULT PCM_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery)
     722static  LRESULT PCM_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery)
    723723{
    724724    switch (dwQuery) {
    725725    case ACM_FORMATTAGDETAILSF_INDEX:
    726     if (aftd->dwFormatTagIndex != 0) return ACMERR_NOTPOSSIBLE;
    727     break;
    728     case ACM_FORMATTAGDETAILSF_FORMATTAG:
    729     if (aftd->dwFormatTag != WAVE_FORMAT_PCM) return ACMERR_NOTPOSSIBLE;
    730     break;
     726        if (aftd->dwFormatTagIndex != 0) return ACMERR_NOTPOSSIBLE;
     727        break;
     728    case ACM_FORMATTAGDETAILSF_FORMATTAG: 
     729        if (aftd->dwFormatTag != WAVE_FORMAT_PCM) return ACMERR_NOTPOSSIBLE;
     730        break;
    731731    case ACM_FORMATTAGDETAILSF_LARGESTSIZE:
    732     if (aftd->dwFormatTag != WAVE_FORMAT_UNKNOWN &&
    733         aftd->dwFormatTag != WAVE_FORMAT_UNKNOWN)
    734         return ACMERR_NOTPOSSIBLE;
    735     break;
     732        if (aftd->dwFormatTag != WAVE_FORMAT_UNKNOWN &&
     733            aftd->dwFormatTag != WAVE_FORMAT_UNKNOWN)
     734            return ACMERR_NOTPOSSIBLE;
     735        break;
    736736    default:
    737     WARN("Unsupported query %08lx\n", dwQuery);
    738     return MMSYSERR_NOTSUPPORTED;
    739     }
    740 
     737        WARN("Unsupported query %08lx\n", dwQuery);
     738        return MMSYSERR_NOTSUPPORTED;
     739    }
     740   
    741741    aftd->dwFormatTagIndex = 0;
    742742    aftd->dwFormatTag = WAVE_FORMAT_PCM;
     
    745745    aftd->cStandardFormats = NUM_PCM_FORMATS;
    746746    aftd->szFormatTag[0] = 0;
    747 
     747   
    748748    return MMSYSERR_NOERROR;
    749749}
     
    753753 *
    754754 */
    755 static  LRESULT PCM_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery)
     755static  LRESULT PCM_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery)
    756756{
    757757    switch (dwQuery) {
    758758    case ACM_FORMATDETAILSF_FORMAT:
    759     afd->dwFormatIndex = PCM_GetFormatIndex(afd->pwfx);
    760     if (afd->dwFormatIndex == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE;
    761     break;
     759        afd->dwFormatIndex = PCM_GetFormatIndex(afd->pwfx);
     760        if (afd->dwFormatIndex == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE;
     761        break;
    762762    case ACM_FORMATDETAILSF_INDEX:
    763     assert(afd->dwFormatIndex < NUM_PCM_FORMATS);
    764     afd->pwfx->wFormatTag = WAVE_FORMAT_PCM;
    765     afd->pwfx->nChannels = PCM_Formats[afd->dwFormatIndex].nChannels;
    766     afd->pwfx->nSamplesPerSec = PCM_Formats[afd->dwFormatIndex].rate;
    767     afd->pwfx->wBitsPerSample = PCM_Formats[afd->dwFormatIndex].nBits;
    768     /* native MSACM uses a PCMWAVEFORMAT structure, so cbSize is not accessible
    769      * afd->pwfx->cbSize = 0;
    770     */
    771     afd->pwfx->nBlockAlign =
    772         (afd->pwfx->nChannels * afd->pwfx->wBitsPerSample) / 8;
    773     afd->pwfx->nAvgBytesPerSec =
    774         afd->pwfx->nSamplesPerSec * afd->pwfx->nBlockAlign;
    775     break;
     763        assert(afd->dwFormatIndex < NUM_PCM_FORMATS);
     764        afd->pwfx->wFormatTag = WAVE_FORMAT_PCM;
     765        afd->pwfx->nChannels = PCM_Formats[afd->dwFormatIndex].nChannels;
     766        afd->pwfx->nSamplesPerSec = PCM_Formats[afd->dwFormatIndex].rate;
     767        afd->pwfx->wBitsPerSample = PCM_Formats[afd->dwFormatIndex].nBits;
     768        /* native MSACM uses a PCMWAVEFORMAT structure, so cbSize is not accessible
     769         * afd->pwfx->cbSize = 0;
     770        */
     771        afd->pwfx->nBlockAlign =
     772            (afd->pwfx->nChannels * afd->pwfx->wBitsPerSample) / 8;
     773        afd->pwfx->nAvgBytesPerSec =
     774            afd->pwfx->nSamplesPerSec * afd->pwfx->nBlockAlign;
     775        break;
    776776    default:
    777     WARN("Unsupported query %08lx\n", dwQuery);
    778     return MMSYSERR_NOTSUPPORTED;
    779     }
    780 
     777        WARN("Unsupported query %08lx\n", dwQuery);
     778        return MMSYSERR_NOTSUPPORTED;   
     779    }
     780   
    781781    afd->dwFormatTag = WAVE_FORMAT_PCM;
    782782    afd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CONVERTER;
    783783    afd->szFormat[0] = 0; /* let MSACM format this for us... */
    784 
     784   
    785785    return MMSYSERR_NOERROR;
    786786}
     
    790790 *
    791791 */
    792 static  LRESULT PCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
     792static  LRESULT PCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
    793793{
    794794    FIXME("(%p);\n", adfs);
     
    800800 *
    801801 */
    802 static  void    PCM_Reset(AcmPcmData* apd, int srcNumBits)
     802static  void    PCM_Reset(AcmPcmData* apd, int srcNumBits)
    803803{
    804804    apd->srcPos = 0;
     
    806806    /* initialize with neutral value */
    807807    if (srcNumBits == 16) {
    808     apd->last[0].s = 0;
    809     apd->last[1].s = 0;
     808        apd->last[0].s = 0;
     809        apd->last[1].s = 0;
    810810    } else {
    811     apd->last[0].b = (BYTE)0x80;
    812     apd->last[1].b = (BYTE)0x80;
     811        apd->last[0].b = (BYTE)0x80;
     812        apd->last[1].b = (BYTE)0x80;
    813813    }
    814814}
     
    818818 *
    819819 */
    820 static  LRESULT PCM_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
    821 {
    822     AcmPcmData* apd;
    823     int     idx = 0;
     820static  LRESULT PCM_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
     821{
     822    AcmPcmData* apd;
     823    int         idx = 0;
    824824
    825825    assert(!(adsi->fdwOpen & ACM_STREAMOPENF_ASYNC));
    826 
     826   
    827827    if (PCM_GetFormatIndex(adsi->pwfxSrc) == 0xFFFFFFFF ||
    828     PCM_GetFormatIndex(adsi->pwfxDst) == 0xFFFFFFFF)
    829     return ACMERR_NOTPOSSIBLE;
     828        PCM_GetFormatIndex(adsi->pwfxDst) == 0xFFFFFFFF)
     829        return ACMERR_NOTPOSSIBLE;
    830830
    831831    apd = HeapAlloc(GetProcessHeap(), 0, sizeof(AcmPcmData));
     
    834834    adsi->dwDriver = (DWORD)apd;
    835835    adsi->fdwDriver = 0;
    836 
     836   
    837837    if (adsi->pwfxSrc->wBitsPerSample == 16) idx += 8;
    838838    if (adsi->pwfxDst->wBitsPerSample == 16) idx += 4;
     
    841841
    842842    if (adsi->pwfxSrc->nSamplesPerSec == adsi->pwfxDst->nSamplesPerSec) {
    843     apd->cvt.cvtKeepRate = PCM_ConvertKeepRate[idx];
     843        apd->cvt.cvtKeepRate = PCM_ConvertKeepRate[idx];
    844844    } else {
    845     adsi->fdwDriver |= PCM_RESAMPLE;
    846     apd->dstIncr = (double)(adsi->pwfxSrc->nSamplesPerSec) /
    847         (double)(adsi->pwfxDst->nSamplesPerSec);
    848     PCM_Reset(apd, adsi->pwfxSrc->wBitsPerSample);
    849     apd->cvt.cvtChangeRate = PCM_ConvertChangeRate[idx];
     845        adsi->fdwDriver |= PCM_RESAMPLE;
     846        apd->dstIncr = (double)(adsi->pwfxSrc->nSamplesPerSec) /
     847            (double)(adsi->pwfxDst->nSamplesPerSec);
     848        PCM_Reset(apd, adsi->pwfxSrc->wBitsPerSample);
     849        apd->cvt.cvtChangeRate = PCM_ConvertChangeRate[idx];
    850850    }
    851851
     
    857857 *
    858858 */
    859 static  LRESULT PCM_StreamClose(PACMDRVSTREAMINSTANCE adsi)
     859static  LRESULT PCM_StreamClose(PACMDRVSTREAMINSTANCE adsi)
    860860{
    861861    HeapFree(GetProcessHeap(), 0, (void*)adsi->dwDriver);
     
    867867 *
    868868 */
    869 static  inline DWORD    PCM_round(DWORD a, DWORD b, DWORD c)
     869static  inline DWORD    PCM_round(DWORD a, DWORD b, DWORD c)
    870870{
    871871    assert(a && b && c);
     
    878878 *
    879879 */
    880 static  LRESULT PCM_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss)
     880static  LRESULT PCM_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss)
    881881{
    882882    switch (adss->fdwSize) {
    883883    case ACM_STREAMSIZEF_DESTINATION:
    884     /* cbDstLength => cbSrcLength */
    885     adss->cbSrcLength = PCM_round(adss->cbDstLength,
    886                       adsi->pwfxSrc->nAvgBytesPerSec,
    887                       adsi->pwfxDst->nAvgBytesPerSec);
    888     break;
     884        /* cbDstLength => cbSrcLength */
     885        adss->cbSrcLength = PCM_round(adss->cbDstLength,
     886                                      adsi->pwfxSrc->nAvgBytesPerSec,
     887                                      adsi->pwfxDst->nAvgBytesPerSec);
     888        break;
    889889    case ACM_STREAMSIZEF_SOURCE:
    890     /* cbSrcLength => cbDstLength */
    891     adss->cbDstLength =  PCM_round(adss->cbSrcLength,
    892                        adsi->pwfxDst->nAvgBytesPerSec,
    893                        adsi->pwfxSrc->nAvgBytesPerSec);
    894     break;
     890        /* cbSrcLength => cbDstLength */
     891        adss->cbDstLength =  PCM_round(adss->cbSrcLength,
     892                                       adsi->pwfxDst->nAvgBytesPerSec,
     893                                       adsi->pwfxSrc->nAvgBytesPerSec);
     894        break;
    895895    default:
    896     WARN("Unsupported query %08lx\n", adss->fdwSize);
    897     return MMSYSERR_NOTSUPPORTED;
     896        WARN("Unsupported query %08lx\n", adss->fdwSize);
     897        return MMSYSERR_NOTSUPPORTED;   
    898898    }
    899899    return MMSYSERR_NOERROR;
     
    906906static LRESULT PCM_StreamConvert(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMHEADER adsh)
    907907{
    908     AcmPcmData* apd = (AcmPcmData*)adsi->dwDriver;
    909     DWORD   nsrc = NUM_OF(adsh->cbSrcLength, adsi->pwfxSrc->nBlockAlign);
    910     DWORD   ndst = NUM_OF(adsh->cbDstLength, adsi->pwfxDst->nBlockAlign);
    911 
    912     if (adsh->fdwConvert &
    913     ~(ACM_STREAMCONVERTF_BLOCKALIGN|
    914       ACM_STREAMCONVERTF_END|
    915       ACM_STREAMCONVERTF_START)) {
    916     FIXME("Unsupported fdwConvert (%08lx), ignoring it\n", adsh->fdwConvert);
     908    AcmPcmData* apd = (AcmPcmData*)adsi->dwDriver;
     909    DWORD       nsrc = NUM_OF(adsh->cbSrcLength, adsi->pwfxSrc->nBlockAlign);
     910    DWORD       ndst = NUM_OF(adsh->cbDstLength, adsi->pwfxDst->nBlockAlign);
     911
     912    if (adsh->fdwConvert & 
     913        ~(ACM_STREAMCONVERTF_BLOCKALIGN|
     914          ACM_STREAMCONVERTF_END|
     915          ACM_STREAMCONVERTF_START)) {
     916        FIXME("Unsupported fdwConvert (%08lx), ignoring it\n", adsh->fdwConvert);
    917917    }
    918918    /* ACM_STREAMCONVERTF_BLOCKALIGN
    919      *  currently all conversions are block aligned, so do nothing for this flag
     919     *  currently all conversions are block aligned, so do nothing for this flag
    920920     * ACM_STREAMCONVERTF_END
    921      *  no pending data, so do nothing for this flag
     921     *  no pending data, so do nothing for this flag
    922922     */
    923     if ((adsh->fdwConvert & ACM_STREAMCONVERTF_START) &&
    924     (adsi->fdwDriver & PCM_RESAMPLE)) {
    925     PCM_Reset(apd, adsi->pwfxSrc->wBitsPerSample);
     923    if ((adsh->fdwConvert & ACM_STREAMCONVERTF_START) && 
     924        (adsi->fdwDriver & PCM_RESAMPLE)) {
     925        PCM_Reset(apd, adsi->pwfxSrc->wBitsPerSample);
    926926    }
    927927
    928928    /* do the job */
    929929    if (adsi->fdwDriver & PCM_RESAMPLE) {
    930     DWORD   nsrc2 = nsrc;
    931     DWORD   ndst2 = ndst;
    932 
    933     apd->cvt.cvtChangeRate(apd, adsh->pbSrc, &nsrc2, adsh->pbDst, &ndst2);
    934     nsrc -= nsrc2;
    935     ndst -= ndst2;
     930        DWORD   nsrc2 = nsrc;
     931        DWORD   ndst2 = ndst;
     932
     933        apd->cvt.cvtChangeRate(apd, adsh->pbSrc, &nsrc2, adsh->pbDst, &ndst2);
     934        nsrc -= nsrc2;
     935        ndst -= ndst2;
    936936    } else {
    937     if (nsrc < ndst) ndst = nsrc; else nsrc = ndst;
    938 
    939     /* nsrc is now equal to ndst */
    940     apd->cvt.cvtKeepRate(adsh->pbSrc, nsrc, adsh->pbDst);
     937        if (nsrc < ndst) ndst = nsrc; else nsrc = ndst;
     938
     939        /* nsrc is now equal to ndst */
     940        apd->cvt.cvtKeepRate(adsh->pbSrc, nsrc, adsh->pbDst);
    941941    }
    942942
     
    948948
    949949/**************************************************************************
    950  *          PCM_DriverProc          [exported]
    951  */
    952 LRESULT CALLBACK    PCM_DriverProc(DWORD dwDevID, HDRVR hDriv, UINT wMsg,
    953                        LPARAM dwParam1, LPARAM dwParam2)
    954 {
    955     TRACE("(%08lx %08lx %u %08lx %08lx);\n",
    956       dwDevID, (DWORD)hDriv, wMsg, dwParam1, dwParam2);
    957 
     950 *                      PCM_DriverProc                  [exported]
     951 */
     952LRESULT CALLBACK        PCM_DriverProc(DWORD dwDevID, HDRVR hDriv, UINT wMsg,
     953                                       LPARAM dwParam1, LPARAM dwParam2)
     954{
     955    TRACE("(%08lx %08lx %u %08lx %08lx);\n", 
     956          dwDevID, (DWORD)hDriv, wMsg, dwParam1, dwParam2);
     957   
    958958    switch (wMsg) {
    959     case DRV_LOAD:      return 1;
    960     case DRV_FREE:      return 1;
    961     case DRV_OPEN:      return PCM_drvOpen((LPSTR)dwParam1);
    962     case DRV_CLOSE:     return PCM_drvClose(dwDevID);
    963     case DRV_ENABLE:        return 1;
    964     case DRV_DISABLE:       return 1;
    965     case DRV_QUERYCONFIGURE:    return 1;
    966     case DRV_CONFIGURE:     MessageBoxA(0, "MSACM PCM filter !", "Wine Driver", MB_OK); return 1;
    967     case DRV_INSTALL:       return DRVCNF_RESTART;
    968     case DRV_REMOVE:        return DRVCNF_RESTART;
    969 
     959    case DRV_LOAD:              return 1;
     960    case DRV_FREE:              return 1;
     961    case DRV_OPEN:              return PCM_drvOpen((LPSTR)dwParam1);
     962    case DRV_CLOSE:             return PCM_drvClose(dwDevID);
     963    case DRV_ENABLE:            return 1;       
     964    case DRV_DISABLE:           return 1;
     965    case DRV_QUERYCONFIGURE:    return 1;
     966    case DRV_CONFIGURE:         MessageBoxA(0, "MSACM PCM filter !", "Wine Driver", MB_OK); return 1;
     967    case DRV_INSTALL:           return DRVCNF_RESTART;
     968    case DRV_REMOVE:            return DRVCNF_RESTART;
     969       
    970970    case ACMDM_DRIVER_NOTIFY:
    971     /* no caching from other ACM drivers is done so far */
    972     return MMSYSERR_NOERROR;
    973 
     971        /* no caching from other ACM drivers is done so far */
     972        return MMSYSERR_NOERROR;
     973       
    974974    case ACMDM_DRIVER_DETAILS:
    975     return PCM_DriverDetails((PACMDRIVERDETAILSW)dwParam1);
    976 
     975        return PCM_DriverDetails((PACMDRIVERDETAILSW)dwParam1);
     976       
    977977    case ACMDM_FORMATTAG_DETAILS:
    978     return PCM_FormatTagDetails((PACMFORMATTAGDETAILSW)dwParam1, dwParam2);
    979 
     978        return PCM_FormatTagDetails((PACMFORMATTAGDETAILSW)dwParam1, dwParam2);
     979       
    980980    case ACMDM_FORMAT_DETAILS:
    981     return PCM_FormatDetails((PACMFORMATDETAILSW)dwParam1, dwParam2);
    982 
     981        return PCM_FormatDetails((PACMFORMATDETAILSW)dwParam1, dwParam2);
     982       
    983983    case ACMDM_FORMAT_SUGGEST:
    984     return PCM_FormatSuggest((PACMDRVFORMATSUGGEST)dwParam1);
    985 
     984        return PCM_FormatSuggest((PACMDRVFORMATSUGGEST)dwParam1);
     985       
    986986    case ACMDM_STREAM_OPEN:
    987     return PCM_StreamOpen((PACMDRVSTREAMINSTANCE)dwParam1);
    988 
     987        return PCM_StreamOpen((PACMDRVSTREAMINSTANCE)dwParam1);
     988       
    989989    case ACMDM_STREAM_CLOSE:
    990     return PCM_StreamClose((PACMDRVSTREAMINSTANCE)dwParam1);
    991 
     990        return PCM_StreamClose((PACMDRVSTREAMINSTANCE)dwParam1);
     991       
    992992    case ACMDM_STREAM_SIZE:
    993     return PCM_StreamSize((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMSIZE)dwParam2);
    994 
     993        return PCM_StreamSize((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMSIZE)dwParam2);
     994       
    995995    case ACMDM_STREAM_CONVERT:
    996     return PCM_StreamConvert((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMHEADER)dwParam2);
    997 
     996        return PCM_StreamConvert((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMHEADER)dwParam2);
     997       
    998998    case ACMDM_HARDWARE_WAVE_CAPS_INPUT:
    999999    case ACMDM_HARDWARE_WAVE_CAPS_OUTPUT:
    1000     /* this converter is not a hardware driver */
     1000        /* this converter is not a hardware driver */
    10011001    case ACMDM_FILTERTAG_DETAILS:
    10021002    case ACMDM_FILTER_DETAILS:
    1003     /* this converter is not a filter */
     1003        /* this converter is not a filter */
    10041004    case ACMDM_STREAM_RESET:
    1005     /* only needed for asynchronous driver... we aren't, so just say it */
     1005        /* only needed for asynchronous driver... we aren't, so just say it */
    10061006    case ACMDM_STREAM_PREPARE:
    10071007    case ACMDM_STREAM_UNPREPARE:
    1008     /* nothing special to do here... so don't do anything */
    1009     return MMSYSERR_NOTSUPPORTED;
    1010 
     1008        /* nothing special to do here... so don't do anything */
     1009        return MMSYSERR_NOTSUPPORTED;
     1010       
    10111011    default:
    1012     return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     1012        return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
    10131013    }
    10141014    return 0;
  • trunk/src/msacm32/stream.c

    r6648 r6712  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 /* $Id: stream.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
     2
    33/*
    44 *      MSACM32 library
    55 *
    66 *      Copyright 1998  Patrik Stridvall
    7  *        1999  Eric Pouech
     7 *                1999  Eric Pouech
    88 */
    99
    1010/* TODO
    11  *  + asynchronous conversion is not implemented
    12  *  + callback/notification
    13  *  * acmStreamMessage
    14  *  + properly close ACM streams
     11 *      + asynchronous conversion is not implemented
     12 *      + callback/notification
     13 *      * acmStreamMessage
     14 *      + properly close ACM streams
    1515 */
    1616
     
    2626
    2727DEFAULT_DEBUG_CHANNEL(msacm);
    28 
    29 static PWINE_ACMSTREAM  ACM_GetStream(HACMSTREAM has)
     28   
     29static PWINE_ACMSTREAM  ACM_GetStream(HACMSTREAM has)
    3030{
    3131    return (PWINE_ACMSTREAM)has;
     
    3737MMRESULT WINAPI acmStreamClose(HACMSTREAM has, DWORD fdwClose)
    3838{
    39     PWINE_ACMSTREAM was;
    40     MMRESULT        ret;
    41 
     39    PWINE_ACMSTREAM     was;
     40    MMRESULT            ret;
     41               
    4242    TRACE("(0x%08x, %ld)\n", has, fdwClose);
    43 
     43   
    4444    if ((was = ACM_GetStream(has)) == NULL) {
    45     return MMSYSERR_INVALHANDLE;
     45        return MMSYSERR_INVALHANDLE;
    4646    }
    4747    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_CLOSE, (DWORD)&was->drvInst, 0);
    4848    if (ret == MMSYSERR_NOERROR) {
    49     if (was->hAcmDriver)
    50         acmDriverClose(was->hAcmDriver, 0L);
    51     HeapFree(MSACM_hHeap, 0, was);
     49        if (was->hAcmDriver)
     50            acmDriverClose(was->hAcmDriver, 0L);       
     51        HeapFree(MSACM_hHeap, 0, was);
    5252    }
    5353    TRACE("=> (%d)\n", ret);
     
    5858 *           acmStreamConvert (MSACM32.38)
    5959 */
    60 MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash,
    61                 DWORD fdwConvert)
    62 {
    63     PWINE_ACMSTREAM was;
    64     MMRESULT        ret = MMSYSERR_NOERROR;
    65     PACMDRVSTREAMHEADER padsh;
     60MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash, 
     61                                DWORD fdwConvert)
     62{
     63    PWINE_ACMSTREAM     was;
     64    MMRESULT            ret = MMSYSERR_NOERROR;
     65    PACMDRVSTREAMHEADER padsh;
    6666
    6767    TRACE("(0x%08x, %p, %ld)\n", has, pash, fdwConvert);
    68 
     68   
    6969    if ((was = ACM_GetStream(has)) == NULL)
    70     return MMSYSERR_INVALHANDLE;
     70        return MMSYSERR_INVALHANDLE;
    7171    if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER))
    72     return MMSYSERR_INVALPARAM;
     72        return MMSYSERR_INVALPARAM;
    7373
    7474    if (!(pash->fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED))
    75     return ACMERR_UNPREPARED;
     75        return ACMERR_UNPREPARED;
    7676
    7777    /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
     
    8383    /* check that pointers have not been modified */
    8484    if (padsh->pbPreparedSrc != padsh->pbSrc ||
    85     padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
    86     padsh->pbPreparedDst != padsh->pbDst ||
    87     padsh->cbPreparedDstLength < padsh->cbDstLength) {
    88     return MMSYSERR_INVALPARAM;
    89     }
     85        padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
     86        padsh->pbPreparedDst != padsh->pbDst ||
     87        padsh->cbPreparedDstLength < padsh->cbDstLength) {
     88        return MMSYSERR_INVALPARAM;
     89    }   
    9090
    9191    padsh->fdwConvert = fdwConvert;
     
    9393    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_CONVERT, (DWORD)&was->drvInst, (DWORD)padsh);
    9494    if (ret == MMSYSERR_NOERROR) {
    95     padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_DONE;
     95        padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_DONE;
    9696    }
    9797    TRACE("=> (%d)\n", ret);
     
    102102 *           acmStreamMessage (MSACM32.39)
    103103 */
    104 MMRESULT WINAPI acmStreamMessage(HACMSTREAM has, UINT uMsg, LPARAM lParam1,
    105                 LPARAM lParam2)
     104MMRESULT WINAPI acmStreamMessage(HACMSTREAM has, UINT uMsg, LPARAM lParam1, 
     105                                LPARAM lParam2)
    106106{
    107107    FIXME("(0x%08x, %u, %ld, %ld): stub\n", has, uMsg, lParam1, lParam2);
     
    114114 */
    115115MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc,
    116                   PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback,
    117                   DWORD dwInstance, DWORD fdwOpen)
    118 {
    119     PWINE_ACMSTREAM was;
    120     PWINE_ACMDRIVER wad;
    121     MMRESULT        ret;
    122     int         wfxSrcSize;
    123     int         wfxDstSize;
    124 
     116                              PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback,
     117                              DWORD dwInstance, DWORD fdwOpen)
     118{
     119    PWINE_ACMSTREAM     was;
     120    PWINE_ACMDRIVER     wad;
     121    MMRESULT            ret;
     122    int                 wfxSrcSize;
     123    int                 wfxDstSize;
     124   
    125125    TRACE("(%p, 0x%08x, %p, %p, %p, %ld, %ld, %ld)\n",
    126       phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen);
    127 
    128     TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n",
    129       pwfxSrc->wFormatTag, pwfxSrc->nChannels, pwfxSrc->nSamplesPerSec, pwfxSrc->nAvgBytesPerSec,
    130       pwfxSrc->nBlockAlign, pwfxSrc->wBitsPerSample, pwfxSrc->cbSize);
    131 
    132     TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n",
    133       pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec,
    134       pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize);
     126          phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen);
     127
     128    TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", 
     129          pwfxSrc->wFormatTag, pwfxSrc->nChannels, pwfxSrc->nSamplesPerSec, pwfxSrc->nAvgBytesPerSec,
     130          pwfxSrc->nBlockAlign, pwfxSrc->wBitsPerSample, pwfxSrc->cbSize);
     131
     132    TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", 
     133          pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec,
     134          pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize);
    135135
    136136    if ((fdwOpen & ACM_STREAMOPENF_QUERY) && phas) return MMSYSERR_INVALPARAM;
     
    143143    was = HeapAlloc(MSACM_hHeap, 0, sizeof(*was) + wfxSrcSize + wfxDstSize + ((pwfltr) ? sizeof(WAVEFILTER) : 0));
    144144    if (was == NULL)
    145     return MMSYSERR_NOMEM;
    146 
     145        return MMSYSERR_NOMEM;
     146   
    147147    was->drvInst.cbStruct = sizeof(was->drvInst);
    148148    was->drvInst.pwfxSrc = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was));
     
    151151    memcpy(was->drvInst.pwfxDst, pwfxDst, wfxDstSize);
    152152    if (pwfltr) {
    153     was->drvInst.pwfltr = (PWAVEFILTER)((LPSTR)was + sizeof(*was) + wfxSrcSize + wfxDstSize);
    154     memcpy(was->drvInst.pwfltr, pwfltr, sizeof(WAVEFILTER));
     153        was->drvInst.pwfltr = (PWAVEFILTER)((LPSTR)was + sizeof(*was) + wfxSrcSize + wfxDstSize);
     154        memcpy(was->drvInst.pwfltr, pwfltr, sizeof(WAVEFILTER));
    155155    } else {
    156     was->drvInst.pwfltr = NULL;
    157     }
    158     was->drvInst.dwCallback = dwCallback;
     156        was->drvInst.pwfltr = NULL;
     157    }
     158    was->drvInst.dwCallback = dwCallback;   
    159159    was->drvInst.dwInstance = dwInstance;
    160160    was->drvInst.fdwOpen = fdwOpen;
    161     was->drvInst.fdwDriver = 0L;
    162     was->drvInst.dwDriver = 0L;
     161    was->drvInst.fdwDriver = 0L; 
     162    was->drvInst.dwDriver = 0L;     
    163163    was->drvInst.has = (HACMSTREAM)was;
    164 
     164   
    165165    if (had) {
    166     if (!(wad = MSACM_GetDriver(had))) {
    167         ret = MMSYSERR_INVALPARAM;
    168         goto errCleanUp;
    169     }
    170 
    171     was->obj.dwType = WINE_ACMOBJ_STREAM;
    172     was->obj.pACMDriverID = wad->obj.pACMDriverID;
    173     was->pDrv = wad;
    174     was->hAcmDriver = 0; /* not to close it in acmStreamClose */
    175 
    176     ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
    177     if (ret != MMSYSERR_NOERROR)
    178         goto errCleanUp;
     166        if (!(wad = MSACM_GetDriver(had))) {
     167            ret = MMSYSERR_INVALPARAM;
     168            goto errCleanUp;
     169        }
     170       
     171        was->obj.dwType = WINE_ACMOBJ_STREAM;
     172        was->obj.pACMDriverID = wad->obj.pACMDriverID;
     173        was->pDrv = wad;
     174        was->hAcmDriver = 0; /* not to close it in acmStreamClose */
     175
     176        ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
     177        if (ret != MMSYSERR_NOERROR)
     178            goto errCleanUp;
    179179    } else {
    180     PWINE_ACMDRIVERID wadi;
    181 
    182     ret = ACMERR_NOTPOSSIBLE;
    183     for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID) {
    184         ret = acmDriverOpen(&had, (HACMDRIVERID)wadi, 0L);
    185         if (ret == MMSYSERR_NOERROR) {
    186         if ((wad = MSACM_GetDriver(had)) != 0) {
    187             was->obj.dwType = WINE_ACMOBJ_STREAM;
    188             was->obj.pACMDriverID = wad->obj.pACMDriverID;
    189             was->pDrv = wad;
    190             was->hAcmDriver = had;
    191 
    192             ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
    193             if (ret == MMSYSERR_NOERROR) {
    194             if (fdwOpen & ACM_STREAMOPENF_QUERY) {
    195                 acmDriverClose(had, 0L);
    196             }
    197             break;
    198             }
    199         }
    200         /* no match, close this acm driver and try next one */
    201         acmDriverClose(had, 0L);
    202         }
    203     }
    204     if (ret != MMSYSERR_NOERROR) {
    205         ret = ACMERR_NOTPOSSIBLE;
    206         goto errCleanUp;
    207     }
     180        PWINE_ACMDRIVERID wadi;
     181       
     182        ret = ACMERR_NOTPOSSIBLE;
     183        for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID) {
     184            ret = acmDriverOpen(&had, (HACMDRIVERID)wadi, 0L);
     185            if (ret == MMSYSERR_NOERROR) {
     186                if ((wad = MSACM_GetDriver(had)) != 0) {
     187                    was->obj.dwType = WINE_ACMOBJ_STREAM;
     188                    was->obj.pACMDriverID = wad->obj.pACMDriverID;
     189                    was->pDrv = wad;
     190                    was->hAcmDriver = had;
     191                   
     192                    ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
     193                    if (ret == MMSYSERR_NOERROR) {
     194                        if (fdwOpen & ACM_STREAMOPENF_QUERY) {
     195                            acmDriverClose(had, 0L);
     196                        }
     197                        break;
     198                    }
     199                }
     200                /* no match, close this acm driver and try next one */
     201                acmDriverClose(had, 0L);
     202            }
     203        }
     204        if (ret != MMSYSERR_NOERROR) {
     205            ret = ACMERR_NOTPOSSIBLE;
     206            goto errCleanUp;
     207        }
    208208    }
    209209    ret = MMSYSERR_NOERROR;
    210210    if (!(fdwOpen & ACM_STREAMOPENF_QUERY)) {
     211        if (phas)
     212            *phas = (HACMSTREAM)was;
     213        TRACE("=> (%d)\n", ret);
     214        return ret;
     215    }
     216errCleanUp:             
    211217    if (phas)
    212         *phas = (HACMSTREAM)was;
    213     TRACE("=> (%d)\n", ret);
    214     return ret;
    215     }
    216 errCleanUp:
    217     if (phas)
    218     *phas = (HACMSTREAM)0;
     218        *phas = (HACMSTREAM)0;
    219219    HeapFree(MSACM_hHeap, 0, was);
    220220    TRACE("=> (%d)\n", ret);
     
    226226 *           acmStreamPrepareHeader (MSACM32.41)
    227227 */
    228 MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
    229                        DWORD fdwPrepare)
    230 {
    231     PWINE_ACMSTREAM was;
    232     MMRESULT        ret = MMSYSERR_NOERROR;
    233     PACMDRVSTREAMHEADER padsh;
     228MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, 
     229                                       DWORD fdwPrepare)
     230{
     231    PWINE_ACMSTREAM     was;
     232    MMRESULT            ret = MMSYSERR_NOERROR;
     233    PACMDRVSTREAMHEADER padsh;
    234234
    235235    TRACE("(0x%08x, %p, %ld)\n", has, pash, fdwPrepare);
    236 
     236   
    237237    if ((was = ACM_GetStream(has)) == NULL)
    238     return MMSYSERR_INVALHANDLE;
     238        return MMSYSERR_INVALHANDLE;
    239239    if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER))
    240     return MMSYSERR_INVALPARAM;
     240        return MMSYSERR_INVALPARAM;
    241241    if (fdwPrepare)
    242     ret = MMSYSERR_INVALFLAG;
     242        ret = MMSYSERR_INVALFLAG;
    243243
    244244    if (pash->fdwStatus & ACMSTREAMHEADER_STATUSF_DONE)
    245     return MMSYSERR_NOERROR;
     245        return MMSYSERR_NOERROR;
    246246
    247247    /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
     
    264264    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_PREPARE, (DWORD)&was->drvInst, (DWORD)padsh);
    265265    if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) {
    266     ret = MMSYSERR_NOERROR;
    267     padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE);
    268     padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_PREPARED;
    269     padsh->fdwPrepared = padsh->fdwStatus;
    270     padsh->dwPrepared = 0;
    271     padsh->pbPreparedSrc = padsh->pbSrc;
    272     padsh->cbPreparedSrcLength = padsh->cbSrcLength;
    273     padsh->pbPreparedDst = padsh->pbDst;
    274     padsh->cbPreparedDstLength = padsh->cbDstLength;
     266        ret = MMSYSERR_NOERROR;
     267        padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE);
     268        padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_PREPARED;
     269        padsh->fdwPrepared = padsh->fdwStatus;
     270        padsh->dwPrepared = 0;
     271        padsh->pbPreparedSrc = padsh->pbSrc;
     272        padsh->cbPreparedSrcLength = padsh->cbSrcLength;
     273        padsh->pbPreparedDst = padsh->pbDst;
     274        padsh->cbPreparedDstLength = padsh->cbDstLength;
    275275    } else {
    276     padsh->fdwPrepared = 0;
    277     padsh->dwPrepared = 0;
    278     padsh->pbPreparedSrc = 0;
    279     padsh->cbPreparedSrcLength = 0;
    280     padsh->pbPreparedDst = 0;
    281     padsh->cbPreparedDstLength = 0;
     276        padsh->fdwPrepared = 0;
     277        padsh->dwPrepared = 0;
     278        padsh->pbPreparedSrc = 0;
     279        padsh->cbPreparedSrcLength = 0;
     280        padsh->pbPreparedDst = 0;
     281        padsh->cbPreparedDstLength = 0;
    282282    }
    283283    TRACE("=> (%d)\n", ret);
     
    290290MMRESULT WINAPI acmStreamReset(HACMSTREAM has, DWORD fdwReset)
    291291{
    292     PWINE_ACMSTREAM was;
    293     MMRESULT        ret = MMSYSERR_NOERROR;
     292    PWINE_ACMSTREAM     was;
     293    MMRESULT            ret = MMSYSERR_NOERROR;
    294294
    295295    TRACE("(0x%08x, %ld)\n", has, fdwReset);
    296296
    297297    if (fdwReset) {
    298     ret = MMSYSERR_INVALFLAG;
     298        ret = MMSYSERR_INVALFLAG;
    299299    } else if ((was = ACM_GetStream(has)) == NULL) {
    300     return MMSYSERR_INVALHANDLE;
     300        return MMSYSERR_INVALHANDLE;
    301301    } else if (was->drvInst.fdwOpen & ACM_STREAMOPENF_ASYNC) {
    302     ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_RESET, (DWORD)&was->drvInst, 0);
     302        ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_RESET, (DWORD)&was->drvInst, 0);
    303303    }
    304304    TRACE("=> (%d)\n", ret);
     
    309309 *           acmStreamSize (MSACM32.43)
    310310 */
    311 MMRESULT WINAPI acmStreamSize(HACMSTREAM has, DWORD cbInput,
    312                   LPDWORD pdwOutputBytes, DWORD fdwSize)
    313 {
    314     PWINE_ACMSTREAM was;
    315     ACMDRVSTREAMSIZE    adss;
    316     MMRESULT        ret;
    317 
     311MMRESULT WINAPI acmStreamSize(HACMSTREAM has, DWORD cbInput, 
     312                              LPDWORD pdwOutputBytes, DWORD fdwSize)
     313{
     314    PWINE_ACMSTREAM     was;
     315    ACMDRVSTREAMSIZE    adss;
     316    MMRESULT            ret;
     317   
    318318    TRACE("(0x%08x, %ld, %p, %ld)\n", has, cbInput, pdwOutputBytes, fdwSize);
    319 
     319   
    320320    if ((was = ACM_GetStream(has)) == NULL) {
    321     return MMSYSERR_INVALHANDLE;
     321        return MMSYSERR_INVALHANDLE;
    322322    }
    323323    if ((fdwSize & ~ACM_STREAMSIZEF_QUERYMASK) != 0) {
    324     return MMSYSERR_INVALFLAG;
     324        return MMSYSERR_INVALFLAG;
    325325    }
    326326
    327327    *pdwOutputBytes = 0L;
    328 
     328   
    329329    switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) {
    330330    case ACM_STREAMSIZEF_DESTINATION:
    331     adss.cbDstLength = cbInput;
    332     adss.cbSrcLength = 0;
    333     break;
     331        adss.cbDstLength = cbInput;
     332        adss.cbSrcLength = 0;
     333        break;
    334334    case ACM_STREAMSIZEF_SOURCE:
    335     adss.cbSrcLength = cbInput;
    336     adss.cbDstLength = 0;
    337     break;
    338     default:
    339     return MMSYSERR_INVALFLAG;
    340     }
    341 
     335        adss.cbSrcLength = cbInput;
     336        adss.cbDstLength = 0;
     337        break;
     338    default:   
     339        return MMSYSERR_INVALFLAG;
     340    }
     341   
    342342    adss.cbStruct = sizeof(adss);
    343343    adss.fdwSize = fdwSize;
    344     ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_SIZE,
    345                 (DWORD)&was->drvInst, (DWORD)&adss);
     344    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_SIZE, 
     345                            (DWORD)&was->drvInst, (DWORD)&adss);
    346346    if (ret == MMSYSERR_NOERROR) {
    347     switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) {
    348     case ACM_STREAMSIZEF_DESTINATION:
    349         *pdwOutputBytes = adss.cbSrcLength;
    350         break;
    351     case ACM_STREAMSIZEF_SOURCE:
    352         *pdwOutputBytes = adss.cbDstLength;
    353         break;
    354     }
     347        switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) {
     348        case ACM_STREAMSIZEF_DESTINATION:
     349            *pdwOutputBytes = adss.cbSrcLength;
     350            break;
     351        case ACM_STREAMSIZEF_SOURCE:
     352            *pdwOutputBytes = adss.cbDstLength;
     353            break;
     354        }
    355355    }
    356356    TRACE("=> (%d) [%lu]\n", ret, *pdwOutputBytes);
     
    361361 *           acmStreamUnprepareHeader (MSACM32.44)
    362362 */
    363 MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
    364                     DWORD fdwUnprepare)
    365 {
    366     PWINE_ACMSTREAM was;
    367     MMRESULT        ret = MMSYSERR_NOERROR;
    368     PACMDRVSTREAMHEADER padsh;
     363MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, 
     364                                        DWORD fdwUnprepare)
     365{
     366    PWINE_ACMSTREAM     was;
     367    MMRESULT            ret = MMSYSERR_NOERROR;
     368    PACMDRVSTREAMHEADER padsh;
    369369
    370370    TRACE("(0x%08x, %p, %ld)\n", has, pash, fdwUnprepare);
    371 
     371   
    372372    if ((was = ACM_GetStream(has)) == NULL)
    373     return MMSYSERR_INVALHANDLE;
     373        return MMSYSERR_INVALHANDLE;
    374374    if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER))
    375     return MMSYSERR_INVALPARAM;
     375        return MMSYSERR_INVALPARAM;
    376376
    377377    if (!(pash->fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED))
    378     return ACMERR_UNPREPARED;
     378        return ACMERR_UNPREPARED;
    379379
    380380    /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
     
    386386    /* check that pointers have not been modified */
    387387    if (padsh->pbPreparedSrc != padsh->pbSrc ||
    388     padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
    389     padsh->pbPreparedDst != padsh->pbDst ||
    390     padsh->cbPreparedDstLength < padsh->cbDstLength) {
    391     return MMSYSERR_INVALPARAM;
    392     }
     388        padsh->cbPreparedSrcLength < padsh->cbSrcLength ||
     389        padsh->pbPreparedDst != padsh->pbDst ||
     390        padsh->cbPreparedDstLength < padsh->cbDstLength) {
     391        return MMSYSERR_INVALPARAM;
     392    }   
    393393
    394394    padsh->fdwConvert = fdwUnprepare;
     
    396396    ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_UNPREPARE, (DWORD)&was->drvInst, (DWORD)padsh);
    397397    if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) {
    398     ret = MMSYSERR_NOERROR;
    399     padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE|ACMSTREAMHEADER_STATUSF_PREPARED);
    400     }
    401     TRACE("=> (%d)\n", ret);
    402     return ret;
    403 }
     398        ret = MMSYSERR_NOERROR;
     399        padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE|ACMSTREAMHEADER_STATUSF_PREPARED);
     400    }
     401    TRACE("=> (%d)\n", ret);
     402    return ret;
     403}
  • trunk/src/msacm32/wineacm.h

    r5434 r6712  
    33#define __WINE_WINEACM_H
    44
    5 #ifndef __WIN32OS2__
     5#ifdef __WIN32OS2__
     6#include "windef.h"
     7#else
    68#include "wine/windef16.h"
    79#include "wine/mmsystem16.h"
Note: See TracChangeset for help on using the changeset viewer.