home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / audio / mixapp / mameter.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  20KB  |  731 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) 1993 - 1997  Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. //  mameter.c
  13. //
  14. //  Description:
  15. //
  16. //
  17. //  History:
  18. //       9/21/93
  19. //
  20. //==========================================================================;
  21.  
  22. #include <windows.h>
  23. #include <windowsx.h>
  24. #include <mmsystem.h>
  25. #include "muldiv32.h"
  26.  
  27. #include "mixapp.h"
  28.  
  29. #include "debug.h"
  30.  
  31.  
  32. //
  33. //
  34. //
  35. typedef struct tMACONTROLINSTANCE_METER
  36. {
  37.     LPMACONTROLINSTANCE             pmaci;
  38.     BOOL                            fSigned;
  39.     DWORD                           dwRange;
  40.     MIXERCONTROLDETAILS_SIGNED      pmxcd_s[];
  41.  
  42. } MACONTROLINSTANCE_METER, *PMACONTROLINSTANCE_METER;
  43.  
  44.  
  45. //==========================================================================;
  46. //
  47. //
  48. //
  49. //
  50. //==========================================================================;
  51.  
  52. //--------------------------------------------------------------------------;
  53. //
  54. //  BOOL MixAppControlChangeMeter
  55. //
  56. //  Description:
  57. //
  58. //
  59. //  Arguments:
  60. //      HWND hwnd:
  61. //
  62. //      HMIXER hmx:
  63. //
  64. //      DWORD dwControlID:
  65. //
  66. //  Return (BOOL):
  67. //
  68. //  History:
  69. //      09/22/93
  70. //
  71. //--------------------------------------------------------------------------;
  72.  
  73. BOOL FNLOCAL MixAppControlChangeMeter
  74. (
  75.     HWND                    hwnd,
  76.     HMIXER                  hmx,
  77.     DWORD                   dwControlID
  78. )
  79. {
  80.     MMRESULT                        mmr;
  81.     HWND                            htxt;
  82.     PMACONTROLINSTANCE_METER        pmaci_meter;
  83.     LPMACONTROLINSTANCE             pmaci;
  84.     LPMIXERLINE                     pmxl;
  85.     LPMIXERCONTROL                  pmxctrl;
  86.     PMIXERCONTROLDETAILS_SIGNED     pmxcd_s;
  87.     UINT                            cChannels;
  88.     UINT                            cMultipleItems;
  89.     UINT                            u;
  90.     UINT                            uIndex;
  91.     UINT                            v;
  92.     MIXERCONTROLDETAILS             mxcd;
  93.     HWND                            hsbFocus;
  94.     HWND                            hsb;
  95.     BOOL                            fSigned;
  96.     DWORD                           dwRange;
  97.     DWORD                           dwValue;
  98.     int                             nValue;
  99.  
  100.  
  101.     hsbFocus = GetFocus();
  102.     if (NULL == hsbFocus)
  103.     {
  104.         hsbFocus = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE);
  105.     }
  106.     else
  107.     {
  108.         uIndex = GetDlgCtrlID(hsbFocus);
  109.         if (uIndex < IDD_MACONTROL_MULTICHANNEL_BASE)
  110.         {
  111.             hsbFocus = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE);
  112.         }
  113.     }
  114.  
  115.  
  116.     //
  117.     //
  118.     //
  119.     pmaci_meter = (PMACONTROLINSTANCE_METER)(UINT)GetWindowLong(hwnd, DWL_USER);
  120.     pmaci       = pmaci_meter->pmaci;
  121.     pmxl        = pmaci->pmxl;
  122.     pmxctrl     = pmaci->pmxctrl;
  123.     pmxcd_s     = &pmaci_meter->pmxcd_s[0];
  124.     fSigned     = pmaci_meter->fSigned;
  125.     dwRange     = pmaci_meter->dwRange;
  126.  
  127.     cChannels = (UINT)pmxl->cChannels;
  128.     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  129.         cChannels = 1;
  130.  
  131.     //
  132.     //
  133.     //
  134.     mxcd.cbStruct       = sizeof(mxcd);
  135.     mxcd.dwControlID    = pmxctrl->dwControlID;
  136.     mxcd.cChannels      = cChannels;
  137.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  138.     mxcd.cbDetails      = sizeof(*pmxcd_s);
  139.     mxcd.paDetails      = pmxcd_s;
  140.  
  141.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
  142.     if (MMSYSERR_NOERROR != mmr)
  143.     {
  144.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  145.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  146.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  147.         return (FALSE);
  148.     }
  149.  
  150.  
  151.     cMultipleItems = 1;
  152.     if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl->fdwControl)
  153.         cMultipleItems = (UINT)pmxctrl->cMultipleItems;
  154.  
  155.  
  156.     for (u = 0; u < cChannels; u++)
  157.     {
  158.         for (v = 0; v < cMultipleItems; v++)
  159.         {
  160.             uIndex = (u * cMultipleItems) + v;
  161.  
  162.             if (fSigned)
  163.             {
  164.                 dwValue = (DWORD)(pmxcd_s[uIndex].lValue -
  165.                                   pmxctrl->Bounds.lMinimum);
  166.             }
  167.             else
  168.             {
  169.                 dwValue  = (DWORD)pmxcd_s[uIndex].lValue;
  170.                 dwValue -= pmxctrl->Bounds.dwMinimum;
  171.             }
  172.  
  173.             nValue = (int)MulDivRN(dwValue, 32767, dwRange);
  174.  
  175.             //
  176.             //  Windows is stupid and forces an update to scrollbars
  177.             //  (a flickering paint) even when the position does not
  178.             //  change... so don't update if it is already in the
  179.             //  right position.
  180.             //
  181.             hsb = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE + uIndex);
  182.  
  183.             if (hsbFocus == hsb)
  184.             {
  185.                 htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  186.                 if (fSigned)
  187.                 {
  188.                     AppSetWindowText(htxt, "mapped=%d, lValue=%ld",
  189.                                      nValue,
  190.                                      pmxcd_s[uIndex].lValue);
  191.                 }
  192.                 else
  193.                 {
  194.                     AppSetWindowText(htxt, "mapped=%d, dwValue=%lu",
  195.                                      nValue,
  196.                                      pmxcd_s[uIndex].lValue);
  197.                 }
  198.             }
  199.  
  200.             if (32767 - nValue == GetScrollPos(hsb, SB_CTL))
  201.                 continue;
  202.  
  203.             //
  204.             //  note that we _invert_ the position since a meter will
  205.             //  increase approaching the top (opposite of scrollbar
  206.             //  logic)
  207.             //
  208.             SetScrollPos(hsb, SB_CTL, 32767 - nValue, TRUE);
  209.         }
  210.     }
  211.  
  212.  
  213.  
  214.  
  215.     //
  216.     //
  217.     //
  218.     mxcd.cbStruct       = sizeof(mxcd);
  219.     mxcd.dwControlID    = pmxctrl->dwControlID;
  220.     mxcd.cChannels      = 1;
  221.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  222.     mxcd.cbDetails      = sizeof(*pmxcd_s);
  223.     mxcd.paDetails      = pmxcd_s;
  224.  
  225.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
  226.     if (MMSYSERR_NOERROR != mmr)
  227.     {
  228.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  229.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  230.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  231.         return (FALSE);
  232.     }
  233.  
  234.  
  235.     for (v = 0; v < cMultipleItems; v++)
  236.     {
  237.         uIndex = v;
  238.  
  239.         if (fSigned)
  240.         {
  241.             dwValue = (DWORD)(pmxcd_s[uIndex].lValue -
  242.                               pmxctrl->Bounds.lMinimum);
  243.         }
  244.         else
  245.         {
  246.             dwValue  = (DWORD)pmxcd_s[uIndex].lValue;
  247.             dwValue -= pmxctrl->Bounds.dwMinimum;
  248.         }
  249.  
  250.         nValue = (int)MulDivRN(dwValue, 32767, dwRange);
  251.  
  252.         hsb = GetDlgItem(hwnd, IDD_MACONTROL_UNIFORM_BASE + uIndex);
  253.         if (hsbFocus == hsb)
  254.         {
  255.             htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  256.             if (fSigned)
  257.             {
  258.                 AppSetWindowText(htxt, "mapped=%d, lValue=%ld",
  259.                                  nValue,
  260.                                  pmxcd_s[uIndex].lValue);
  261.             }
  262.             else
  263.             {
  264.                 AppSetWindowText(htxt, "mapped=%d, dwValue=%lu",
  265.                                  nValue,
  266.                                  pmxcd_s[uIndex].lValue);
  267.             }
  268.         }
  269.  
  270.         if (32767 - nValue == GetScrollPos(hsb, SB_CTL))
  271.             continue;
  272.  
  273.         //
  274.         //  note that we _invert_ the position since a meter will
  275.         //  increase approaching the top (opposite of scrollbar
  276.         //  logic)
  277.         //
  278.         SetScrollPos(hsb, SB_CTL, 32767 - nValue, TRUE);
  279.     }
  280.  
  281.  
  282.     return (TRUE);
  283. } // MixAppControlChangeMeter()
  284.  
  285.  
  286. //--------------------------------------------------------------------------;
  287. //
  288. //  BOOL MixAppLineChangeMeter
  289. //
  290. //  Description:
  291. //
  292. //
  293. //  Arguments:
  294. //      HWND hwnd:
  295. //
  296. //      HMIXER hmx:
  297. //
  298. //      DWORD dwLineID:
  299. //
  300. //  Return (BOOL):
  301. //
  302. //  History:
  303. //      09/24/93
  304. //
  305. //--------------------------------------------------------------------------;
  306.  
  307. BOOL FNLOCAL MixAppLineChangeMeter
  308. (
  309.     HWND                    hwnd,
  310.     HMIXER                  hmx,
  311.     DWORD                   dwLineID
  312. )
  313. {
  314.     MMRESULT                    mmr;
  315.     PMACONTROLINSTANCE_METER    pmaci_meter;
  316.     LPMACONTROLINSTANCE         pmaci;
  317.     LPMIXERLINE                 pmxl;
  318.     MIXERLINE                   mxl;
  319.     BOOL                        fSource;
  320.     BOOL                        fActive;
  321.     BOOL                        fDisconnected;
  322.     HWND                        htxt;
  323.  
  324.  
  325.     //
  326.     //
  327.     //
  328.     pmaci_meter = (PMACONTROLINSTANCE_METER)(UINT)GetWindowLong(hwnd, DWL_USER);
  329.     pmaci       = pmaci_meter->pmaci;
  330.     pmxl        = pmaci->pmxl;
  331.  
  332.     if (pmxl->dwLineID != dwLineID)
  333.     {
  334.         DPF(0, "!MixAppLineChangeMeter: why am i getting notifications for some other line??");
  335.  
  336.         //
  337.         //  this would be a bug in this app... keep from bombing though
  338.         //  until i fix it.
  339.         //
  340.         dwLineID = pmxl->dwLineID;
  341.     }
  342.  
  343.     //
  344.     //  get the current state of the line that changed.. this is actually
  345.     //  silly that you have to do this just to determine if the line went
  346.     //  [in]active. sigh..
  347.     //
  348.     mxl.cbStruct      = sizeof(mxl);
  349.     mxl.dwLineID      = dwLineID;
  350.  
  351.     mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_LINEID);
  352.     if (MMSYSERR_NOERROR != mmr)
  353.     {
  354.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  355.                   "mixerGetLineInfo(lineid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  356.                   dwLineID, ghmx, mmr);
  357.  
  358.         return (FALSE);
  359.     }
  360.  
  361.     fSource       = (0 != (MIXERLINE_LINEF_SOURCE & mxl.fdwLine));
  362.     fActive       = (0 != (MIXERLINE_LINEF_ACTIVE & mxl.fdwLine));
  363.     fDisconnected = (0 != (MIXERLINE_LINEF_DISCONNECTED & mxl.fdwLine));
  364.  
  365.  
  366.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_LINEINFO);
  367.     AppSetWindowText(htxt, "(%s), '%s', %s, %s",
  368.                      fSource ? (LPSTR)"src" : (LPSTR)"DST",
  369.                      (LPSTR)mxl.szShortName,
  370.                      fActive ? (LPSTR)"ACTIVE" : (LPSTR)"inactive",
  371.                      fDisconnected ? (LPSTR)"DISCONNECTED" : (LPSTR)"connected");
  372.  
  373.     return (fActive);
  374. } // MixAppLineChangeMeter()
  375.  
  376.  
  377. //--------------------------------------------------------------------------;
  378. //
  379. //  BOOL MixAppInitDialogMeter
  380. //
  381. //  Description:
  382. //
  383. //
  384. //  Arguments:
  385. //      HWND hwnd:
  386. //
  387. //      HWND hwndFocus:
  388. //
  389. //      LPARAM lParam:
  390. //
  391. //  Return (BOOL):
  392. //
  393. //  History:
  394. //      09/22/93
  395. //
  396. //--------------------------------------------------------------------------;
  397.  
  398. BOOL FNLOCAL MixAppInitDialogMeter
  399. (
  400.     HWND                    hwnd,
  401.     HWND                    hwndFocus,
  402.     LPARAM                  lParam
  403. )
  404. {
  405.     #define FSB_DEF_STYLE   (WS_VISIBLE | WS_CHILD | SBS_VERT | WS_TABSTOP)
  406.  
  407.     static TCHAR        szScrollBar[] = TEXT("scrollbar");
  408.     static TCHAR        szTitle[]     = TEXT("Meter Class: '%s'");
  409.  
  410.     TCHAR                       szControlType[64];
  411.     LPMACONTROLINSTANCE         pmaci;
  412.     PMACONTROLINSTANCE_METER    pmaci_meter;
  413.  
  414.     LPMIXERLINE                 pmxl;
  415.     LPMIXERCONTROL              pmxctrl;
  416.  
  417.     HWND                        htxt;
  418.     UINT                        u;
  419.     UINT                        v;
  420.     HWND                        hsb;
  421.     RECT                        rcM;
  422.     RECT                        rcU;
  423.     int                         cxvsb;
  424.     UINT                        cb;
  425.     UINT                        cChannels;
  426.     UINT                        cMultipleItems;
  427.     UINT                        uIndex;
  428.     DWORD                       dwRange;
  429.     BOOL                        fSigned;
  430.  
  431.  
  432.     //
  433.     //
  434.     //
  435.     pmaci = (LPMACONTROLINSTANCE)lParam;
  436.     if (NULL == pmaci)
  437.     {
  438.         DPF(0, "!MixAppInitDialogMeter: pmaci passed in lParam is NULL!?!");
  439.         return (FALSE);
  440.     }
  441.  
  442.     pmxl    = pmaci->pmxl;
  443.     pmxctrl = pmaci->pmxctrl;
  444.  
  445.     if (!MixAppGetControlTypeName(pmxctrl, szControlType))
  446.     {
  447.         return (FALSE);
  448.     }
  449.  
  450.     //
  451.     //
  452.     //
  453.     switch (pmxctrl->dwControlType)
  454.     {
  455.         case MIXERCONTROL_CONTROLTYPE_SIGNEDMETER:
  456.         case MIXERCONTROL_CONTROLTYPE_PEAKMETER:
  457.         case MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER:
  458.             break;
  459.  
  460.         default:
  461.             DPF(0, "!MixAppInitDialogMeter: pmxctrl->dwControlType=%.08lXh not valid meter!", pmxctrl->dwControlType);
  462.             return (FALSE);
  463.     }
  464.  
  465.     fSigned = (MIXERCONTROL_CT_UNITS_SIGNED == (MIXERCONTROL_CT_UNITS_MASK & pmxctrl->dwControlType));
  466.  
  467.  
  468.     //
  469.     //
  470.     //
  471.     AppSetWindowText(hwnd, szTitle, (LPTSTR)szControlType);
  472.     SetDlgItemText(hwnd, IDD_MACONTROL_TXT_SHORT_NAME, pmxctrl->szShortName);
  473.     SetDlgItemText(hwnd, IDD_MACONTROL_TXT_LONG_NAME,  pmxctrl->szName);
  474.  
  475.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_BOUNDS);
  476.     if (fSigned)
  477.     {
  478.         AppSetWindowText(htxt, "lMinimum=%ld, lMaximum=%ld",
  479.                          pmxctrl->Bounds.lMinimum,
  480.                          pmxctrl->Bounds.lMaximum);
  481.  
  482.         dwRange = (pmxctrl->Bounds.lMaximum - pmxctrl->Bounds.lMinimum);
  483.     }
  484.     else
  485.     {
  486.         AppSetWindowText(htxt, "dwMinimum=%lu, dwMaximum=%lu",
  487.                          pmxctrl->Bounds.dwMinimum,
  488.                          pmxctrl->Bounds.dwMaximum);
  489.  
  490.         dwRange = (pmxctrl->Bounds.dwMaximum - pmxctrl->Bounds.dwMinimum);
  491.     }
  492.  
  493.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_METRICS);
  494.     AppSetWindowText(htxt, "dwRange=%lu",
  495.                      dwRange);
  496.  
  497.     //
  498.     //
  499.     //
  500.     cChannels = (UINT)pmxl->cChannels;
  501.     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  502.         cChannels = 1;
  503.  
  504.     cMultipleItems = 1;
  505.     if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl->fdwControl)
  506.         cMultipleItems = (UINT)pmxctrl->cMultipleItems;
  507.  
  508.     cb  = sizeof(*pmaci_meter);
  509.     cb += cChannels * cMultipleItems * sizeof(pmaci_meter->pmxcd_s[0]);
  510.     pmaci_meter = (PMACONTROLINSTANCE_METER)LocalAlloc(LPTR, cb);
  511.     if (NULL == pmaci_meter)
  512.     {
  513.         DPF(0, "!MixAppInitDialogMeter: failed trying to alloc %u bytes for control instance!", cb);
  514.         return (FALSE);
  515.     }
  516.  
  517.  
  518.     //
  519.     //
  520.     //
  521.     SetWindowLong(hwnd, DWL_USER, (LPARAM)(UINT)pmaci_meter);
  522.  
  523.     pmaci_meter->pmaci    = pmaci;
  524.     pmaci_meter->fSigned  = fSigned;
  525.     pmaci_meter->dwRange  = dwRange;
  526.  
  527.  
  528.     //
  529.     //
  530.     //
  531.     //
  532.     cxvsb = GetSystemMetrics(SM_CXVSCROLL);
  533.  
  534.     hsb = GetDlgItem(hwnd, IDD_MACONTROL_GRP_MULTICHANNEL);
  535.     GetWindowRect(hsb, &rcM);
  536.  
  537.     InflateRect(&rcM, -10, -20);
  538.     ScreenToClient(hwnd, (LPPOINT)&rcM.left);
  539.     ScreenToClient(hwnd, (LPPOINT)&rcM.right);
  540.  
  541.     rcM.right = rcM.left + cxvsb;
  542.  
  543.     for (u = 0; u < cChannels; u++)
  544.     {
  545.         for (v = 0; v < cMultipleItems; v++)
  546.         {
  547.             uIndex = (u * cMultipleItems) + v;
  548.  
  549.             hsb = CreateWindow(szScrollBar, gszNull, FSB_DEF_STYLE,
  550.                                rcM.left, rcM.top,
  551.                                rcM.right - rcM.left,
  552.                                rcM.bottom - rcM.top,
  553.                                hwnd, (HMENU)(IDD_MACONTROL_MULTICHANNEL_BASE + uIndex),
  554.                                ghinst, NULL);
  555.  
  556.             SetScrollRange(hsb, SB_CTL, 0, 32767, FALSE);
  557.  
  558.             rcM.left  += cxvsb + 4;
  559.             rcM.right += cxvsb + 4;
  560.         }
  561.  
  562.         //
  563.         //  add more separation between channels
  564.         //
  565.         rcM.left  += cxvsb;
  566.         rcM.right += cxvsb;
  567.     }
  568.  
  569.  
  570.     //
  571.     //
  572.     //
  573.     //
  574.     hsb = GetDlgItem(hwnd, IDD_MACONTROL_GRP_UNIFORM);
  575.     GetWindowRect(hsb, &rcU);
  576.  
  577.     InflateRect(&rcU, -10, -20);
  578.     ScreenToClient(hwnd, (LPPOINT)&rcU.left);
  579.     ScreenToClient(hwnd, (LPPOINT)&rcU.right);
  580.  
  581.     rcU.right = rcU.left + cxvsb;
  582.  
  583.     for (v = 0; v < cMultipleItems; v++)
  584.     {
  585.         hsb = CreateWindow(szScrollBar, gszNull, FSB_DEF_STYLE,
  586.                             rcU.left, rcU.top,
  587.                             rcU.right - rcU.left,
  588.                             rcU.bottom - rcU.top,
  589.                             hwnd, (HMENU)(IDD_MACONTROL_UNIFORM_BASE + v),
  590.                             ghinst, NULL);
  591.  
  592.         SetScrollRange(hsb, SB_CTL, 0, 32767, FALSE);
  593.  
  594.         rcU.left  += cxvsb + 4;
  595.         rcU.right += cxvsb + 4;
  596.     }
  597.  
  598.  
  599.     //
  600.     //
  601.     //
  602.     SendMessage(hwnd,
  603.                 MM_MIXM_LINE_CHANGE,
  604.                 (WPARAM)pmaci->hmx,
  605.                 pmxl->dwLineID);
  606.  
  607.     SendMessage(hwnd,
  608.                 MM_MIXM_CONTROL_CHANGE,
  609.                 (WPARAM)pmaci->hmx,
  610.                 pmxctrl->dwControlID);
  611.  
  612.     return (TRUE);
  613. } // MixAppInitDialogMeter()
  614.  
  615.  
  616. //==========================================================================;
  617. //
  618. //
  619. //
  620. //
  621. //==========================================================================;
  622.  
  623. //--------------------------------------------------------------------------;
  624. //
  625. //  BOOL MixAppDlgProcControlMeter
  626. //
  627. //  Description:
  628. //
  629. //
  630. //  Arguments:
  631. //      HWND hwnd:
  632. //
  633. //      UINT uMsg:
  634. //
  635. //      WPARAM wParam:
  636. //
  637. //      LPARAM lParam:
  638. //
  639. //  Return (BOOL):
  640. //
  641. //  History:
  642. //      07/22/93
  643. //
  644. //--------------------------------------------------------------------------;
  645.  
  646. BOOL CALLBACK MixAppDlgProcControlMeter
  647. (
  648.     HWND                    hwnd,
  649.     UINT                    uMsg,
  650.     WPARAM                  wParam,
  651.     LPARAM                  lParam
  652. )
  653. {
  654.     static  BOOL        fTimerActive;
  655.     LRESULT             lr;
  656.     HLOCAL              hl;
  657.     UINT                uId;
  658.     BOOL                fLineActive;
  659.  
  660.  
  661.     //
  662.     //
  663.     //
  664.     switch (uMsg)
  665.     {
  666.         case WM_INITDIALOG:
  667.             fTimerActive = FALSE;
  668.  
  669.             lr = HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, MixAppInitDialogMeter);
  670.             if (FALSE == lr)
  671.             {
  672.                 EndDialog(hwnd, FALSE);
  673.             }
  674.             else
  675.             {
  676.                 ghdlgControl = hwnd;
  677.             }
  678.             return (TRUE);
  679.  
  680.  
  681.         case MM_MIXM_LINE_CHANGE:
  682.             fLineActive = MixAppLineChangeMeter(hwnd, (HMIXER)wParam, lParam);
  683.             if (fLineActive)
  684.             {
  685.                 if (!fTimerActive)
  686.                 {
  687.                     fTimerActive = (0 != SetTimer(hwnd, 1, 100, NULL));
  688.                 }
  689.             }
  690.             else
  691.             {
  692.                 if (fTimerActive)
  693.                 {
  694.                     KillTimer(hwnd, 1);
  695.                     fTimerActive = FALSE;
  696.                 }
  697.             }
  698.             return (TRUE);
  699.  
  700.  
  701.         case WM_TIMER:
  702.         case MM_MIXM_CONTROL_CHANGE:
  703.             MixAppControlChangeMeter(hwnd, (HMIXER)wParam, lParam);
  704.             return (TRUE);
  705.  
  706.  
  707.         case WM_COMMAND:
  708.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  709.             switch (uId)
  710.             {
  711.                 case IDCANCEL:
  712.                 case IDOK:
  713.                     if (fTimerActive)
  714.                     {
  715.                         KillTimer(hwnd, 1);
  716.                         fTimerActive = FALSE;
  717.                     }
  718.  
  719.                     hl = (HLOCAL)(UINT)GetWindowLong(hwnd, DWL_USER);
  720.                     LocalFree(hl);
  721.  
  722.                     EndDialog(hwnd, TRUE);
  723.                     ghdlgControl = NULL;
  724.                     break;
  725.             }
  726.             break;
  727.     }
  728.  
  729.     return (FALSE);
  730. } // MixAppDlgProcControlMeter()
  731.