Changeset 6648 for trunk/src/msacm32


Ignore:
Timestamp:
Sep 5, 2001, 3:19:02 PM (24 years ago)
Author:
bird
Message:

Added $Id:$ keyword.

Location:
trunk/src/msacm32
Files:
8 edited

Legend:

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

    r5434 r6648  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 
     2/* $Id: driver.c,v 1.2 2001-09-05 13:11:25 bird Exp $ */
    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    
     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
    332332    RegCloseKey(hPriorityKey);
    333    
     333
    334334    return MMSYSERR_ERROR;
    335335}
     
    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

    r5434 r6648  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 
     2/* $Id: filter.c,v 1.2 2001-09-05 13:11:25 bird Exp $ */
    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);
    235         return MMSYSERR_NOERROR;
     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;
    236236    }
    237237    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;
     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;
    245245    }
    246246    return MMSYSERR_NOERROR;
     
    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

    r5434 r6648  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 
     2/* $Id: format.c,v 1.2 2001-09-05 13:11:25 bird Exp $ */
    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);
    503         return MMSYSERR_NOERROR;
     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;
    504504    }
    505505    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;
     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;
    513513    }
    514514    return MMSYSERR_NOERROR;
     
    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

    r5135 r6648  
    1 /*
     1/* $Id: initterm.cpp,v 1.7 2001-09-05 13:11:25 bird Exp $
     2 *
    23 * DLL entry point
    34 *
     
    5354   case DLL_THREAD_ATTACH:
    5455   case DLL_THREAD_DETACH:
    55         return MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
     56    return MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
    5657
    5758   case DLL_PROCESS_DETACH:
    58         MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
    59         ctordtorTerm();
    60         return TRUE;
     59    MSACM32_LibMain(hinstDLL, fdwReason, fImpLoad);
     60    ctordtorTerm();
     61    return TRUE;
    6162   }
    6263   return FALSE;
     
    8889         CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed  98-03-18 05:28:48*/
    8990
    90         dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
    91          if(dllHandle == 0) 
    92                 return 0UL;
     91    dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
     92         if(dllHandle == 0)
     93        return 0UL;
    9394
    9495         break;
    9596      case 1 :
    9697         if(dllHandle) {
    97                 UnregisterLxDll(dllHandle);
     98        UnregisterLxDll(dllHandle);
    9899         }
    99100         break;
  • trunk/src/msacm32/internal.c

    r5434 r6648  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 
     2/* $Id: internal.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
    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 */
    107         }
     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 */
    108107    }
    109    
     108    }
     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

    r5434 r6648  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 
     2/* $Id: msacm32_main.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
    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;
    155    
     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
    156156    case ACM_METRIC_MAX_SIZE_FORMAT:
    157         {
    158             ACMFORMATTAGDETAILSW        aftd;
     157    {
     158        ACMFORMATTAGDETAILSW    aftd;
    159159
    160             aftd.cbStruct = sizeof(aftd);
    161             aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
     160        aftd.cbStruct = sizeof(aftd);
     161        aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
    162162
    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

    r5434 r6648  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 
     2/* $Id: pcmconverter.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
    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

    r5434 r6648  
    11/* -*- tab-width: 8; c-basic-offset: 4 -*- */
    2 
     2/* $Id: stream.c,v 1.2 2001-09-05 13:11:26 bird Exp $ */
    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     }
    216 errCleanUp:             
    217211    if (phas)
    218         *phas = (HACMSTREAM)0;
     212        *phas = (HACMSTREAM)was;
     213    TRACE("=> (%d)\n", ret);
     214    return ret;
     215    }
     216errCleanUp:
     217    if (phas)
     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}
Note: See TracChangeset for help on using the changeset viewer.