home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / audio / acmapp / aachoose.c next >
C/C++ Source or Header  |  1997-10-05  |  71KB  |  2,561 lines

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. //  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. //  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. //  PURPOSE.
  7. //
  8. //  Copyright (C) 1992 - 1997 Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. //  aachoose.c
  13. //
  14. //  Description:
  15. //      Contains dialog procedures and user-interface functions which allow
  16. //      the user to select ACM drivers and wave formats.
  17. //
  18. //
  19. //==========================================================================;
  20.  
  21. #include <windows.h>
  22. #include <windowsx.h>
  23. #include <mmsystem.h>
  24. #include <memory.h>
  25. #include <stdlib.h>
  26.  
  27. #include <mmreg.h>
  28. #include <msacm.h>
  29.  
  30. #include "muldiv32.h"
  31.  
  32. #include "appport.h"
  33. #include "waveio.h"
  34. #include "acmapp.h"
  35.  
  36. #include "debug.h"
  37.  
  38.  
  39. TCHAR           gszBogus[]      = TEXT("????");
  40.  
  41. TCHAR BCODE     gszAcmAppHelpFormat[] = TEXT("choo_win.hlp");
  42. TCHAR BCODE     gszAcmAppHelpFilter[] = TEXT("fil_win.hlp");
  43.  
  44. LPTSTR          gpszAcmAppHelp;
  45. UINT            guMsgHelp;
  46.  
  47.  
  48. //==========================================================================;
  49. //
  50. //
  51. //
  52. //
  53. //==========================================================================;
  54.  
  55. typedef struct tAAFORMATENUM {
  56.     DWORD        fdwEnum;
  57.     LPWAVEFORMATEX  pwfxEnum;
  58. } AAFORMATENUM, NEAR *NPAAFORMATENUM, *PAAFORMATENUM, FAR *LPAAFORMATENUM;
  59.     
  60.  
  61. //==========================================================================;
  62. //
  63. //
  64. //
  65. //
  66. //==========================================================================;
  67.  
  68. //--------------------------------------------------------------------------;
  69. //
  70. //  BOOL AcmAppDlgProcFormatStyle
  71. //
  72. //  Description:
  73. //
  74. //
  75. //  Arguments:
  76. //      HWND hwnd: Handle to window.
  77. //
  78. //      UINT uMsg: Message being sent to the window.
  79. //
  80. //      WPARAM wParam: Specific argument to message.
  81. //
  82. //      LPARAM lParam: Specific argument to message.
  83. //
  84. //  Return (BOOL):
  85. //      The return value is specific to the message that was received. For
  86. //      the most part, it is FALSE if this dialog procedure does not handle
  87. //      a message.
  88. //
  89. //--------------------------------------------------------------------------;
  90.  
  91. BOOL FNEXPORT AcmAppDlgProcFormatStyle
  92. (
  93.     HWND                    hwnd,
  94.     UINT                    uMsg,
  95.     WPARAM                  wParam,
  96.     LPARAM                  lParam
  97. )
  98. {
  99.     PACMFORMATCHOOSE    pafc;
  100.     HFONT               hfont;
  101.     UINT                uId;
  102.     BOOL                f;
  103.     DWORD               fdwStyle;
  104.  
  105.     pafc = (PACMFORMATCHOOSE)(UINT)GetWindowLong(hwnd, DWL_USER);
  106.  
  107.     switch (uMsg)
  108.     {
  109.         case WM_INITDIALOG:
  110.             pafc = (PACMFORMATCHOOSE)(UINT)lParam;
  111.  
  112.             SetWindowLong(hwnd, DWL_USER, lParam);
  113.  
  114.             hfont = ghfontApp;
  115.  
  116.             //
  117.             //
  118.             //
  119.             fdwStyle = pafc->fdwStyle;
  120.  
  121.             f = (0 != (ACMFORMATCHOOSE_STYLEF_SHOWHELP & fdwStyle));
  122.             CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_SHOWHELP, f);
  123.  
  124.             f = (0 != (ACMFORMATCHOOSE_STYLEF_ENABLEHOOK & fdwStyle));
  125.             CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLEHOOK, f);
  126.  
  127.             f = (0 != (ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE & fdwStyle));
  128.             CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATE, f);
  129.  
  130.             f = (0 != (ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE & fdwStyle));
  131.             CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATEHANDLE, f);
  132.  
  133.             f = (0 != (ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT & fdwStyle));
  134.             CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_INITTOWFXSTRUCT, f);
  135.  
  136.             return (TRUE);
  137.  
  138.  
  139.         case WM_COMMAND:
  140.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  141.             switch (uId)
  142.             {
  143.                 case IDOK:
  144.                     fdwStyle = 0L;
  145.  
  146.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_SHOWHELP);
  147.                     if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_SHOWHELP;
  148.  
  149.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLEHOOK);
  150.                     if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_ENABLEHOOK;
  151.  
  152.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATE);
  153.                     if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE;
  154.  
  155.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATEHANDLE);
  156.                     if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE;
  157.  
  158.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_INITTOWFXSTRUCT);
  159.                     if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT;
  160.  
  161.                     pafc->fdwStyle = fdwStyle;
  162.  
  163.                     // -- fall through -- //
  164.  
  165.                 case IDCANCEL:
  166.                     EndDialog(hwnd, (IDOK == uId));
  167.                     break;
  168.             }
  169.             break;
  170.     }
  171.  
  172.     return (FALSE);
  173. } // AcmAppDlgProcFormatStyle()
  174.  
  175.  
  176. //--------------------------------------------------------------------------;
  177. //
  178. //  BOOL AcmAppDlgProcFilterStyle
  179. //
  180. //  Description:
  181. //
  182. //
  183. //  Arguments:
  184. //      HWND hwnd: Handle to window.
  185. //
  186. //      UINT uMsg: Message being sent to the window.
  187. //
  188. //      WPARAM wParam: Specific argument to message.
  189. //
  190. //      LPARAM lParam: Specific argument to message.
  191. //
  192. //  Return (BOOL):
  193. //      The return value is specific to the message that was received. For
  194. //      the most part, it is FALSE if this dialog procedure does not handle
  195. //      a message.
  196. //
  197. //--------------------------------------------------------------------------;
  198.  
  199. BOOL FNEXPORT AcmAppDlgProcFilterStyle
  200. (
  201.     HWND                    hwnd,
  202.     UINT                    uMsg,
  203.     WPARAM                  wParam,
  204.     LPARAM                  lParam
  205. )
  206. {
  207.     PACMFILTERCHOOSE    pafc;
  208.     HFONT               hfont;
  209.     UINT                uId;
  210.     BOOL                f;
  211.     DWORD               fdwStyle;
  212.  
  213.     pafc = (PACMFILTERCHOOSE)(UINT)GetWindowLong(hwnd, DWL_USER);
  214.  
  215.     switch (uMsg)
  216.     {
  217.         case WM_INITDIALOG:
  218.             pafc = (PACMFILTERCHOOSE)(UINT)lParam;
  219.  
  220.             SetWindowLong(hwnd, DWL_USER, lParam);
  221.  
  222.             hfont = ghfontApp;
  223.  
  224.             //
  225.             //
  226.             //
  227.             fdwStyle = pafc->fdwStyle;
  228.  
  229.             f = (0 != (ACMFILTERCHOOSE_STYLEF_SHOWHELP & fdwStyle));
  230.             CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_SHOWHELP, f);
  231.  
  232.             f = (0 != (ACMFILTERCHOOSE_STYLEF_ENABLEHOOK & fdwStyle));
  233.             CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLEHOOK, f);
  234.  
  235.             f = (0 != (ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE & fdwStyle));
  236.             CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATE, f);
  237.  
  238.             f = (0 != (ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE & fdwStyle));
  239.             CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATEHANDLE, f);
  240.  
  241.             f = (0 != (ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT & fdwStyle));
  242.             CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_INITTOFILTERSTRUCT, f);
  243.  
  244.             return (TRUE);
  245.  
  246.  
  247.         case WM_COMMAND:
  248.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  249.             switch (uId)
  250.             {
  251.                 case IDOK:
  252.                     fdwStyle = 0L;
  253.  
  254.                     f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_SHOWHELP);
  255.                     if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_SHOWHELP;
  256.  
  257.                     f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLEHOOK);
  258.                     if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_ENABLEHOOK;
  259.  
  260.                     f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATE);
  261.                     if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE;
  262.  
  263.                     f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATEHANDLE);
  264.                     if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE;
  265.  
  266.                     f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_INITTOFILTERSTRUCT);
  267.                     if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT;
  268.  
  269.                     pafc->fdwStyle = fdwStyle;
  270.  
  271.                     // -- fall through -- //
  272.  
  273.                 case IDCANCEL:
  274.                     EndDialog(hwnd, (IDOK == uId));
  275.                     break;
  276.             }
  277.             break;
  278.     }
  279.  
  280.     return (FALSE);
  281. } // AcmAppDlgProcFilterStyle()
  282.  
  283.  
  284. //--------------------------------------------------------------------------;
  285. //
  286. //  BOOL AcmAppDlgProcFilterEnum
  287. //
  288. //  Description:
  289. //
  290. //
  291. //  Arguments:
  292. //      HWND hwnd: Handle to window.
  293. //
  294. //      UINT uMsg: Message being sent to the window.
  295. //
  296. //      WPARAM wParam: Specific argument to message.
  297. //
  298. //      LPARAM lParam: Specific argument to message.
  299. //
  300. //  Return (BOOL):
  301. //      The return value is specific to the message that was received. For
  302. //      the most part, it is FALSE if this dialog procedure does not handle
  303. //      a message.
  304. //
  305. //--------------------------------------------------------------------------;
  306.  
  307. BOOL FNEXPORT AcmAppDlgProcFilterEnum
  308. (
  309.     HWND                    hwnd,
  310.     UINT                    uMsg,
  311.     WPARAM                  wParam,
  312.     LPARAM                  lParam
  313. )
  314. {
  315.     TCHAR               ach[14];
  316.     PWAVEFILTER         pwfltr;
  317.     HWND                hedit;
  318.     HFONT               hfont;
  319.     UINT                uId;
  320.     BOOL                f;
  321.     DWORD               fdwEnum;
  322.  
  323.     pwfltr = (PWAVEFILTER)(UINT)GetWindowLong(hwnd, DWL_USER);
  324.  
  325.     switch (uMsg)
  326.     {
  327.         case WM_INITDIALOG:
  328.             pwfltr = (PWAVEFILTER)(UINT)lParam;
  329.  
  330.             SetWindowLong(hwnd, DWL_USER, lParam);
  331.  
  332.             hfont = ghfontApp;
  333.  
  334.             //
  335.             //  the initial fdwEnum flags are passed in fdwFilter
  336.             //  because i'm too lazy to make another silly structure..
  337.             //
  338.             fdwEnum = pwfltr->fdwFilter;
  339.  
  340.             f = (0 != (ACM_FILTERENUMF_DWFILTERTAG & fdwEnum));
  341.             CheckDlgButton(hwnd, IDD_AAFILTERENUM_CHECK_DWFILTERTAG, f);
  342.  
  343.             hedit = GetDlgItem(hwnd, IDD_AAFILTERENUM_EDIT_DWFILTERTAG);
  344.             SetWindowFont(hedit, hfont, FALSE);
  345.             AppSetWindowText(hedit, TEXT("%u"), pwfltr->dwFilterTag);
  346.  
  347.             return (TRUE);
  348.  
  349.  
  350.         case WM_COMMAND:
  351.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  352.             switch (uId)
  353.             {
  354.                 case IDOK:
  355.                     fdwEnum = 0L;
  356.  
  357.                     f = IsDlgButtonChecked(hwnd, IDD_AAFILTERENUM_CHECK_DWFILTERTAG);
  358.                     if (f) fdwEnum |= ACM_FILTERENUMF_DWFILTERTAG;
  359.  
  360.                     hedit = GetDlgItem(hwnd, IDD_AAFILTERENUM_EDIT_DWFILTERTAG);
  361.                     Edit_GetText(hedit, ach, SIZEOF(ach));
  362.                     pwfltr->dwFilterTag = _tcstoul(ach, NULL, 10);
  363.  
  364.                     pwfltr->fdwFilter = fdwEnum;
  365.  
  366.                     // -- fall through -- //
  367.  
  368.                 case IDCANCEL:
  369.                     EndDialog(hwnd, (IDOK == uId));
  370.                     break;
  371.             }
  372.             break;
  373.     }
  374.  
  375.     return (FALSE);
  376. } // AcmAppDlgProcFilterEnum()
  377.  
  378.  
  379. //--------------------------------------------------------------------------;
  380. //
  381. //  BOOL AcmAppDlgProcFormatEnum
  382. //
  383. //  Description:
  384. //
  385. //
  386. //  Arguments:
  387. //      HWND hwnd: Handle to window.
  388. //
  389. //      UINT uMsg: Message being sent to the window.
  390. //
  391. //      WPARAM wParam: Specific argument to message.
  392. //
  393. //      LPARAM lParam: Specific argument to message.
  394. //
  395. //  Return (BOOL):
  396. //      The return value is specific to the message that was received. For
  397. //      the most part, it is FALSE if this dialog procedure does not handle
  398. //      a message.
  399. //
  400. //--------------------------------------------------------------------------;
  401.  
  402. BOOL FNEXPORT AcmAppDlgProcFormatEnum
  403. (
  404.     HWND                    hwnd,
  405.     UINT                    uMsg,
  406.     WPARAM                  wParam,
  407.     LPARAM                  lParam
  408. )
  409. {
  410.     TCHAR               ach[14];
  411.     LPAAFORMATENUM    paafe;
  412.     LPWAVEFORMATEX      pwfx;
  413.     DWORD               fdwEnum;
  414.     HWND                hedit;
  415.     HFONT               hfont;
  416.     UINT                uId;
  417.     BOOL                f;
  418.  
  419.  
  420.     paafe   = (LPAAFORMATENUM)GetWindowLong(hwnd, DWL_USER);
  421.  
  422.     switch (uMsg)
  423.     {
  424.         case WM_INITDIALOG:
  425.         SetWindowLong(hwnd, DWL_USER, lParam);
  426.         
  427.         paafe   = (LPAAFORMATENUM)lParam;
  428.         pwfx    = paafe->pwfxEnum;
  429.         fdwEnum = paafe->fdwEnum;
  430.  
  431.         hfont = ghfontApp;
  432.  
  433.             f = (0 != (ACM_FORMATENUMF_WFORMATTAG & fdwEnum));
  434.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_WFORMATTAG, f);
  435.  
  436.             f = (0 != (ACM_FORMATENUMF_NCHANNELS & fdwEnum));
  437.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_NCHANNELS, f);
  438.  
  439.             f = (0 != (ACM_FORMATENUMF_NSAMPLESPERSEC & fdwEnum));
  440.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_NSAMPLESPERSEC, f);
  441.  
  442.             f = (0 != (ACM_FORMATENUMF_WBITSPERSAMPLE & fdwEnum));
  443.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_WBITSPERSAMPLE, f);
  444.  
  445.             f = (0 != (ACM_FORMATENUMF_CONVERT & fdwEnum));
  446.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_CONVERT, f);
  447.  
  448.             f = (0 != (ACM_FORMATENUMF_SUGGEST & fdwEnum));
  449.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_SUGGEST, f);
  450.  
  451.             f = (0 != (ACM_FORMATENUMF_HARDWARE & fdwEnum));
  452.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_HARDWARE, f);
  453.  
  454.             f = (0 != (ACM_FORMATENUMF_INPUT & fdwEnum));
  455.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_INPUT, f);
  456.  
  457.             f = (0 != (ACM_FORMATENUMF_OUTPUT & fdwEnum));
  458.             CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_OUTPUT, f);
  459.  
  460.             hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WFORMATTAG);
  461.             SetWindowFont(hedit, hfont, FALSE);
  462.             AppSetWindowText(hedit, TEXT("%u"), pwfx->wFormatTag);
  463.  
  464.             hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NCHANNELS);
  465.             SetWindowFont(hedit, hfont, FALSE);
  466.             AppSetWindowText(hedit, TEXT("%u"), pwfx->nChannels);
  467.  
  468.             hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NSAMPLESPERSEC);
  469.             SetWindowFont(hedit, hfont, FALSE);
  470.             AppSetWindowText(hedit, TEXT("%lu"), pwfx->nSamplesPerSec);
  471.  
  472.             hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WBITSPERSAMPLE);
  473.             SetWindowFont(hedit, hfont, FALSE);
  474.         AppSetWindowText(hedit, TEXT("%u"), pwfx->wBitsPerSample);
  475.  
  476.             hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NAVGBYTESPERSEC);
  477.             SetWindowFont(hedit, hfont, FALSE);
  478.         AppSetWindowText(hedit, TEXT("%lu"), pwfx->nAvgBytesPerSec);
  479.  
  480.             hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NBLOCKALIGN);
  481.             SetWindowFont(hedit, hfont, FALSE);
  482.         AppSetWindowText(hedit, TEXT("%u"), pwfx->nBlockAlign);
  483.  
  484.             hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_EXTRA);
  485.             SetWindowFont(hedit, hfont, FALSE);
  486.         if ( (pwfx->wFormatTag != WAVE_FORMAT_PCM) && (pwfx->cbSize != 0) )
  487.         {
  488.         LPTSTR lptstr;
  489.         DWORD  cch;
  490.         DWORD  cb;
  491.  
  492.         cch = 1 + pwfx->cbSize * 3;
  493.         cb  = cch * sizeof(TCHAR);
  494.  
  495.         lptstr = (LPTSTR)GlobalAllocPtr(GHND, cb);
  496.         if (NULL != lptstr)
  497.         {
  498.             LPTSTR lptstrT;
  499.             LPBYTE lpb;
  500.             DWORD i;
  501.  
  502.             lptstrT = lptstr;
  503.             lpb = ((LPBYTE)pwfx) + sizeof(*pwfx);
  504.             
  505.             for (i=0; i<pwfx->cbSize; i++)
  506.             {
  507.             wsprintf(lptstrT, TEXT("%02X "), *lpb);
  508.             lptstrT += 3;
  509.             lpb++;
  510.             }
  511.  
  512.             SetWindowText(hedit, lptstr);
  513.  
  514.             GlobalFreePtr(lptstr);
  515.             lptstr = NULL;
  516.         }
  517.         }
  518.         //
  519.         //    TODO: Allow the extra data to be edited by the user.
  520.         //
  521.         SendMessage(hedit, EM_SETREADONLY, TRUE, 0L);
  522.  
  523.             return (TRUE);
  524.  
  525.  
  526.         case WM_COMMAND:
  527.         pwfx = paafe->pwfxEnum;
  528.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  529.             switch (uId)
  530.             {
  531.                 case IDOK:
  532.  
  533.                     fdwEnum = 0L;
  534.  
  535.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_WFORMATTAG);
  536.                     if (f) fdwEnum |= ACM_FORMATENUMF_WFORMATTAG;
  537.  
  538.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_NCHANNELS);
  539.                     if (f) fdwEnum |= ACM_FORMATENUMF_NCHANNELS;
  540.  
  541.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_NSAMPLESPERSEC);
  542.                     if (f) fdwEnum |= ACM_FORMATENUMF_NSAMPLESPERSEC;
  543.  
  544.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_WBITSPERSAMPLE);
  545.                     if (f) fdwEnum |= ACM_FORMATENUMF_WBITSPERSAMPLE;
  546.  
  547.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_CONVERT);
  548.                     if (f) fdwEnum |= ACM_FORMATENUMF_CONVERT;
  549.  
  550.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_SUGGEST);
  551.                     if (f) fdwEnum |= ACM_FORMATENUMF_SUGGEST;
  552.  
  553.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_HARDWARE);
  554.                     if (f) fdwEnum |= ACM_FORMATENUMF_HARDWARE;
  555.  
  556.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_INPUT);
  557.                     if (f) fdwEnum |= ACM_FORMATENUMF_INPUT;
  558.  
  559.                     f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_OUTPUT);
  560.                     if (f) fdwEnum |= ACM_FORMATENUMF_OUTPUT;
  561.  
  562.                     hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WFORMATTAG);
  563.                     Edit_GetText(hedit, ach, SIZEOF(ach));
  564.                     pwfx->wFormatTag = (WORD)_tcstoul(ach, NULL, 10);
  565.  
  566.                     hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NCHANNELS);
  567.                     Edit_GetText(hedit, ach, SIZEOF(ach));
  568.                     pwfx->nChannels = (WORD)_tcstoul(ach, NULL, 10);
  569.  
  570.                     hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NSAMPLESPERSEC);
  571.                     Edit_GetText(hedit, ach, SIZEOF(ach));
  572.                     pwfx->nSamplesPerSec = _tcstoul(ach, NULL, 10);
  573.  
  574.                     hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WBITSPERSAMPLE);
  575.                     Edit_GetText(hedit, ach, SIZEOF(ach));
  576.                     pwfx->wBitsPerSample = (WORD)_tcstoul(ach, NULL, 10);
  577.  
  578.                     hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NAVGBYTESPERSEC);
  579.                     Edit_GetText(hedit, ach, SIZEOF(ach));
  580.                     pwfx->nAvgBytesPerSec = _tcstoul(ach, NULL, 10);
  581.  
  582.                     hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NBLOCKALIGN);
  583.                     Edit_GetText(hedit, ach, SIZEOF(ach));
  584.                     pwfx->nBlockAlign = (WORD)_tcstoul(ach, NULL, 10);
  585.  
  586.             paafe->fdwEnum = fdwEnum;
  587.  
  588.                     // -- fall through -- //
  589.  
  590.                 case IDCANCEL:
  591.                     EndDialog(hwnd, (IDOK == uId));
  592.                     break;
  593.             }
  594.             break;
  595.     }
  596.  
  597.     return (FALSE);
  598. } // AcmAppDlgProcFormatEnum()
  599.  
  600.  
  601. //--------------------------------------------------------------------------;
  602. //
  603. //  BOOL AcmAppDlgProcProperties
  604. //
  605. //  Description:
  606. //
  607. //
  608. //  Arguments:
  609. //      HWND hwnd: Handle to window.
  610. //
  611. //      UINT uMsg: Message being sent to the window.
  612. //
  613. //      WPARAM wParam: Specific argument to message.
  614. //
  615. //      LPARAM lParam: Specific argument to message.
  616. //
  617. //  Return (BOOL):
  618. //      The return value is specific to the message that was received. For
  619. //      the most part, it is FALSE if this dialog procedure does not handle
  620. //      a message.
  621. //
  622. //--------------------------------------------------------------------------;
  623.  
  624. BOOL FNEXPORT AcmAppDlgProcProperties
  625. (
  626.     HWND                    hwnd,
  627.     UINT                    uMsg,
  628.     WPARAM                  wParam,
  629.     LPARAM                  lParam
  630. )
  631. {
  632.     MMRESULT            mmr;
  633.     TCHAR               ach[14];
  634.     PAACONVERTDESC      paacd;
  635.     HWND                hcb;
  636.     HFONT               hfont;
  637.     UINT                uId;
  638.     DWORD               cb;
  639.  
  640.     paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
  641.  
  642.     switch (uMsg)
  643.     {
  644.         case WM_INITDIALOG:
  645.             paacd = (PAACONVERTDESC)(UINT)lParam;
  646.  
  647.             SetWindowLong(hwnd, DWL_USER, lParam);
  648.  
  649.             hfont = ghfontApp;
  650.  
  651.             hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE);
  652.             SetWindowFont(hcb, hfont, FALSE);
  653.  
  654.             wsprintf(ach, TEXT("%lu"), paacd->cbSrcReadSize);
  655.             ComboBox_AddString(hcb, ach);
  656.  
  657.             wsprintf(ach, TEXT("%lu"), paacd->cbSrcData);
  658.             ComboBox_AddString(hcb, ach);
  659.  
  660.             wsprintf(ach, TEXT("%u"), paacd->pwfxSrc->nBlockAlign);
  661.             ComboBox_AddString(hcb, ach);
  662.  
  663.             ComboBox_AddString(hcb, TEXT("1"));
  664.             ComboBox_AddString(hcb, TEXT("2147483648"));
  665.             ComboBox_AddString(hcb, TEXT("4294967295"));
  666.  
  667.             ComboBox_SetCurSel(hcb, 0);
  668.  
  669.             mmr = acmStreamSize(paacd->has,
  670.                                 paacd->cbSrcReadSize,
  671.                                 &paacd->cbDstBufSize,
  672.                                 ACM_STREAMSIZEF_SOURCE);
  673.  
  674.             hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_DESTINATION);
  675.             SetWindowFont(hcb, hfont, FALSE);
  676.  
  677.             wsprintf(ach, TEXT("%lu"), paacd->cbDstBufSize);
  678.             ComboBox_AddString(hcb, ach);
  679.  
  680.             wsprintf(ach, TEXT("%u"), paacd->pwfxDst->nBlockAlign);
  681.             ComboBox_AddString(hcb, ach);
  682.  
  683.             ComboBox_AddString(hcb, TEXT("1"));
  684.             ComboBox_AddString(hcb, TEXT("2147483648"));
  685.             ComboBox_AddString(hcb, TEXT("4294967295"));
  686.  
  687.             ComboBox_SetCurSel(hcb, 0);
  688.  
  689.             return (TRUE);
  690.  
  691.  
  692.         case WM_COMMAND:
  693.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  694.             switch (uId)
  695.             {
  696.                 case IDD_AAPROPERTIES_BTN_SOURCE:
  697.                     hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE);
  698.                     Edit_GetText(hcb, ach, SIZEOF(ach));
  699.                     cb = _tcstoul(ach, NULL, 10);
  700.  
  701.                     mmr = acmStreamSize(paacd->has, cb, &cb, ACM_STREAMSIZEF_SOURCE);
  702.  
  703.                     wsprintf(ach, TEXT("%lu"), cb);
  704.  
  705.                     hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_DESTINATION);
  706.                     Edit_SetText(hcb, ach);
  707.                     break;
  708.  
  709.  
  710.                 case IDD_AAPROPERTIES_BTN_DESTINATION:
  711.                     hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_DESTINATION);
  712.                     Edit_GetText(hcb, ach, SIZEOF(ach));
  713.                     cb = _tcstoul(ach, NULL, 10);
  714.  
  715.                     mmr = acmStreamSize(paacd->has, cb, &cb, ACM_STREAMSIZEF_DESTINATION);
  716.  
  717.                     wsprintf(ach, TEXT("%lu"), cb);
  718.  
  719.                     hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE);
  720.                     Edit_SetText(hcb, ach);
  721.                     break;
  722.  
  723.  
  724.                 case IDOK:
  725.                     hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE);
  726.                     Edit_GetText(hcb, ach, SIZEOF(ach));
  727.                     paacd->cbSrcReadSize = _tcstoul(ach, NULL, 10);
  728.                                                   
  729.                     // -- fall through -- //
  730.  
  731.                 case IDCANCEL:
  732.                     EndDialog(hwnd, (IDOK == uId));
  733.                     break;
  734.             }
  735.             break;
  736.     }
  737.  
  738.     return (FALSE);
  739. } // AcmAppDlgProcProperties()
  740.  
  741.  
  742. //==========================================================================;
  743. //
  744. //
  745. //
  746. //
  747. //==========================================================================;
  748.  
  749. //--------------------------------------------------------------------------;
  750. //  
  751. //  BOOL AcmAppChooserFormatSuggest
  752. //  
  753. //  Description:
  754. //  
  755. //  
  756. //  Arguments:
  757. //      HWND hwnd:
  758. //  
  759. //      PAACONVERTDESC paacd:
  760. //  
  761. //  Return (BOOL):
  762. //  
  763. //  
  764. //--------------------------------------------------------------------------;
  765.  
  766. BOOL FNLOCAL AcmAppChooserFormatSuggest
  767. (
  768.     HWND                    hwnd,
  769.     PAACONVERTDESC          paacd
  770. )
  771. {
  772.     MMRESULT            mmr;
  773.     LPWAVEFORMATEX      pwfx;
  774.     DWORD               cbwfx;
  775.     DWORD               cbwfxSrc;
  776.  
  777.  
  778.     //
  779.     //  this should never fail
  780.     //
  781.     mmr = acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, &cbwfx);
  782.     if (MMSYSERR_NOERROR != mmr)
  783.     {
  784.         DPF(0, "!AcmAppChooserFormatSuggest() acmMetrics failed mmr=%u!", mmr);
  785.         return (FALSE);
  786.     }
  787.  
  788.  
  789.     //
  790.     //  just in case no ACM driver is installed for the source format and
  791.     //  the source has a larger format size than the largest enabled ACM
  792.     //  driver...
  793.     //
  794.     cbwfxSrc = SIZEOF_WAVEFORMATEX(paacd->pwfxSrc);
  795.     cbwfx    = max(cbwfx, cbwfxSrc);
  796.  
  797.     pwfx = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, cbwfx);
  798.     if (NULL == pwfx)
  799.     {
  800.         DPF(0, "!AcmAppChooserFormatSuggest() GlobalAllocPtr(%lu) failed!", cbwfx);
  801.         return (FALSE);
  802.     }
  803.  
  804.  
  805.     //
  806.     //  'suggest anything'
  807.     //
  808.     mmr = acmFormatSuggest(NULL, paacd->pwfxSrc, pwfx, cbwfx, 0L);
  809.     if (MMSYSERR_NOERROR != mmr)
  810.     {
  811.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  812.                   TEXT("AcmAppChooserFormatSuggest() there is no suggested destination format. Defaulting to source format."));
  813.  
  814.         _fmemcpy(pwfx, paacd->pwfxSrc, (UINT)cbwfxSrc);
  815.     }
  816.  
  817.     //
  818.     //
  819.     //
  820.     if (NULL != paacd->pwfxDst)
  821.     {
  822.         GlobalFreePtr(paacd->pwfxDst);
  823.     }
  824.  
  825.     paacd->pwfxDst = pwfx;
  826.     AcmAppGetFormatDescription(pwfx, paacd->szDstFormatTag, paacd->szDstFormat);
  827.  
  828.     return (TRUE);
  829. } // AcmAppChooserFormatSuggest()
  830.  
  831.  
  832. //--------------------------------------------------------------------------;
  833. //  
  834. //  BOOL AcmAppChooserSaveFile
  835. //  
  836. //  Description:
  837. //  
  838. //  
  839. //  Arguments:
  840. //      HWND hwnd:
  841. //  
  842. //      PAACONVERTDESC paacd:
  843. //  
  844. //  Return (BOOL):
  845. //  
  846. //  
  847. //--------------------------------------------------------------------------;
  848.  
  849. BOOL FNLOCAL AcmAppChooserSaveFile
  850. (
  851.     HWND                    hwnd,
  852.     PAACONVERTDESC          paacd
  853. )
  854. {
  855.     TCHAR               szFilePath[APP_MAX_FILE_PATH_CHARS];
  856.     TCHAR               szFileTitle[APP_MAX_FILE_TITLE_CHARS];
  857.     HWND                hedit;
  858.     BOOL                f;
  859.  
  860.     hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT);
  861.     Edit_GetText(hedit, paacd->szFilePathDst, SIZEOF(paacd->szFilePathDst));
  862.  
  863.     lstrcpy(szFilePath, paacd->szFilePathDst);
  864.  
  865.     f = AppGetFileName(hwnd, szFilePath, szFileTitle, APP_GETFILENAMEF_SAVE);
  866.     if (f)
  867.     {
  868.         lstrcpy(paacd->szFilePathDst, szFilePath);
  869.         Edit_SetText(hedit, paacd->szFilePathDst);
  870.     }
  871.  
  872.     return (f);
  873. } // AcmAppChooserSaveFile()
  874.  
  875.  
  876. //--------------------------------------------------------------------------;
  877. //  
  878. //  BOOL AcmAppChooserProperties
  879. //  
  880. //  Description:
  881. //  
  882. //  
  883. //  Arguments:
  884. //      HWND hwnd:
  885. //  
  886. //      PAACONVERTDESC paacd:
  887. //  
  888. //  Return (BOOL):
  889. //  
  890. //  
  891. //--------------------------------------------------------------------------;
  892.  
  893. BOOL FNLOCAL AcmAppChooserProperties
  894. (
  895.     HWND                    hwnd,
  896.     PAACONVERTDESC          paacd
  897. )
  898. {
  899.     MMRESULT            mmr;
  900.     BOOL                f;
  901.  
  902.  
  903.     //
  904.     //
  905.     //
  906.     if (NULL != paacd->hadid)
  907.     {
  908.         mmr = acmDriverOpen(&paacd->had, paacd->hadid, 0L);
  909.         if (MMSYSERR_NOERROR != mmr)
  910.         {
  911.             return (FALSE);
  912.         }
  913.     }
  914.  
  915.     mmr = acmStreamOpen(&paacd->has,
  916.                         paacd->had,
  917.                         paacd->pwfxSrc,
  918.                         paacd->pwfxDst,
  919.                         paacd->fApplyFilter ? paacd->pwfltr : (LPWAVEFILTER)NULL,
  920.                         0L,
  921.                         0L,
  922.                         paacd->fdwOpen);
  923.  
  924.     if (MMSYSERR_NOERROR == mmr)
  925.     {
  926.         f = DialogBoxParam(ghinst,
  927.                             DLG_AAPROPERTIES,
  928.                             hwnd,
  929.                             AcmAppDlgProcProperties,
  930.                             (LPARAM)(UINT)paacd);
  931.  
  932.         acmStreamClose(paacd->has, 0L);
  933.         paacd->has = NULL;
  934.     }
  935.  
  936.  
  937.     if (NULL != paacd->had)
  938.     {
  939.         acmDriverClose(paacd->had, 0L);
  940.         paacd->had = NULL;
  941.     }
  942.  
  943.     return (f);
  944. } // AcmAppChooserProperties()
  945.  
  946.  
  947. //--------------------------------------------------------------------------;
  948. //  
  949. //  UINT AcmAppChooserFormatHook
  950. //  
  951. //  Description:
  952. //  
  953. //  
  954. //  Arguments:
  955. //      HWND hwnd:
  956. //  
  957. //      UINT uMsg:
  958. //  
  959. //      WPARAM wParam:
  960. //  
  961. //      LPARAM lParam:
  962. //  
  963. //  Return (UINT):
  964. //  
  965. //  
  966. //--------------------------------------------------------------------------;
  967.  
  968. UINT FNWCALLBACK AcmAppChooserFormatHook
  969. (
  970.     HWND                    hwnd,
  971.     UINT                    uMsg,
  972.     WPARAM                  wParam,
  973.     LPARAM                  lParam
  974. )
  975. {
  976.     static BOOL         fVerify;
  977.     LPWAVEFORMATEX      pwfx;
  978.     WAVEFORMATEX        wfx;
  979.     TCHAR               szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
  980.     TCHAR               szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
  981.     PAACONVERTDESC      paacd;
  982.     UINT                uId;
  983.     int                 n;
  984.     BOOL                f;
  985.  
  986.  
  987.     paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
  988.  
  989.     switch (uMsg)
  990.     {
  991.         case WM_INITDIALOG:
  992.             paacd = (PAACONVERTDESC)(UINT)lParam;
  993.  
  994.             SetWindowLong(hwnd, DWL_USER, lParam);
  995.  
  996.             DPF(1, "AcmAppChooserFormatHook(%.04Xh, WM_INITDIALOG, %u, %lu): %.04Xh",
  997.                 hwnd, wParam, lParam, paacd);
  998.  
  999.             fVerify = TRUE;
  1000.  
  1001.             return (TRUE);
  1002.  
  1003.  
  1004.         case MM_ACM_FORMATCHOOSE:
  1005.             switch (wParam)
  1006.             {
  1007.                 case FORMATCHOOSE_FORMATTAG_VERIFY:
  1008.                     if (!fVerify)
  1009.                         break;
  1010.  
  1011.                     wfx.wFormatTag = LOWORD(lParam);
  1012.  
  1013.                     AcmAppGetFormatDescription(&wfx, szFormatTag, NULL);
  1014.  
  1015.                     n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION,
  1016.                                     TEXT("Add format tag [%lu], '%s'?"),
  1017.                                     lParam, (LPTSTR)szFormatTag);
  1018.  
  1019.                     fVerify = (IDCANCEL != n);
  1020.  
  1021.                     if (!fVerify)
  1022.                         break;
  1023.  
  1024.                     f = (IDYES == n);
  1025.  
  1026.                     SetWindowLong(hwnd, DWL_MSGRESULT, f);
  1027.                     return (TRUE);
  1028.  
  1029.  
  1030.                 case FORMATCHOOSE_FORMAT_VERIFY:
  1031.                     if (!fVerify)
  1032.                         break;
  1033.  
  1034.                     pwfx = (LPWAVEFORMATEX)lParam;
  1035.  
  1036.                     AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat);
  1037.  
  1038.                     n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION,
  1039.                                     TEXT("Add format '%s' for format tag [%u], '%s'?"),
  1040.                                     (LPTSTR)szFormat,
  1041.                                     pwfx->wFormatTag,
  1042.                                     (LPTSTR)szFormatTag);
  1043.  
  1044.                     fVerify = (IDCANCEL != n);
  1045.  
  1046.                     if (!fVerify)
  1047.                         break;
  1048.  
  1049.                     f = (IDYES == n);
  1050.  
  1051.                     SetWindowLong(hwnd, DWL_MSGRESULT, f);
  1052.                     return (TRUE);
  1053.  
  1054.  
  1055.                 case FORMATCHOOSE_CUSTOM_VERIFY:
  1056.                     if (!fVerify)
  1057.                         break;
  1058.  
  1059.                     pwfx = (LPWAVEFORMATEX)lParam;
  1060.  
  1061.                     AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat);
  1062.  
  1063.                     n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION,
  1064.                                     TEXT("Add CUSTOM format '%s' for format tag [%u], '%s'?"),
  1065.                                     (LPTSTR)szFormat,
  1066.                                     pwfx->wFormatTag,
  1067.                                     (LPTSTR)szFormatTag);
  1068.  
  1069.                     fVerify = (IDCANCEL != n);
  1070.  
  1071.                     if (!fVerify)
  1072.                         break;
  1073.  
  1074.                     f = (IDYES == n);
  1075.  
  1076.                     SetWindowLong(hwnd, DWL_MSGRESULT, f);
  1077.                     return (TRUE);
  1078.             }
  1079.             break;
  1080.  
  1081.  
  1082.         case WM_COMMAND:
  1083.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  1084.             switch (uId)
  1085.             {
  1086.                 case IDOK:
  1087.                 case IDCANCEL:
  1088.                     break;
  1089.             }
  1090.             break;
  1091.     }
  1092.  
  1093.     return (FALSE);
  1094. } // AcmAppChooserFormatHook()
  1095.  
  1096.  
  1097. //--------------------------------------------------------------------------;
  1098. //  
  1099. //  UINT AcmAppChooserFilterHook
  1100. //  
  1101. //  Description:
  1102. //  
  1103. //  
  1104. //  Arguments:
  1105. //      HWND hwnd:
  1106. //  
  1107. //      UINT uMsg:
  1108. //  
  1109. //      WPARAM wParam:
  1110. //  
  1111. //      LPARAM lParam:
  1112. //  
  1113. //  Return (UINT):
  1114. //  
  1115. //  
  1116. //--------------------------------------------------------------------------;
  1117.  
  1118. UINT FNWCALLBACK AcmAppChooserFilterHook
  1119. (
  1120.     HWND                    hwnd,
  1121.     UINT                    uMsg,
  1122.     WPARAM                  wParam,
  1123.     LPARAM                  lParam
  1124. )
  1125. {
  1126.     static BOOL         fVerify;
  1127.     WAVEFILTER          wfltr;
  1128.     LPWAVEFILTER        pwfltr;
  1129.     TCHAR               szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
  1130.     TCHAR               szFilter[ACMFILTERDETAILS_FILTER_CHARS];
  1131.     PAACONVERTDESC      paacd;
  1132.     UINT                uId;
  1133.     int                 n;
  1134.     BOOL                f;
  1135.  
  1136.  
  1137.     paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
  1138.  
  1139.     switch (uMsg)
  1140.     {
  1141.         case WM_INITDIALOG:
  1142.             paacd = (PAACONVERTDESC)(UINT)lParam;
  1143.  
  1144.             SetWindowLong(hwnd, DWL_USER, lParam);
  1145.  
  1146.             DPF(1, "AcmAppChooserFilterHook(%.04Xh, WM_INITDIALOG, %u, %lu): %.04Xh",
  1147.                 hwnd, wParam, lParam, paacd);
  1148.  
  1149.             fVerify = TRUE;
  1150.  
  1151.             return (TRUE);
  1152.  
  1153.  
  1154.         case MM_ACM_FILTERCHOOSE:
  1155.             switch (wParam)
  1156.             {
  1157.                 case FILTERCHOOSE_FILTERTAG_VERIFY:
  1158.                     if (!fVerify)
  1159.                         break;
  1160.  
  1161.                     wfltr.dwFilterTag = lParam;
  1162.  
  1163.                     AcmAppGetFilterDescription(&wfltr, szFilterTag, NULL);
  1164.  
  1165.                     n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION,
  1166.                                     TEXT("Add filter tag [%lu], '%s'?"),
  1167.                                     lParam, (LPTSTR)szFilterTag);
  1168.  
  1169.                     fVerify = (IDCANCEL != n);
  1170.  
  1171.                     if (!fVerify)
  1172.                         break;
  1173.  
  1174.                     f = (IDYES == n);
  1175.  
  1176.                     SetWindowLong(hwnd, DWL_MSGRESULT, f);
  1177.                     return (TRUE);
  1178.  
  1179.  
  1180.                 case FILTERCHOOSE_FILTER_VERIFY:
  1181.                     if (!fVerify)
  1182.                         break;
  1183.  
  1184.                     pwfltr = (LPWAVEFILTER)lParam;
  1185.  
  1186.                     AcmAppGetFilterDescription(pwfltr, szFilterTag, szFilter);
  1187.  
  1188.                     n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION,
  1189.                                     TEXT("Add filter '%s' for filter tag [%lu], '%s'?"),
  1190.                                     (LPTSTR)szFilter,
  1191.                                     pwfltr->dwFilterTag,
  1192.                                     (LPTSTR)szFilterTag);
  1193.  
  1194.                     fVerify = (IDCANCEL != n);
  1195.  
  1196.                     if (!fVerify)
  1197.                         break;
  1198.  
  1199.                     f = (IDYES == n);
  1200.  
  1201.                     SetWindowLong(hwnd, DWL_MSGRESULT, f);
  1202.                     return (TRUE);
  1203.  
  1204.  
  1205.                 case FILTERCHOOSE_CUSTOM_VERIFY:
  1206.                     if (!fVerify)
  1207.                         break;
  1208.  
  1209.                     pwfltr = (LPWAVEFILTER)lParam;
  1210.  
  1211.                     AcmAppGetFilterDescription(pwfltr, szFilterTag, szFilter);
  1212.  
  1213.                     n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION,
  1214.                                     TEXT("Add CUSTOM filter '%s' for filter tag [%lu], '%s'?"),
  1215.                                     (LPTSTR)szFilter,
  1216.                                     pwfltr->dwFilterTag,
  1217.                                     (LPTSTR)szFilterTag);
  1218.  
  1219.                     fVerify = (IDCANCEL != n);
  1220.  
  1221.                     if (!fVerify)
  1222.                         break;
  1223.  
  1224.                     f = (IDYES == n);
  1225.  
  1226.                     SetWindowLong(hwnd, DWL_MSGRESULT, f);
  1227.                     return (TRUE);
  1228.             }
  1229.             break;
  1230.  
  1231.  
  1232.         case WM_COMMAND:
  1233.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  1234.             switch (uId)
  1235.             {
  1236.                 case IDOK:
  1237.                 case IDCANCEL:
  1238.                     break;
  1239.             }
  1240.             break;
  1241.     }
  1242.  
  1243.     return (FALSE);
  1244. } // AcmAppChooserFilterHook()
  1245.  
  1246.  
  1247. //--------------------------------------------------------------------------;
  1248. //  
  1249. //  BOOL AcmAppChooserFormat
  1250. //  
  1251. //  Description:
  1252. //  
  1253. //  
  1254. //  Arguments:
  1255. //      HWND hwnd:
  1256. //  
  1257. //      PAACONVERTDESC paacd:
  1258. //  
  1259. //      BOOL fOptions:
  1260. //  
  1261. //  Return (BOOL):
  1262. //  
  1263. //  
  1264. //--------------------------------------------------------------------------;
  1265.  
  1266. BOOL FNLOCAL AcmAppChooserFormat
  1267. (
  1268.     HWND                    hwnd,
  1269.     PAACONVERTDESC          paacd,
  1270.     BOOL                    fOptions
  1271. )
  1272. {
  1273.     ACMFORMATCHOOSE        afc;
  1274.     MMRESULT            mmr;
  1275.     LPWAVEFORMATEX        pwfx;
  1276.     DWORD            cbwfx;
  1277.     DWORD            cbwfxSrc;
  1278.     DWORD            fdwSuggest;
  1279.     DWORD            fdwStyle;
  1280.     DWORD            fdwEnum;
  1281.     LPWAVEFORMATEX        pwfxEnum;
  1282.     AAFORMATENUM        aafe;
  1283.     BOOL            f;
  1284.     HRSRC            hrsrc;
  1285.  
  1286.     pwfxEnum   = NULL;
  1287.     
  1288.     //
  1289.     //
  1290.     //
  1291.     fdwSuggest = 0L;
  1292.     fdwStyle   = 0L;
  1293.     fdwEnum    = 0L;
  1294.  
  1295.     //
  1296.     //  this should never fail
  1297.     //
  1298.     mmr = acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, &cbwfx);
  1299.     if (MMSYSERR_NOERROR != mmr)
  1300.     {
  1301.         DPF(0, "!AcmAppChooserFormat() acmMetrics failed mmr=%u!", mmr);
  1302.         return (FALSE);
  1303.     }
  1304.  
  1305.     //
  1306.     //  just in case no ACM driver is installed for the source format and
  1307.     //  the source has a larger format size than the largest enabled ACM
  1308.     //  driver...
  1309.     //
  1310.     cbwfxSrc = SIZEOF_WAVEFORMATEX(paacd->pwfxSrc);
  1311.     cbwfx    = max(cbwfx, cbwfxSrc);
  1312.  
  1313.     pwfx = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, cbwfx);
  1314.     if (NULL == pwfx)
  1315.     {
  1316.         DPF(0, "!AcmAppChooserFormat() GlobalAllocPtr(%lu) failed!", cbwfx);
  1317.         return (FALSE);
  1318.     }
  1319.  
  1320.     pwfxEnum = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, cbwfx);
  1321.     if (NULL == pwfxEnum)
  1322.     {
  1323.         DPF(0, "!AcmAppChooserFormat() GlobalAllocPtr(%lu) failed!", cbwfx);
  1324.     GlobalFreePtr(pwfx);
  1325.         return (FALSE);
  1326.     }
  1327.     
  1328.     _fmemcpy(pwfxEnum, paacd->pwfxSrc, (UINT)cbwfxSrc);
  1329.  
  1330.     //
  1331.     //
  1332.     //
  1333.     if (fOptions)
  1334.     {
  1335.     aafe.fdwEnum = fdwEnum;
  1336.     aafe.pwfxEnum = pwfxEnum;
  1337.  
  1338.         f = DialogBoxParam(ghinst,
  1339.                            DLG_AAFORMATENUM,
  1340.                            hwnd,
  1341.                            AcmAppDlgProcFormatEnum,
  1342.                            (LPARAM)(LPAAFORMATENUM)&aafe);
  1343.         if (!f)
  1344.         {
  1345.         GlobalFreePtr(pwfxEnum);
  1346.         GlobalFreePtr(pwfx);
  1347.             return (FALSE);
  1348.         }
  1349.  
  1350.         fdwEnum = aafe.fdwEnum;
  1351.  
  1352.     }
  1353.  
  1354.  
  1355.     if (fOptions)
  1356.     {
  1357.         afc.fdwStyle = fdwStyle;
  1358.  
  1359.         f = DialogBoxParam(ghinst,
  1360.                            DLG_AAFORMATSTYLE,
  1361.                            hwnd,
  1362.                            AcmAppDlgProcFormatStyle,
  1363.                            (LPARAM)(UINT)&afc);
  1364.         if (!f)
  1365.         {
  1366.             return (FALSE);
  1367.         }
  1368.  
  1369.         fdwStyle = afc.fdwStyle;
  1370.     }
  1371.  
  1372.  
  1373.     //
  1374.     //
  1375.     //
  1376.     //
  1377.     if (0 != (fdwStyle & ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT))
  1378.     {
  1379.         if (NULL != paacd->pwfxDst)
  1380.         {
  1381.             _fmemcpy(pwfx, paacd->pwfxDst, SIZEOF_WAVEFORMATEX(paacd->pwfxDst));
  1382.         }
  1383.         else
  1384.         {
  1385.             _fmemcpy(pwfx, paacd->pwfxSrc, (UINT)cbwfxSrc);
  1386.         }
  1387.     }
  1388.  
  1389.  
  1390.     //
  1391.     //
  1392.     //
  1393.     //
  1394.     if (0 == (ACMFORMATCHOOSE_STYLEF_SHOWHELP & fdwStyle))
  1395.     {
  1396.         guMsgHelp = 0;
  1397.     }
  1398.     else
  1399.     {
  1400.         guMsgHelp = RegisterWindowMessage(ACMHELPMSGSTRING);
  1401.         if (0 == guMsgHelp)
  1402.         {
  1403.             fdwStyle &= ~ACMFORMATCHOOSE_STYLEF_SHOWHELP;
  1404.         }
  1405.         else
  1406.         {
  1407.             gpszAcmAppHelp = gszAcmAppHelpFormat;
  1408.         }
  1409.     }
  1410.  
  1411.  
  1412.     //
  1413.     //  initialize the ACMFORMATCHOOSE members
  1414.     //
  1415.     memset(&afc, 0, sizeof(afc));
  1416.  
  1417.     afc.cbStruct        = sizeof(afc);
  1418.     afc.fdwStyle        = fdwStyle;
  1419.     afc.hwndOwner       = hwnd;
  1420.     afc.pwfx            = pwfx;
  1421.     afc.cbwfx           = cbwfx;
  1422.     afc.pszTitle        = TEXT("Destination Format Choice");
  1423.  
  1424.     afc.szFormatTag[0]  = '\0';
  1425.     afc.szFormat[0]     = '\0';
  1426.     afc.pszName         = NULL;
  1427.     afc.cchName         = 0;
  1428.  
  1429.     afc.fdwEnum         = fdwEnum;
  1430.     if (0L == (afc.fdwEnum & (ACM_FORMATENUMF_WFORMATTAG |
  1431.                               ACM_FORMATENUMF_NCHANNELS |
  1432.                               ACM_FORMATENUMF_NSAMPLESPERSEC |
  1433.                               ACM_FORMATENUMF_WBITSPERSAMPLE |
  1434.                               ACM_FORMATENUMF_CONVERT |
  1435.                               ACM_FORMATENUMF_SUGGEST)))
  1436.     {
  1437.         afc.pwfxEnum    = NULL;
  1438.     }
  1439.     else
  1440.     {
  1441.     afc.pwfxEnum = pwfxEnum;
  1442.     }
  1443.  
  1444.     //
  1445.     //
  1446.     //
  1447.     hrsrc = NULL;
  1448.  
  1449.     if (0L == (afc.fdwStyle & (ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE |
  1450.                                ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE)))
  1451.     {
  1452.         afc.hInstance       = NULL;
  1453.         afc.pszTemplateName = NULL;
  1454.     }
  1455.     else
  1456.     {
  1457.         if (0L != (afc.fdwStyle & ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE))
  1458.         {
  1459.             //
  1460.             //  ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE
  1461.             //
  1462.             hrsrc = FindResource(ghinst, DLG_AAFORMATCHOOSE_TEMPLATE, RT_DIALOG);
  1463.  
  1464.             afc.hInstance       = (HINSTANCE)LoadResource(ghinst, hrsrc);
  1465.             afc.pszTemplateName = NULL;
  1466.         }
  1467.         else
  1468.         {
  1469.             afc.hInstance       = ghinst;
  1470.             afc.pszTemplateName = DLG_AAFORMATCHOOSE_TEMPLATE;
  1471.         }
  1472.     }
  1473.  
  1474.  
  1475.     if (0L == (afc.fdwStyle & ACMFORMATCHOOSE_STYLEF_ENABLEHOOK))
  1476.     {
  1477.         afc.lCustData       = 0L;
  1478.         afc.pfnHook         = NULL;
  1479.     }
  1480.     else
  1481.     {
  1482.         afc.lCustData       = (LPARAM)(UINT)paacd;
  1483.         afc.pfnHook         = AcmAppChooserFormatHook;
  1484.     }
  1485.  
  1486.  
  1487.     //
  1488.     //
  1489.     //
  1490.     mmr = acmFormatChoose(&afc);
  1491.  
  1492.     if (NULL != hrsrc)
  1493.     {
  1494.         FreeResource((HGLOBAL)afc.hInstance);
  1495.     }
  1496.  
  1497.     //
  1498.     //
  1499.     //
  1500.     if (0 != guMsgHelp)
  1501.     {
  1502.         WinHelp(hwnd, gszAcmAppHelpFormat, HELP_QUIT, 0L);
  1503.         guMsgHelp = 0;
  1504.     }
  1505.  
  1506.  
  1507.     if (MMSYSERR_NOERROR != mmr)
  1508.     {
  1509.         if (ACMERR_CANCELED != mmr)
  1510.         {
  1511.             TCHAR       ach[40];
  1512.  
  1513.             AcmAppGetErrorString(mmr, ach);
  1514.             AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  1515.                       TEXT("acmFormatChoose() failed with error %s, [%u]."),
  1516.                       (LPTSTR)ach, mmr);
  1517.         }
  1518.  
  1519.     GlobalFreePtr(pwfxEnum);
  1520.         GlobalFreePtr(pwfx);
  1521.         return (FALSE);
  1522.     }
  1523.  
  1524.  
  1525.     //
  1526.     //
  1527.     //
  1528.     if (NULL != paacd->pwfxDst)
  1529.     {
  1530.         GlobalFreePtr(paacd->pwfxDst);
  1531.     }
  1532.  
  1533.     paacd->pwfxDst = pwfx;
  1534.     lstrcpy(paacd->szDstFormatTag, afc.szFormatTag);
  1535.     lstrcpy(paacd->szDstFormat, afc.szFormat);
  1536.  
  1537.  
  1538.     GlobalFreePtr(pwfxEnum);
  1539.     
  1540.     return (TRUE);
  1541. } // AcmAppChooserFormat()
  1542.  
  1543.  
  1544. //--------------------------------------------------------------------------;
  1545. //  
  1546. //  BOOL AcmAppChooserFilter
  1547. //  
  1548. //  Description:
  1549. //  
  1550. //  
  1551. //  Arguments:
  1552. //      HWND hwnd:
  1553. //  
  1554. //      PAACONVERTDESC paacd:
  1555. //  
  1556. //      BOOL fOptions:
  1557. //  
  1558. //  Return (BOOL):
  1559. //  
  1560. //  
  1561. //--------------------------------------------------------------------------;
  1562.  
  1563. BOOL FNLOCAL AcmAppChooserFilter
  1564. (
  1565.     HWND                    hwnd,
  1566.     PAACONVERTDESC          paacd,
  1567.     BOOL                    fOptions
  1568. )
  1569. {
  1570.     ACMFILTERCHOOSE     afc;
  1571.     MMRESULT            mmr;
  1572.     LPWAVEFILTER        pwfltr;
  1573.     DWORD               cbwfltr;
  1574.     DWORD               fdwStyle;
  1575.     DWORD               fdwEnum;
  1576.     WAVEFILTER          wfltrEnum;
  1577.     BOOL                f;
  1578.     HRSRC               hrsrc;
  1579.  
  1580.     //
  1581.     //
  1582.     //
  1583.     fdwStyle   = 0L;
  1584.     fdwEnum    = 0L;
  1585.  
  1586.     if (fOptions)
  1587.     {
  1588.         _fmemset(&wfltrEnum, 0, sizeof(wfltrEnum));
  1589.  
  1590.         wfltrEnum.cbStruct    = sizeof(wfltrEnum);
  1591.         wfltrEnum.dwFilterTag = paacd->pwfxSrc->wFormatTag;
  1592.  
  1593.         wfltrEnum.fdwFilter   = fdwEnum;
  1594.  
  1595.         f = DialogBoxParam(ghinst,
  1596.                            DLG_AAFILTERENUM,
  1597.                            hwnd,
  1598.                            AcmAppDlgProcFilterEnum,
  1599.                            (LPARAM)(UINT)&wfltrEnum);
  1600.         if (!f)
  1601.         {
  1602.             return (FALSE);
  1603.         }
  1604.  
  1605.         fdwEnum = wfltrEnum.fdwFilter;
  1606.  
  1607.         wfltrEnum.fdwFilter = 0L;
  1608.     }
  1609.  
  1610.  
  1611.     if (fOptions)
  1612.     {
  1613.         afc.fdwStyle = fdwStyle;
  1614.  
  1615.         f = DialogBoxParam(ghinst,
  1616.                            DLG_AAFILTERSTYLE,
  1617.                            hwnd,
  1618.                            AcmAppDlgProcFilterStyle,
  1619.                            (LPARAM)(UINT)&afc);
  1620.         if (!f)
  1621.         {
  1622.             return (FALSE);
  1623.         }
  1624.  
  1625.         fdwStyle = afc.fdwStyle;
  1626.     }
  1627.  
  1628.  
  1629.  
  1630.     //
  1631.     //  this should never fail
  1632.     //
  1633.     mmr = acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FILTER, &cbwfltr);
  1634.     if (MMSYSERR_NOERROR != mmr)
  1635.     {
  1636.         DPF(0, "!AcmAppChooserFilter() acmMetrics failed mmr=%u!", mmr);
  1637.         return (FALSE);
  1638.     }
  1639.  
  1640.     //
  1641.     //
  1642.     //
  1643.     cbwfltr = max(cbwfltr, sizeof(WAVEFILTER));
  1644.     pwfltr  = (LPWAVEFILTER)GlobalAllocPtr(GHND, cbwfltr);
  1645.     if (NULL == pwfltr)
  1646.     {
  1647.         DPF(0, "!AcmAppChooserFilter() GlobalAllocPtr(%lu) failed!", cbwfltr);
  1648.         return (FALSE);
  1649.     }
  1650.  
  1651.     //
  1652.     //
  1653.     //
  1654.     if ((NULL != paacd->pwfltr) && (0L == fdwEnum))
  1655.     {
  1656.         fdwStyle |= ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT;
  1657.  
  1658.         _fmemcpy(pwfltr, paacd->pwfltr, (UINT)paacd->pwfltr->cbStruct);
  1659.     }
  1660.  
  1661.  
  1662.     //
  1663.     //
  1664.     //
  1665.     //
  1666.     if (0 == (ACMFILTERCHOOSE_STYLEF_SHOWHELP & fdwStyle))
  1667.     {
  1668.         guMsgHelp = 0;
  1669.     }
  1670.     else
  1671.     {
  1672.         guMsgHelp = RegisterWindowMessage(ACMHELPMSGSTRING);
  1673.         if (0 == guMsgHelp)
  1674.         {
  1675.             fdwStyle &= ~ACMFILTERCHOOSE_STYLEF_SHOWHELP;
  1676.         }
  1677.         else
  1678.         {
  1679.             gpszAcmAppHelp = gszAcmAppHelpFilter;
  1680.         }
  1681.     }
  1682.  
  1683.  
  1684.  
  1685.     //
  1686.     //  initialize the ACMFILTERCHOOSE members
  1687.     //
  1688.     memset(&afc, 0, sizeof(afc));
  1689.  
  1690.     afc.cbStruct        = sizeof(afc);
  1691.     afc.fdwStyle        = fdwStyle;
  1692.     afc.hwndOwner       = hwnd;
  1693.     afc.pwfltr          = pwfltr;
  1694.     afc.cbwfltr         = cbwfltr;
  1695.     afc.pszTitle        = TEXT("Apply Filter Choice");
  1696.  
  1697.     afc.szFilterTag[0]  = '\0';
  1698.     afc.szFilter[0]     = '\0';
  1699.     afc.pszName         = NULL;
  1700.     afc.cchName         = 0;
  1701.  
  1702.     afc.fdwEnum         = fdwEnum;
  1703.     if (0L == (afc.fdwEnum & ACM_FILTERENUMF_DWFILTERTAG))
  1704.     {
  1705.         afc.pwfltrEnum  = NULL;
  1706.     }
  1707.     else
  1708.     {
  1709.         afc.pwfltrEnum  = &wfltrEnum;
  1710.     }
  1711.  
  1712.     if (0L == (afc.fdwStyle & (ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE |
  1713.                                ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE)))
  1714.     {
  1715.         afc.hInstance       = NULL;
  1716.         afc.pszTemplateName = NULL;
  1717.     }
  1718.     else
  1719.     {
  1720.         if (0L != (afc.fdwStyle & ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE))
  1721.         {
  1722.             //
  1723.             //  ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE
  1724.             //
  1725.             hrsrc = FindResource(ghinst, DLG_AAFILTERCHOOSE_TEMPLATE, RT_DIALOG);
  1726.  
  1727.             afc.hInstance       = (HINSTANCE)LoadResource(ghinst, hrsrc);
  1728.             afc.pszTemplateName = NULL;
  1729.         }
  1730.         else
  1731.         {
  1732.             afc.hInstance       = ghinst;
  1733.             afc.pszTemplateName = DLG_AAFILTERCHOOSE_TEMPLATE;
  1734.         }
  1735.     }
  1736.  
  1737.  
  1738.     if (0L == (afc.fdwStyle & ACMFILTERCHOOSE_STYLEF_ENABLEHOOK))
  1739.     {
  1740.         afc.lCustData       = 0L;
  1741.         afc.pfnHook         = NULL;
  1742.     }
  1743.     else
  1744.     {
  1745.         afc.lCustData       = (LPARAM)(UINT)paacd;
  1746.         afc.pfnHook         = AcmAppChooserFilterHook;
  1747.     }
  1748.  
  1749.  
  1750.     //
  1751.     //
  1752.     //
  1753.     mmr = acmFilterChoose(&afc);
  1754.  
  1755.     if (NULL != hrsrc)
  1756.     {
  1757.         FreeResource((HGLOBAL)afc.hInstance);
  1758.     }
  1759.  
  1760.     //
  1761.     //
  1762.     //
  1763.     if (0 != guMsgHelp)
  1764.     {
  1765.         WinHelp(hwnd, gszAcmAppHelpFilter, HELP_QUIT, 0L);
  1766.         guMsgHelp = 0;
  1767.     }
  1768.  
  1769.     if (MMSYSERR_NOERROR != mmr)
  1770.     {
  1771.         if (ACMERR_CANCELED != mmr)
  1772.         {
  1773.             AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  1774.                       TEXT("acmFilterChoose() failed with error = %u!"), mmr);
  1775.         }
  1776.         
  1777.         GlobalFreePtr(pwfltr);
  1778.         return (FALSE);
  1779.     }
  1780.  
  1781.  
  1782.     //
  1783.     //
  1784.     //
  1785.     if (NULL != paacd->pwfltr)
  1786.     {
  1787.         GlobalFreePtr(paacd->pwfltr);
  1788.     }
  1789.  
  1790.     paacd->pwfltr = pwfltr;
  1791.     lstrcpy(paacd->szFilterTag, afc.szFilterTag);
  1792.     lstrcpy(paacd->szFilter, afc.szFilter);
  1793.  
  1794.  
  1795.     return (TRUE);
  1796. } // AcmAppChooserFilter()
  1797.  
  1798.  
  1799. //--------------------------------------------------------------------------;
  1800. //  
  1801. //  BOOL AcmAppChooserDriverEnumCallback
  1802. //  
  1803. //  Description:
  1804. //  
  1805. //  
  1806. //  Arguments:
  1807. //      HACMDRIVERID hadid:
  1808. //  
  1809. //      DWORD dwInstance:
  1810. //  
  1811. //      DWORD fdwSupport:
  1812. //  
  1813. //  Return (BOOL):
  1814. //  
  1815. //  
  1816. //--------------------------------------------------------------------------;
  1817.  
  1818. BOOL FNEXPORT AcmAppChooserDriverEnumCallback
  1819. (
  1820.     HACMDRIVERID            hadid,
  1821.     DWORD                   dwInstance,
  1822.     DWORD                   fdwSupport
  1823. )
  1824. {
  1825.     MMRESULT            mmr;
  1826.     HWND                hcb;
  1827.     int                 n;
  1828.     ACMDRIVERDETAILS    add;
  1829.  
  1830.     //
  1831.     //  skip anything that does not support what we're after (for example,
  1832.     //  this will skip _HARDWARE only drivers that do not support stream
  1833.     //  functionality).
  1834.     //
  1835.     if (0 == (fdwSupport & (ACMDRIVERDETAILS_SUPPORTF_CODEC |
  1836.                             ACMDRIVERDETAILS_SUPPORTF_CONVERTER |
  1837.                             ACMDRIVERDETAILS_SUPPORTF_FILTER)))
  1838.     {
  1839.         return (TRUE);
  1840.     }
  1841.  
  1842.     //
  1843.     //
  1844.     //
  1845.     hcb = (HWND)(UINT)dwInstance;
  1846.  
  1847.     add.cbStruct = sizeof(add);
  1848.     mmr = acmDriverDetails(hadid, &add, 0L);
  1849.     if (MMSYSERR_NOERROR != mmr)
  1850.     {
  1851.         lstrcpy(add.szLongName,  gszBogus);
  1852.     }
  1853.  
  1854.  
  1855.     AcmAppDebugLog(add.szLongName);
  1856.     AcmAppDebugLog(TEXT("\r\n"));
  1857.                 
  1858.     n = ComboBox_AddString(hcb, add.szLongName);
  1859.     ComboBox_SetItemData(hcb, n, (LPARAM)(UINT)hadid);
  1860.  
  1861.  
  1862.     //
  1863.     //  return TRUE to continue with enumeration (FALSE will stop the
  1864.     //  enumerator)
  1865.     //
  1866.     return (TRUE);
  1867. } // AcmAppChooserDriverEnumCallback()
  1868.  
  1869.  
  1870. //--------------------------------------------------------------------------;
  1871. //  
  1872. //  BOOL AcmAppChooserUpdateDisplay
  1873. //  
  1874. //  Description:
  1875. //  
  1876. //  
  1877. //  Arguments:
  1878. //      HWND hwnd:
  1879. //  
  1880. //      PAACONVERTDESC paacd:
  1881. //  
  1882. //  Return (BOOL):
  1883. //  
  1884. //  
  1885. //--------------------------------------------------------------------------;
  1886.  
  1887. BOOL FNLOCAL AcmAppChooserUpdateDisplay
  1888. (
  1889.     HWND                    hwnd,
  1890.     PAACONVERTDESC          paacd
  1891. )
  1892. {
  1893.     HWND                hedit;
  1894.     HWND                htxt;
  1895.     HWND                hcb;
  1896.     HWND                hsb;
  1897.     int                 n;
  1898.     MMRESULT            mmr;
  1899.     ACMDRIVERDETAILS    add;
  1900.     TCHAR               ach[40];
  1901.     LPWAVEFILTER        pwfltr;
  1902.     HACMDRIVERID        hadid;
  1903.     BOOL                f;
  1904.     DWORD               fdwOpen;
  1905.     int                 nValue;
  1906.     int                 nMinPos;
  1907.     int                 nMaxPos;
  1908.     DWORD               cbSrc;
  1909.     DWORD               cbDst;
  1910.  
  1911.  
  1912.     //
  1913.     //
  1914.     //
  1915.     htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILE_INPUT);
  1916.     SetWindowText(htxt, paacd->szFilePathSrc);
  1917.  
  1918.     AcmAppGetFormatDescription(paacd->pwfxSrc, paacd->szSrcFormatTag, paacd->szSrcFormat);
  1919.     AppFormatBigNumber(ach, paacd->cbSrcData);
  1920.     AppFormatBigNumber(&ach[20], paacd->cbSrcData / paacd->pwfxSrc->nBlockAlign);
  1921.  
  1922.     htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT_INPUT);
  1923.     AppSetWindowText(htxt, TEXT("%s: %s\r\nAlignment=%u, Data=%s bytes, %s blocks"),
  1924.                         (LPTSTR)paacd->szSrcFormatTag,
  1925.                         (LPTSTR)paacd->szSrcFormat,
  1926.                         paacd->pwfxSrc->nBlockAlign,
  1927.                         (LPTSTR)ach, (LPTSTR)&ach[20]);
  1928.     
  1929.     hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT);
  1930.     Edit_GetText(hedit, paacd->szFilePathDst, SIZEOF(paacd->szFilePathDst));
  1931.  
  1932.  
  1933.     //
  1934.     //
  1935.     //
  1936.     nValue = (int)paacd->uBufferTimePerConvert;
  1937.     hsb = GetDlgItem(hwnd, IDD_AACHOOSER_SCROLL_TIME);
  1938.     GetScrollRange(hsb, SB_CTL, &nMinPos, &nMaxPos);
  1939.     if (nValue != GetScrollPos(hsb, SB_CTL))
  1940.     {
  1941.         SetScrollPos(hsb, SB_CTL, nValue, TRUE);
  1942.  
  1943.         if (nValue == nMaxPos)
  1944.         {
  1945.             lstrcpy(ach, TEXT("(ALL)"));
  1946.         }
  1947.         else if (nValue == nMinPos)
  1948.         {
  1949.             lstrcpy(ach, TEXT("(Auto)"));
  1950.         }
  1951.         else
  1952.         {
  1953.             wsprintf(ach, TEXT("%u.%.03u"), nValue / 1000, nValue % 1000);
  1954.         }
  1955.  
  1956.         htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_TIME);
  1957.         SetWindowText(htxt, ach);
  1958.     }
  1959.  
  1960.     //
  1961.     //
  1962.     //
  1963.     if (nValue == nMaxPos)
  1964.     {
  1965.         cbSrc = paacd->cbSrcData;
  1966.     }
  1967.     else if (nValue == nMinPos)
  1968.     {
  1969.         //
  1970.         //  could do something real here--for now, just do '1/8th of
  1971.         //  a second'..
  1972.         //
  1973.         cbSrc = paacd->pwfxSrc->nAvgBytesPerSec;
  1974.         cbSrc = MulDivRN(cbSrc, 175, 1000);
  1975.     }
  1976.     else
  1977.     {
  1978.         cbSrc = paacd->pwfxSrc->nAvgBytesPerSec;
  1979.         cbSrc = MulDivRN(cbSrc, (UINT)nValue, 1000);
  1980.     }
  1981.  
  1982.     paacd->cbSrcReadSize = cbSrc;
  1983.  
  1984.  
  1985.     //
  1986.     //
  1987.     //
  1988.     paacd->hadid = NULL;
  1989.  
  1990.     hcb = GetDlgItem(hwnd, IDD_AACHOOSER_COMBO_DRIVER);
  1991.     n   = ComboBox_GetCurSel(hcb);
  1992.     if (LB_ERR != n)
  1993.     {
  1994.         paacd->hadid = (HACMDRIVERID)(UINT)ComboBox_GetItemData(hcb, n);
  1995.     }
  1996.  
  1997.     //
  1998.     //
  1999.     //
  2000.     //
  2001.     htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT);
  2002.     if (NULL == paacd->pwfxDst)
  2003.     {
  2004.         SetWindowText(htxt, TEXT("(no format selected)"));
  2005.     }
  2006.     else
  2007.     {
  2008.         AppSetWindowText(htxt, TEXT("%s: %s\r\nAlignment=%u"),
  2009.                             (LPTSTR)paacd->szDstFormatTag,
  2010.                             (LPTSTR)paacd->szDstFormat,
  2011.                             paacd->pwfxDst->nBlockAlign);
  2012.     }
  2013.  
  2014.  
  2015.     //
  2016.     //
  2017.     //
  2018.     //
  2019.     htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILTER);
  2020.     if (NULL == paacd->pwfltr)
  2021.     {
  2022.         SetWindowText(htxt, TEXT("(no filter selected)"));
  2023.     }
  2024.     else
  2025.     {
  2026.         AppSetWindowText(htxt, TEXT("%s: %s"),
  2027.                             (LPTSTR)paacd->szFilterTag,
  2028.                             (LPTSTR)paacd->szFilter);
  2029.     }
  2030.  
  2031.  
  2032.     hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_DETAILS);
  2033.     MEditPrintF(hedit, NULL);
  2034.  
  2035.     if (NULL == paacd->pwfxDst)
  2036.     {
  2037.         MEditPrintF(hedit, TEXT("hadid=%.04Xh\r\npwfxDst=%.08lXh\r\npwfltr=%.08lXh"),
  2038.                         paacd->hadid,
  2039.                         paacd->pwfxDst,
  2040.                         paacd->pwfltr);
  2041.         return (FALSE);
  2042.     }
  2043.  
  2044.     //
  2045.     //
  2046.     //
  2047.     if (NULL != paacd->hadid)
  2048.     {
  2049.         mmr = acmDriverOpen(&paacd->had, paacd->hadid, 0L);
  2050.         if (MMSYSERR_NOERROR != mmr)
  2051.         {
  2052.             AcmAppGetErrorString(mmr, ach);
  2053.             MEditPrintF(hedit, TEXT("The selected driver (hadid=%.04Xh) cannot be opened. %s (%u)"),
  2054.                         paacd->hadid, (LPSTR)ach, mmr);
  2055.             return (FALSE);
  2056.         }
  2057.     }
  2058.  
  2059.  
  2060.     SetWindowRedraw(hedit, FALSE);
  2061.  
  2062.  
  2063.     //
  2064.     //
  2065.     //
  2066.     f = IsDlgButtonChecked(hwnd, IDD_AACHOOSER_CHECK_FILTER);
  2067.     pwfltr = (f ? paacd->pwfltr : (LPWAVEFILTER)NULL);
  2068.  
  2069.     paacd->fApplyFilter = f;
  2070.  
  2071.  
  2072.     fdwOpen = 0L;
  2073.     f = IsDlgButtonChecked(hwnd, IDD_AACHOOSER_CHECK_NONREALTIME);
  2074.     if (f)
  2075.     {
  2076.         fdwOpen |= ACM_STREAMOPENF_NONREALTIME;
  2077.     }
  2078.  
  2079.     f = IsDlgButtonChecked(hwnd, IDD_AACHOOSER_CHECK_ASYNC);
  2080.     if (f)
  2081.     {
  2082.         fdwOpen |= ACM_STREAMOPENF_ASYNC;
  2083.     }
  2084.  
  2085.     paacd->fdwOpen = fdwOpen;
  2086.  
  2087.  
  2088.     //
  2089.     //
  2090.     //
  2091.     MEditPrintF(hedit, TEXT("~%12s: "), (LPTSTR)TEXT("Stream Open"));
  2092.     mmr = acmStreamOpen(&paacd->has,
  2093.                         paacd->had,
  2094.                         paacd->pwfxSrc,
  2095.                         paacd->pwfxDst,
  2096.                         pwfltr,
  2097.                         0L,
  2098.                         0L,
  2099.                         fdwOpen);
  2100.  
  2101.     if (MMSYSERR_NOERROR == mmr)
  2102.     {
  2103.         TCHAR       szSrc[20];
  2104.         BOOL        fSrcAligned;
  2105.         BOOL        fDstAligned;
  2106.  
  2107.         acmDriverID((HACMOBJ)paacd->has, &hadid, 0L);
  2108.  
  2109.         add.cbStruct = sizeof(add);
  2110.         mmr = acmDriverDetails(hadid, &add, 0L);
  2111.         if (MMSYSERR_NOERROR != mmr)
  2112.         {
  2113.             lstrcpy(add.szLongName,  gszBogus);
  2114.         }
  2115.  
  2116.  
  2117.         MEditPrintF(hedit, TEXT("%s, %s"), (LPTSTR)gszYes, (LPTSTR)add.szLongName);
  2118.  
  2119.         fSrcAligned = (0 == (cbSrc % paacd->pwfxSrc->nBlockAlign));
  2120.         AppFormatBigNumber(szSrc, cbSrc);
  2121.  
  2122.         mmr = acmStreamSize(paacd->has, cbSrc, &cbDst, ACM_STREAMSIZEF_SOURCE);
  2123.         if (MMSYSERR_NOERROR == mmr)
  2124.         {
  2125.             TCHAR       szDst[20];
  2126.  
  2127.             fDstAligned = (0 == (cbDst % paacd->pwfxDst->nBlockAlign));
  2128.             AppFormatBigNumber(szDst, cbDst);
  2129.  
  2130.             if (cbSrc < cbDst)
  2131.             {
  2132.                 cbDst = MulDivRN(cbDst, 10, cbSrc);
  2133.                 cbSrc = 10;
  2134.             }
  2135.             else
  2136.             {
  2137.                 cbSrc = MulDivRN(cbSrc, 10, cbDst);
  2138.                 cbDst = 10;
  2139.             }
  2140.  
  2141.             MEditPrintF(hedit, TEXT("%12s: Src=%c%10s, Dst=%c%10s  (%lu.%lu:%lu.%lu)"),
  2142.                         (LPTSTR)TEXT("Buffer Size"),
  2143.                         fSrcAligned ? '*' : ' ',
  2144.                         (LPTSTR)szSrc,
  2145.                         fDstAligned ? '*' : ' ',
  2146.                         (LPTSTR)szDst,
  2147.                         cbSrc / 10, cbSrc % 10,
  2148.                         cbDst / 10, cbDst % 10);
  2149.         }
  2150.         else
  2151.         {
  2152.             AcmAppGetErrorString(mmr, ach);
  2153.             MEditPrintF(hedit, TEXT("%12s: Src=%c%10s, %s (%u)"), (LPTSTR)TEXT("Buffer Size"),
  2154.                         fSrcAligned ? '*' : ' ',
  2155.                         (LPTSTR)szSrc, (LPTSTR)ach, mmr);
  2156.         }
  2157.  
  2158.         acmStreamClose(paacd->has, 0L);
  2159.         paacd->has = NULL;
  2160.     }
  2161.     else
  2162.     {
  2163.         AcmAppGetErrorString(mmr, ach);
  2164.         MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr);
  2165.     }
  2166.  
  2167.  
  2168.     //
  2169.     //
  2170.     //
  2171.     MEditPrintF(hedit, TEXT("~%12s: "), (LPTSTR)TEXT("(Query)"));
  2172.     mmr = acmStreamOpen(NULL,
  2173.                         paacd->had,
  2174.                         paacd->pwfxSrc,
  2175.                         paacd->pwfxDst,
  2176.                         pwfltr,
  2177.                         0L,
  2178.                         0L,
  2179.                         fdwOpen | ACM_STREAMOPENF_QUERY);
  2180.  
  2181.     if (MMSYSERR_NOERROR == mmr)
  2182.     {
  2183.         MEditPrintF(hedit, gszYes);
  2184.     }
  2185.     else
  2186.     {
  2187.         AcmAppGetErrorString(mmr, ach);
  2188.         MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr);
  2189.     }
  2190.  
  2191.     if (NULL != paacd->had)
  2192.     {
  2193.         acmDriverClose(paacd->had, 0L);
  2194.         paacd->had = NULL;
  2195.     }
  2196.  
  2197.     SetWindowRedraw(hedit, TRUE);
  2198.  
  2199.  
  2200.     return (MMSYSERR_NOERROR == mmr);
  2201. } // AcmAppChooserUpdateDisplay()
  2202.  
  2203.  
  2204. //--------------------------------------------------------------------------;
  2205. //  
  2206. //  BOOL AcmAppChooserScrollConvertTime
  2207. //  
  2208. //  Description:
  2209. //  
  2210. //  
  2211. //  Arguments:
  2212. //      HWND hwnd:
  2213. //  
  2214. //      HWND hsb:
  2215. //  
  2216. //      UINT uCode:
  2217. //  
  2218. //      int nPos:
  2219. //  
  2220. //  Return (BOOL):
  2221. //  
  2222. //  
  2223. //--------------------------------------------------------------------------;
  2224.  
  2225. BOOL FNLOCAL AcmAppChooserScrollConvertTime
  2226. (
  2227.     HWND                    hwnd,
  2228.     HWND                    hsb,
  2229.     UINT                    uCode,
  2230.     int                     nPos
  2231. )
  2232. {
  2233.     PAACONVERTDESC      paacd;
  2234.     int                 nMinPos;
  2235.     int                 nMaxPos;
  2236.     HWND                htxt;
  2237.     TCHAR               ach[40];
  2238.  
  2239.  
  2240.     GetScrollRange(hsb, SB_CTL, &nMinPos, &nMaxPos);
  2241.  
  2242.     if ((SB_THUMBPOSITION != uCode) && (SB_THUMBTRACK != uCode))
  2243.     {
  2244.         nPos = GetScrollPos(hsb, SB_CTL);
  2245.     }
  2246.  
  2247.     //
  2248.     //
  2249.     //
  2250.     switch (uCode)
  2251.     {
  2252.         case SB_PAGEDOWN:
  2253.             if (GetKeyState(VK_CONTROL) < 0)
  2254.                 nPos = min(nMaxPos, nPos + 100);
  2255.             else
  2256.                 nPos = min(nMaxPos, nPos + 500);
  2257.             break;
  2258.  
  2259.         case SB_LINEDOWN:
  2260.             if (GetKeyState(VK_CONTROL) < 0)
  2261.                 nPos = min(nMaxPos, nPos + 1);
  2262.             else
  2263.                 nPos = min(nMaxPos, nPos + 10);
  2264.             break;
  2265.  
  2266.         case SB_PAGEUP:
  2267.             if (GetKeyState(VK_CONTROL) < 0)
  2268.                 nPos = max(nMinPos, nPos - 100);
  2269.             else
  2270.                 nPos = max(nMinPos, nPos - 500);
  2271.             break;
  2272.  
  2273.         case SB_LINEUP:
  2274.             if (GetKeyState(VK_CONTROL) < 0)
  2275.                 nPos = max(nMinPos, nPos - 1);
  2276.             else
  2277.                 nPos = max(nMinPos, nPos - 10);
  2278.             break;
  2279.  
  2280.  
  2281.         case SB_TOP:
  2282.             if (GetKeyState(VK_CONTROL) < 0)
  2283.                 nPos = nMinPos;
  2284.             else
  2285.                 nPos = 1000;
  2286.             break;
  2287.  
  2288.         case SB_BOTTOM:
  2289.             nPos = nMaxPos;
  2290.             break;
  2291.  
  2292.         case SB_THUMBPOSITION:
  2293.         case SB_THUMBTRACK:
  2294.             break;
  2295.  
  2296.         default:
  2297.             return (FALSE);
  2298.     }
  2299.  
  2300.     //
  2301.     //
  2302.     //
  2303.     paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
  2304.  
  2305.     paacd->uBufferTimePerConvert = (UINT)nPos;
  2306.  
  2307.     SetScrollPos(hsb, SB_CTL, nPos, TRUE);
  2308.  
  2309.     if (nPos == nMaxPos)
  2310.     {
  2311.         lstrcpy(ach, TEXT("(ALL)"));
  2312.     }
  2313.     else if (nPos == nMinPos)
  2314.     {
  2315.         lstrcpy(ach, TEXT("(Auto)"));
  2316.     }
  2317.     else
  2318.     {
  2319.         wsprintf(ach, TEXT("%u.%.03u"), nPos / 1000, nPos % 1000);
  2320.     }
  2321.  
  2322.     htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_TIME);
  2323.     SetWindowText(htxt, ach);
  2324.  
  2325.     //
  2326.     //
  2327.     //
  2328.     return (TRUE);
  2329. } // AcmAppChooserScrollConvertTime()
  2330.  
  2331.  
  2332. //--------------------------------------------------------------------------;
  2333. //
  2334. //  BOOL AcmAppDlgProcChooser
  2335. //
  2336. //  Description:
  2337. //
  2338. //
  2339. //  Arguments:
  2340. //      HWND hwnd: Handle to window.
  2341. //
  2342. //      UINT uMsg: Message being sent to the window.
  2343. //
  2344. //      WPARAM wParam: Specific argument to message.
  2345. //
  2346. //      LPARAM lParam: Specific argument to message.
  2347. //
  2348. //  Return (BOOL):
  2349. //      The return value is specific to the message that was received. For
  2350. //      the most part, it is FALSE if this dialog procedure does not handle
  2351. //      a message.
  2352. //
  2353. //--------------------------------------------------------------------------;
  2354.  
  2355. BOOL FNEXPORT AcmAppDlgProcChooser
  2356. (
  2357.     HWND                    hwnd,
  2358.     UINT                    uMsg,
  2359.     WPARAM                  wParam,
  2360.     LPARAM                  lParam
  2361. )
  2362. {
  2363.     PAACONVERTDESC      paacd;
  2364.     HWND                hedit;
  2365.     HWND                htxt;
  2366.     HWND                hcb;
  2367.     HWND                hsb;
  2368.     HFONT               hfont;
  2369.     UINT                uId;
  2370.     UINT                uCmd;
  2371.     BOOL                f;
  2372.  
  2373.     //
  2374.     //
  2375.     //
  2376.     if ((0 != guMsgHelp) && (uMsg == guMsgHelp))
  2377.     {
  2378.         WinHelp(hwnd, gpszAcmAppHelp, HELP_CONTENTS, 0L);
  2379.         return (TRUE);
  2380.     }
  2381.  
  2382.     paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
  2383.  
  2384.     //
  2385.     //
  2386.     //
  2387.     switch (uMsg)
  2388.     {
  2389.         case WM_INITDIALOG:
  2390.             paacd = (PAACONVERTDESC)(UINT)lParam;
  2391.  
  2392.             SetWindowLong(hwnd, DWL_USER, lParam);
  2393.  
  2394.             if (NULL == paacd->pwfxSrc)
  2395.             {
  2396.                 AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  2397.                           TEXT("You must select a source file to convert."));
  2398.                 EndDialog(hwnd, FALSE);
  2399.                 return (TRUE);
  2400.             }
  2401.  
  2402.             if (NULL == paacd->pwfxDst)
  2403.             {
  2404.                 AcmAppChooserFormatSuggest(hwnd, paacd);
  2405.             }
  2406.  
  2407.             hfont = GetStockFont(SYSTEM_FONT);
  2408.  
  2409.             htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILE_INPUT);
  2410.             SetWindowFont(htxt, hfont, FALSE);
  2411.  
  2412.             htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT_INPUT);
  2413.             SetWindowFont(htxt, hfont, FALSE);
  2414.     
  2415.             hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT);
  2416.             SetWindowFont(hedit, hfont, FALSE);
  2417.             Edit_SetText(hedit, paacd->szFilePathDst);
  2418.  
  2419.             hcb = GetDlgItem(hwnd, IDD_AACHOOSER_COMBO_DRIVER);
  2420.             SetWindowFont(hcb, hfont, FALSE);
  2421.  
  2422.             htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT);
  2423.             SetWindowFont(htxt, hfont, FALSE);
  2424.  
  2425.             htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILTER);
  2426.             SetWindowFont(htxt, hfont, FALSE);
  2427.  
  2428.  
  2429.             hfont = ghfontApp;
  2430.  
  2431.             htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_TIME);
  2432.             SetWindowFont(htxt, hfont, FALSE);
  2433.  
  2434.             hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_DETAILS);
  2435.             SetWindowFont(hedit, hfont, FALSE);
  2436.  
  2437.             hsb = GetDlgItem(hwnd, IDD_AACHOOSER_SCROLL_TIME);
  2438.             SetScrollRange(hsb, SB_CTL, 0, 10000, FALSE);
  2439.  
  2440.  
  2441.             //
  2442.             //
  2443.             //
  2444.             CheckDlgButton(hwnd, IDD_AACHOOSER_CHECK_NONREALTIME, TRUE);
  2445.  
  2446.             SendMessage(hwnd, WM_ACMAPP_ACM_NOTIFY, 0, 0L);
  2447.             return (TRUE);
  2448.  
  2449.  
  2450.         case WM_ACMAPP_ACM_NOTIFY:
  2451.             AppHourGlass(TRUE);
  2452.             hcb = GetDlgItem(hwnd, IDD_AACHOOSER_COMBO_DRIVER);
  2453.  
  2454.             SetWindowRedraw(hcb, FALSE);
  2455.             ComboBox_ResetContent(hcb);
  2456.  
  2457.             ComboBox_AddString(hcb, TEXT("[ACM Driver Mapper]"));
  2458.  
  2459.             AcmAppDebugLog(NULL);
  2460.             acmDriverEnum(AcmAppChooserDriverEnumCallback, (DWORD)(UINT)hcb, 0L);
  2461.  
  2462.             ComboBox_SetCurSel(hcb, 0);
  2463.             SetWindowRedraw(hcb, TRUE);
  2464.  
  2465.             f = AcmAppChooserUpdateDisplay(hwnd, paacd);
  2466.             EnableWindow(GetDlgItem(hwnd, IDOK), f);
  2467.             EnableWindow(GetDlgItem(hwnd, IDD_AACHOOSER_BTN_PROPERTIES), f);
  2468.  
  2469.             AppHourGlass(FALSE);
  2470.             break;
  2471.  
  2472.  
  2473.         case WM_HSCROLL:
  2474.             f = (BOOL)HANDLE_WM_HSCROLL(hwnd, wParam, lParam, AcmAppChooserScrollConvertTime);
  2475.             f = TRUE;
  2476.             if (f)
  2477.             {
  2478.                 AppHourGlass(TRUE);
  2479.  
  2480.                 f = AcmAppChooserUpdateDisplay(hwnd, paacd);
  2481.                 EnableWindow(GetDlgItem(hwnd, IDOK), f);
  2482.                 EnableWindow(GetDlgItem(hwnd, IDD_AACHOOSER_BTN_PROPERTIES), f);
  2483.  
  2484.                 AppHourGlass(FALSE);
  2485.             }
  2486.             return (TRUE);
  2487.  
  2488.  
  2489.         case WM_COMMAND:
  2490.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  2491.             f   = FALSE;
  2492.  
  2493.             switch (uId)
  2494.             {
  2495.                 case IDD_AACHOOSER_BTN_BROWSE:
  2496.                     f = AcmAppChooserSaveFile(hwnd, paacd);
  2497.                     break;
  2498.  
  2499.                 case IDD_AACHOOSER_BTN_PROPERTIES:
  2500.                     f = AcmAppChooserProperties(hwnd, paacd);
  2501.                     break;
  2502.  
  2503.                 case IDD_AACHOOSER_BTN_FORMAT_OPTIONS:
  2504.                 case IDD_AACHOOSER_BTN_FORMAT:
  2505.                     f = (IDD_AACHOOSER_BTN_FORMAT_OPTIONS == uId);
  2506.                     f = AcmAppChooserFormat(hwnd, paacd, f);
  2507.                     break;
  2508.  
  2509.                 case IDD_AACHOOSER_BTN_FILTER_OPTIONS:
  2510.                 case IDD_AACHOOSER_BTN_FILTER:
  2511.                     f = (IDD_AACHOOSER_BTN_FILTER_OPTIONS == uId);
  2512.                     f = AcmAppChooserFilter(hwnd, paacd, f);
  2513.                     break;
  2514.  
  2515.  
  2516.                 case IDD_AACHOOSER_COMBO_DRIVER:
  2517.                     uCmd = GET_WM_COMMAND_CMD(wParam, lParam);
  2518.                     switch (uCmd)
  2519.                     {
  2520.                         case CBN_SELCHANGE:
  2521.                             f = TRUE;
  2522.                             break;
  2523.                     }
  2524.                     break;
  2525.  
  2526.  
  2527.                 case IDD_AACHOOSER_CHECK_FILTER:
  2528.                 case IDD_AACHOOSER_CHECK_NONREALTIME:
  2529.                 case IDD_AACHOOSER_CHECK_ASYNC:
  2530.                     f = TRUE;
  2531.                     break;
  2532.  
  2533.  
  2534.                 case IDOK:
  2535.                     hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT);
  2536.                     Edit_GetText(hedit, paacd->szFilePathDst, SIZEOF(paacd->szFilePathDst));
  2537.                     
  2538.                 case IDCANCEL:
  2539.                     EndDialog(hwnd, (IDOK == uId));
  2540.                     break;
  2541.             }
  2542.  
  2543.             //
  2544.             //
  2545.             //
  2546.             if (f)
  2547.             {
  2548.                 AppHourGlass(TRUE);
  2549.  
  2550.                 f = AcmAppChooserUpdateDisplay(hwnd, paacd);
  2551.                 EnableWindow(GetDlgItem(hwnd, IDOK), f);
  2552.                 EnableWindow(GetDlgItem(hwnd, IDD_AACHOOSER_BTN_PROPERTIES), f);
  2553.  
  2554.                 AppHourGlass(FALSE);
  2555.             }
  2556.             break;
  2557.     }
  2558.  
  2559.     return (FALSE);
  2560. } // AcmAppDlgProcChooser()
  2561.