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