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

Added $Id:$ keyword.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.