MASWITCH.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:20k
源码类别:

Windows编程

开发平台:

Visual C++

  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) 1993 - 1997  Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. //  maswitch.c
  13. //
  14. //  Description:
  15. //
  16. //
  17. //  History:
  18. //       9/21/93
  19. //
  20. //==========================================================================;
  21. #include <windows.h>
  22. #include <windowsx.h>
  23. #include <mmsystem.h>
  24. #include "mixapp.h"
  25. #include "debug.h"
  26. //
  27. //
  28. //
  29. typedef struct tMACONTROLINSTANCE_SWITCH
  30. {
  31.     LPMACONTROLINSTANCE             pmaci;
  32.     MIXERCONTROLDETAILS_BOOLEAN     pmxcd_f[];
  33. } MACONTROLINSTANCE_SWITCH, *PMACONTROLINSTANCE_SWITCH;
  34. //==========================================================================;
  35. //
  36. //
  37. //
  38. //
  39. //==========================================================================;
  40. //--------------------------------------------------------------------------;
  41. //
  42. //  BOOL MixAppControlChangeSwitch
  43. //
  44. //  Description:
  45. //
  46. //
  47. //  Arguments:
  48. //      HWND hwnd:
  49. //
  50. //      HMIXER hmx:
  51. //
  52. //      DWORD dwControlID:
  53. //
  54. //  Return (BOOL):
  55. //
  56. //  History:
  57. //      09/22/93
  58. //
  59. //--------------------------------------------------------------------------;
  60. BOOL FNLOCAL MixAppControlChangeSwitch
  61. (
  62.     HWND                    hwnd,
  63.     HMIXER                  hmx,
  64.     DWORD                   dwControlID
  65. )
  66. {
  67.     MMRESULT                        mmr;
  68.     HWND                            htxt;
  69.     PMACONTROLINSTANCE_SWITCH       pmaci_switch;
  70.     LPMACONTROLINSTANCE             pmaci;
  71.     LPMIXERLINE                     pmxl;
  72.     LPMIXERCONTROL                  pmxctrl;
  73.     PMIXERCONTROLDETAILS_BOOLEAN    pmxcd_f;
  74.     UINT                            cChannels;
  75.     UINT                            cMultipleItems;
  76.     UINT                            u;
  77.     UINT                            uIndex;
  78.     UINT                            v;
  79.     BOOL                            fValue;
  80.     MIXERCONTROLDETAILS             mxcd;
  81.     HWND                            hcheckFocus;
  82.     HWND                            hcheck;
  83.     hcheckFocus = GetFocus();
  84.     if (NULL == hcheckFocus)
  85.     {
  86.         hcheckFocus = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE);
  87.     }
  88.     else
  89.     {
  90.         uIndex = GetDlgCtrlID(hcheckFocus);
  91.         if (uIndex < IDD_MACONTROL_MULTICHANNEL_BASE)
  92.         {
  93.             hcheckFocus = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE);
  94.         }
  95.     }
  96.     //
  97.     //
  98.     //
  99.     pmaci_switch = (PMACONTROLINSTANCE_SWITCH)(UINT)GetWindowLong(hwnd, DWL_USER);
  100.     pmaci        = pmaci_switch->pmaci;
  101.     pmxl         = pmaci->pmxl;
  102.     pmxctrl      = pmaci->pmxctrl;
  103.     pmxcd_f      = &pmaci_switch->pmxcd_f[0];
  104.     cChannels = (UINT)pmxl->cChannels;
  105.     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  106.         cChannels = 1;
  107.     //
  108.     //
  109.     //
  110.     mxcd.cbStruct       = sizeof(mxcd);
  111.     mxcd.dwControlID    = pmxctrl->dwControlID;
  112.     mxcd.cChannels      = cChannels;
  113.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  114.     mxcd.cbDetails      = sizeof(*pmxcd_f);
  115.     mxcd.paDetails      = pmxcd_f;
  116.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
  117.     if (MMSYSERR_NOERROR != mmr)
  118.     {
  119.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  120.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  121.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  122.         return (FALSE);
  123.     }
  124.     cMultipleItems = 1;
  125.     if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl->fdwControl)
  126.         cMultipleItems = (UINT)pmxctrl->cMultipleItems;
  127.     for (u = 0; u < cChannels; u++)
  128.     {
  129.         for (v = 0; v < cMultipleItems; v++)
  130.         {
  131.             uIndex = (u * cMultipleItems) + v;
  132.             fValue = (BOOL)pmxcd_f[uIndex].fValue;
  133.             hcheck = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE + uIndex);
  134.             if (hcheckFocus == hcheck)
  135.             {
  136.                 htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  137.                 AppSetWindowText(htxt, "mapped=%d, fValue=%ld",
  138.                                 fValue,
  139.                                 pmxcd_f[uIndex].fValue);
  140.             }
  141.             if (fValue == (BOOL)IsDlgButtonChecked(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE + uIndex))
  142.                 continue;
  143.             CheckDlgButton(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE + uIndex, fValue);
  144.         }
  145.     }
  146.     //
  147.     //
  148.     //
  149.     mxcd.cbStruct       = sizeof(mxcd);
  150.     mxcd.dwControlID    = pmxctrl->dwControlID;
  151.     mxcd.cChannels      = 1;
  152.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  153.     mxcd.cbDetails      = sizeof(*pmxcd_f);
  154.     mxcd.paDetails      = pmxcd_f;
  155.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
  156.     if (MMSYSERR_NOERROR != mmr)
  157.     {
  158.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  159.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  160.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  161.         return (FALSE);
  162.     }
  163.     for (v = 0; v < cMultipleItems; v++)
  164.     {
  165.         uIndex = v;
  166.         fValue = (BOOL)pmxcd_f[uIndex].fValue;
  167.         hcheck = GetDlgItem(hwnd, IDD_MACONTROL_UNIFORM_BASE + uIndex);
  168.         if (hcheckFocus == hcheck)
  169.         {
  170.             htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  171.             AppSetWindowText(htxt, "mapped=%d, fValue=%ld",
  172.                              fValue,
  173.                              pmxcd_f[uIndex].fValue);
  174.         }
  175.         if (fValue == (BOOL)IsDlgButtonChecked(hwnd, IDD_MACONTROL_UNIFORM_BASE + uIndex))
  176.             continue;
  177.         CheckDlgButton(hwnd, IDD_MACONTROL_UNIFORM_BASE + uIndex, fValue);
  178.     }
  179.     return (TRUE);
  180. } // MixAppControlChangeSwitch()
  181. //--------------------------------------------------------------------------;
  182. //
  183. //  BOOL MixAppControlSetSwitch
  184. //
  185. //  Description:
  186. //
  187. //
  188. //  Arguments:
  189. //      HWND hwnd:
  190. //
  191. //      HWND hcheck:
  192. //
  193. //  Return (BOOL):
  194. //
  195. //  History:
  196. //      09/22/93
  197. //
  198. //--------------------------------------------------------------------------;
  199. BOOL FNLOCAL MixAppControlSetSwitch
  200. (
  201.     HWND                    hwnd,
  202.     HWND                    hcheck
  203. )
  204. {
  205.     PMACONTROLINSTANCE_SWITCH       pmaci_switch;
  206.     LPMACONTROLINSTANCE             pmaci;
  207.     LPMIXERLINE                     pmxl;
  208.     LPMIXERCONTROL                  pmxctrl;
  209.     PMIXERCONTROLDETAILS_BOOLEAN    pmxcd_f;
  210.     MMRESULT                        mmr;
  211.     BOOL                            fValue;
  212.     UINT                            cChannels;
  213.     UINT                            uIndex;
  214.     MIXERCONTROLDETAILS             mxcd;
  215.     //
  216.     //
  217.     //
  218.     pmaci_switch = (PMACONTROLINSTANCE_SWITCH)(UINT)GetWindowLong(hwnd, DWL_USER);
  219.     pmaci        = pmaci_switch->pmaci;
  220.     pmxl         = pmaci->pmxl;
  221.     pmxctrl      = pmaci->pmxctrl;
  222.     pmxcd_f      = &pmaci_switch->pmxcd_f[0];
  223.     uIndex = GetDlgCtrlID(hcheck);
  224.     //
  225.     //  get value and toggle..
  226.     //
  227.     fValue = (0 == IsDlgButtonChecked(hwnd, uIndex));
  228.     if (uIndex < IDD_MACONTROL_UNIFORM_BASE)
  229.     {
  230.         cChannels = (UINT)pmxl->cChannels;
  231.         if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  232.             cChannels = 1;
  233.         uIndex -= IDD_MACONTROL_MULTICHANNEL_BASE;
  234.     }
  235.     else
  236.     {
  237.         cChannels = 1;
  238.         uIndex -= IDD_MACONTROL_UNIFORM_BASE;
  239.     }
  240.     //
  241.     //
  242.     //
  243.     //
  244.     mxcd.cbStruct       = sizeof(mxcd);
  245.     mxcd.dwControlID    = pmxctrl->dwControlID;
  246.     mxcd.cChannels      = cChannels;
  247.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  248.     mxcd.cbDetails      = sizeof(*pmxcd_f);
  249.     mxcd.paDetails      = pmxcd_f;
  250.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, 0L);
  251.     if (MMSYSERR_NOERROR != mmr)
  252.     {
  253.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  254.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  255.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  256.         return (FALSE);
  257.     }
  258.     pmxcd_f[uIndex].fValue = fValue;
  259.     mmr = mixerSetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, 0L);
  260.     if (MMSYSERR_NOERROR != mmr)
  261.     {
  262.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  263.                   "mixerSetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  264.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  265.         return (FALSE);
  266.     }
  267.     CheckDlgButton(hwnd, GetDlgCtrlID(hcheck), (BOOL)pmxcd_f[uIndex].fValue);
  268. #if 0
  269.     if (0 == uIndex)
  270.     {
  271.         htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  272.         AppSetWindowText(htxt, "mapped=%d, fValue=%ld",
  273.                          nValue,
  274.                          pmxcd_f[uIndex].fValue);
  275.     }
  276. #endif
  277.     return (TRUE);
  278. } // MixAppControlSetSwitch()
  279. //--------------------------------------------------------------------------;
  280. //
  281. //  BOOL MixAppLineChangeSwitch
  282. //
  283. //  Description:
  284. //
  285. //
  286. //  Arguments:
  287. //      HWND hwnd:
  288. //
  289. //      HMIXER hmx:
  290. //
  291. //      DWORD dwLineID:
  292. //
  293. //  Return (BOOL):
  294. //
  295. //  History:
  296. //      09/24/93
  297. //
  298. //--------------------------------------------------------------------------;
  299. BOOL FNLOCAL MixAppLineChangeSwitch
  300. (
  301.     HWND                    hwnd,
  302.     HMIXER                  hmx,
  303.     DWORD                   dwLineID
  304. )
  305. {
  306.     MMRESULT                    mmr;
  307.     PMACONTROLINSTANCE_SWITCH   pmaci_switch;
  308.     LPMACONTROLINSTANCE         pmaci;
  309.     LPMIXERLINE                 pmxl;
  310.     MIXERLINE                   mxl;
  311.     BOOL                        fSource;
  312.     BOOL                        fActive;
  313.     BOOL                        fDisconnected;
  314.     HWND                        htxt;
  315.     //
  316.     //
  317.     //
  318.     pmaci_switch = (PMACONTROLINSTANCE_SWITCH)(UINT)GetWindowLong(hwnd, DWL_USER);
  319.     pmaci       = pmaci_switch->pmaci;
  320.     pmxl        = pmaci->pmxl;
  321.     if (pmxl->dwLineID != dwLineID)
  322.     {
  323.         DPF(0, "!MixAppLineChangeSwitch: why am i getting notifications for some other line??");
  324.         //
  325.         //  this would be a bug in this app... keep from bombing though
  326.         //  until i fix it.
  327.         //
  328.         dwLineID = pmxl->dwLineID;
  329.     }
  330.     //
  331.     //  get the current state of the line that changed.. this is actually
  332.     //  silly that you have to do this just to determine if the line went
  333.     //  [in]active. sigh..
  334.     //
  335.     mxl.cbStruct      = sizeof(mxl);
  336.     mxl.dwLineID      = dwLineID;
  337.     mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_LINEID);
  338.     if (MMSYSERR_NOERROR != mmr)
  339.     {
  340.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  341.                   "mixerGetLineInfo(lineid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  342.                   dwLineID, ghmx, mmr);
  343.         return (FALSE);
  344.     }
  345.     fSource       = (0 != (MIXERLINE_LINEF_SOURCE & mxl.fdwLine));
  346.     fActive       = (0 != (MIXERLINE_LINEF_ACTIVE & mxl.fdwLine));
  347.     fDisconnected = (0 != (MIXERLINE_LINEF_DISCONNECTED & mxl.fdwLine));
  348.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_LINEINFO);
  349.     AppSetWindowText(htxt, "(%s), '%s', %s, %s",
  350.                      fSource ? (LPSTR)"src" : (LPSTR)"DST",
  351.                      (LPSTR)mxl.szShortName,
  352.                      fActive ? (LPSTR)"ACTIVE" : (LPSTR)"inactive",
  353.                      fDisconnected ? (LPSTR)"DISCONNECTED" : (LPSTR)"connected");
  354.     return (fActive);
  355. } // MixAppLineChangeSwitch()
  356. //--------------------------------------------------------------------------;
  357. //
  358. //  BOOL MixAppInitDialogSwitch
  359. //
  360. //  Description:
  361. //
  362. //
  363. //  Arguments:
  364. //      HWND hwnd:
  365. //
  366. //      HWND hwndFocus:
  367. //
  368. //      LPARAM lParam:
  369. //
  370. //  Return (BOOL):
  371. //
  372. //  History:
  373. //      09/22/93
  374. //
  375. //--------------------------------------------------------------------------;
  376. BOOL FNLOCAL MixAppInitDialogSwitch
  377. (
  378.     HWND                    hwnd,
  379.     HWND                    hwndFocus,
  380.     LPARAM                  lParam
  381. )
  382. {
  383.     #define FCB_DEF_STYLE   (WS_VISIBLE | WS_CHILD | BS_CHECKBOX | WS_TABSTOP)
  384.     static TCHAR        szButton[]  = TEXT("button");
  385.     static TCHAR        szTitle[]   = TEXT("Switch Class: '%s'");
  386.     TCHAR                       szControlType[64];
  387.     LPMACONTROLINSTANCE         pmaci;
  388.     PMACONTROLINSTANCE_SWITCH   pmaci_switch;
  389.     LPMIXERLINE                 pmxl;
  390.     LPMIXERCONTROL              pmxctrl;
  391.     HWND                        htxt;
  392.     UINT                        u;
  393.     UINT                        v;
  394.     HWND                        hcheck;
  395.     RECT                        rcM;
  396.     RECT                        rcU;
  397.     int                         cycap;
  398.     UINT                        cb;
  399.     UINT                        cChannels;
  400.     UINT                        cMultipleItems;
  401.     UINT                        uIndex;
  402.     //
  403.     //
  404.     //
  405.     pmaci = (LPMACONTROLINSTANCE)lParam;
  406.     if (NULL == pmaci)
  407.     {
  408.         DPF(0, "!MixAppInitDialogSwitch: pmaci passed in lParam is NULL!?!");
  409.         return (FALSE);
  410.     }
  411.     pmxl    = pmaci->pmxl;
  412.     pmxctrl = pmaci->pmxctrl;
  413.     if (!MixAppGetControlTypeName(pmxctrl, szControlType))
  414.     {
  415.         return (FALSE);
  416.     }
  417.     //
  418.     //
  419.     //
  420.     switch (pmxctrl->dwControlType)
  421.     {
  422.         case MIXERCONTROL_CONTROLTYPE_BOOLEAN:
  423.         case MIXERCONTROL_CONTROLTYPE_ONOFF:
  424.         case MIXERCONTROL_CONTROLTYPE_MUTE:
  425.         case MIXERCONTROL_CONTROLTYPE_MONO:
  426.         case MIXERCONTROL_CONTROLTYPE_LOUDNESS:
  427.         case MIXERCONTROL_CONTROLTYPE_STEREOENH:
  428.             break;
  429.         default:
  430.             DPF(0, "!MixAppInitDialogSwitch: pmxctrl->dwControlType=%.08lXh not valid switch!", pmxctrl->dwControlType);
  431.             return (FALSE);
  432.     }
  433.     //
  434.     //
  435.     //
  436.     AppSetWindowText(hwnd, szTitle, (LPTSTR)szControlType);
  437.     SetDlgItemText(hwnd, IDD_MACONTROL_TXT_SHORT_NAME, pmxctrl->szShortName);
  438.     SetDlgItemText(hwnd, IDD_MACONTROL_TXT_LONG_NAME,  pmxctrl->szName);
  439.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_BOUNDS);
  440.     AppSetWindowText(htxt, "dwMinimum=%lu, dwMaximum=%lu",
  441.                      pmxctrl->Bounds.dwMinimum,
  442.                      pmxctrl->Bounds.dwMaximum);
  443.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_METRICS);
  444.     AppSetWindowText(htxt, "N/A");
  445.     //
  446.     //
  447.     //
  448.     cChannels = (UINT)pmxl->cChannels;
  449.     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  450.         cChannels = 1;
  451.     cMultipleItems = 1;
  452.     if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl->fdwControl)
  453.         cMultipleItems = (UINT)pmxctrl->cMultipleItems;
  454.     cb  = sizeof(*pmaci_switch);
  455.     cb += cChannels * cMultipleItems * sizeof(pmaci_switch->pmxcd_f[0]);
  456.     pmaci_switch = (PMACONTROLINSTANCE_SWITCH)LocalAlloc(LPTR, cb);
  457.     if (NULL == pmaci_switch)
  458.     {
  459.         DPF(0, "!MixAppInitDialogSwitch: failed trying to alloc %u bytes for control instance!", cb);
  460.         return (FALSE);
  461.     }
  462.     //
  463.     //
  464.     //
  465.     SetWindowLong(hwnd, DWL_USER, (LPARAM)(UINT)pmaci_switch);
  466.     pmaci_switch->pmaci    = pmaci;
  467.     //
  468.     //
  469.     //
  470.     //
  471.     cycap = GetSystemMetrics(SM_CYCAPTION);
  472.     hcheck = GetDlgItem(hwnd, IDD_MACONTROL_GRP_MULTICHANNEL);
  473.     GetWindowRect(hcheck, &rcM);
  474.     InflateRect(&rcM, -10, -20);
  475.     ScreenToClient(hwnd, (LPPOINT)&rcM.left);
  476.     ScreenToClient(hwnd, (LPPOINT)&rcM.right);
  477.     rcM.bottom = rcM.top + cycap;
  478.     for (u = 0; u < cChannels; u++)
  479.     {
  480.         for (v = 0; v < cMultipleItems; v++)
  481.         {
  482.             uIndex = (u * cMultipleItems) + v;
  483.             hcheck = CreateWindow(szButton, pmxctrl->szShortName, FCB_DEF_STYLE,
  484.                                   rcM.left, rcM.top,
  485.                                   rcM.right - rcM.left,
  486.                                   rcM.bottom - rcM.top,
  487.                                   hwnd, (HMENU)(IDD_MACONTROL_MULTICHANNEL_BASE + uIndex),
  488.                                   ghinst, NULL);
  489.             rcM.top    += cycap + 4;
  490.             rcM.bottom += cycap + 4;
  491.         }
  492.         //
  493.         //  add more separation between channels
  494.         //
  495.         rcM.top    += cycap;
  496.         rcM.bottom += cycap;
  497.     }
  498.     //
  499.     //
  500.     //
  501.     //
  502.     hcheck = GetDlgItem(hwnd, IDD_MACONTROL_GRP_UNIFORM);
  503.     GetWindowRect(hcheck, &rcU);
  504.     InflateRect(&rcU, -10, -20);
  505.     ScreenToClient(hwnd, (LPPOINT)&rcU.left);
  506.     ScreenToClient(hwnd, (LPPOINT)&rcU.right);
  507.     rcU.bottom = rcU.top + cycap;
  508.     for (v = 0; v < cMultipleItems; v++)
  509.     {
  510.         hcheck = CreateWindow(szButton, pmxctrl->szShortName, FCB_DEF_STYLE,
  511.                               rcU.left, rcU.top,
  512.                               rcU.right - rcU.left,
  513.                               rcU.bottom - rcU.top,
  514.                               hwnd, (HMENU)(IDD_MACONTROL_UNIFORM_BASE + v),
  515.                               ghinst, NULL);
  516.         rcU.top    += cycap + 4;
  517.         rcU.bottom += cycap + 4;
  518.     }
  519.     //
  520.     //
  521.     //
  522.     SendMessage(hwnd,
  523.                 MM_MIXM_LINE_CHANGE,
  524.                 (WPARAM)pmaci->hmx,
  525.                 pmxl->dwLineID);
  526.     SendMessage(hwnd,
  527.                 MM_MIXM_CONTROL_CHANGE,
  528.                 (WPARAM)pmaci->hmx,
  529.                 pmxctrl->dwControlID);
  530.     return (TRUE);
  531. } // MixAppInitDialogSwitch()
  532. //==========================================================================;
  533. //
  534. //
  535. //
  536. //
  537. //==========================================================================;
  538. //--------------------------------------------------------------------------;
  539. //
  540. //  BOOL MixAppDlgProcControlSwitch
  541. //
  542. //  Description:
  543. //
  544. //
  545. //  Arguments:
  546. //      HWND hwnd:
  547. //
  548. //      UINT uMsg:
  549. //
  550. //      WPARAM wParam:
  551. //
  552. //      LPARAM lParam:
  553. //
  554. //  Return (BOOL):
  555. //
  556. //  History:
  557. //      07/22/93
  558. //
  559. //--------------------------------------------------------------------------;
  560. BOOL CALLBACK MixAppDlgProcControlSwitch
  561. (
  562.     HWND                    hwnd,
  563.     UINT                    uMsg,
  564.     WPARAM                  wParam,
  565.     LPARAM                  lParam
  566. )
  567. {
  568.     LRESULT             lr;
  569.     HLOCAL              hl;
  570.     UINT                uId;
  571.     if (WM_COMMAND == uMsg)
  572.     {
  573.         uId = GET_WM_COMMAND_ID(wParam, lParam);
  574.         if (IDD_MACONTROL_GRP_MULTICHANNEL <= uId)
  575.         {
  576.             MixAppControlSetSwitch(hwnd, GET_WM_COMMAND_HWND(wParam, lParam));
  577.             return (TRUE);
  578.         }
  579.     }
  580.     //
  581.     //
  582.     //
  583.     switch (uMsg)
  584.     {
  585.         case WM_INITDIALOG:
  586.             lr = HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, MixAppInitDialogSwitch);
  587.             if (FALSE == lr)
  588.             {
  589.                 EndDialog(hwnd, FALSE);
  590.             }
  591.             else
  592.             {
  593.                 ghdlgControl = hwnd;
  594.             }
  595.             return (TRUE);
  596.         case MM_MIXM_LINE_CHANGE:
  597.             MixAppLineChangeSwitch(hwnd, (HMIXER)wParam, lParam);
  598.             return (TRUE);
  599.         case MM_MIXM_CONTROL_CHANGE:
  600.             MixAppControlChangeSwitch(hwnd, (HMIXER)wParam, lParam);
  601.             return (TRUE);
  602.         case WM_COMMAND:
  603.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  604.             switch (uId)
  605.             {
  606.                 case IDCANCEL:
  607.                 case IDOK:
  608.                     hl = (HLOCAL)(UINT)GetWindowLong(hwnd, DWL_USER);
  609.                     LocalFree(hl);
  610.                     EndDialog(hwnd, TRUE);
  611.                     ghdlgControl = NULL;
  612.                     break;
  613.             }
  614.             break;
  615.     }
  616.     return (FALSE);
  617. } // MixAppDlgProcControlSwitch()