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 / mactrls.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  25KB  |  836 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. //  mactrls.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.  
  26. #include "mixapp.h"
  27.  
  28. #include "debug.h"
  29.  
  30.  
  31. TCHAR       gszLineControlsFormatTitle[]= TEXT("Index\t2!Ctrl Type\t8!Ctrl ID\t6!Flags\t6!Items\t3!Name");
  32. TCHAR       gszLineControlsFormatList[] = TEXT("%u\t%-s\t%.08lXh\t%.08lXh\t%lu\t%-s");
  33.  
  34.  
  35.  
  36. //--------------------------------------------------------------------------;
  37. //
  38. //  BOOL MixAppGetControlTypeName
  39. //
  40. //  Description:
  41. //
  42. //
  43. //  Arguments:
  44. //      LPMIXERCONTROl pmxctrl:
  45. //
  46. //      LPTSTR szControlType:
  47. //
  48. //  Return (BOOL):
  49. //
  50. //  History:
  51. //      09/24/93
  52. //
  53. //--------------------------------------------------------------------------;
  54.  
  55. BOOL FNGLOBAL MixAppGetControlTypeName
  56. (
  57.     LPMIXERCONTROL          pmxctrl,
  58.     LPTSTR                  szControlType
  59. )
  60. {
  61.     switch (pmxctrl->dwControlType)
  62.     {
  63.         case MIXERCONTROL_CONTROLTYPE_CUSTOM:
  64.             lstrcpy(szControlType, "Custom!");
  65.             break;
  66.  
  67.         case MIXERCONTROL_CONTROLTYPE_BOOLEANMETER:
  68.             lstrcpy(szControlType, "Boolean Meter");
  69.             break;
  70.  
  71.         case MIXERCONTROL_CONTROLTYPE_SIGNEDMETER:
  72.             lstrcpy(szControlType, "Signed Meter");
  73.             break;
  74.  
  75.         case MIXERCONTROL_CONTROLTYPE_PEAKMETER:
  76.             lstrcpy(szControlType, "Peak Meter");
  77.             break;
  78.  
  79.         case MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER:
  80.             lstrcpy(szControlType, "Unsigned Meter");
  81.             break;
  82.  
  83.         case MIXERCONTROL_CONTROLTYPE_BOOLEAN:
  84.             lstrcpy(szControlType, "Boolean Switch");
  85.             break;
  86.  
  87.         case MIXERCONTROL_CONTROLTYPE_ONOFF:
  88.             lstrcpy(szControlType, "On/Off Switch");
  89.             break;
  90.  
  91.         case MIXERCONTROL_CONTROLTYPE_MUTE:
  92.             lstrcpy(szControlType, "Mute Switch");
  93.             break;
  94.  
  95.         case MIXERCONTROL_CONTROLTYPE_MONO:
  96.             lstrcpy(szControlType, "Mono Switch");
  97.             break;
  98.  
  99.         case MIXERCONTROL_CONTROLTYPE_LOUDNESS:
  100.             lstrcpy(szControlType, "Loudness Switch");
  101.             break;
  102.  
  103.         case MIXERCONTROL_CONTROLTYPE_STEREOENH:
  104.             lstrcpy(szControlType, "Stereo Enh Switch");
  105.             break;
  106.  
  107.         case MIXERCONTROL_CONTROLTYPE_BUTTON:
  108.             lstrcpy(szControlType, "Button");
  109.             break;
  110.  
  111.         case MIXERCONTROL_CONTROLTYPE_DECIBELS:
  112.             lstrcpy(szControlType, "Decibels Number");
  113.             break;
  114.  
  115.         case MIXERCONTROL_CONTROLTYPE_SIGNED:
  116.             lstrcpy(szControlType, "Signed Number");
  117.             break;
  118.  
  119.         case MIXERCONTROL_CONTROLTYPE_PERCENT:
  120.             lstrcpy(szControlType, "Percent Number");
  121.             break;
  122.  
  123.         case MIXERCONTROL_CONTROLTYPE_UNSIGNED:
  124.             lstrcpy(szControlType, "Unsigned Number");
  125.             break;
  126.  
  127.         case MIXERCONTROL_CONTROLTYPE_SLIDER:
  128.             lstrcpy(szControlType, "Slider");
  129.             break;
  130.  
  131.         case MIXERCONTROL_CONTROLTYPE_PAN:
  132.             lstrcpy(szControlType, "Pan Slider");
  133.             break;
  134.  
  135.         case MIXERCONTROL_CONTROLTYPE_QSOUNDPAN:
  136.             lstrcpy(szControlType, "Q-Sound Pan Slider");
  137.             break;
  138.  
  139.         case MIXERCONTROL_CONTROLTYPE_FADER:
  140.             lstrcpy(szControlType, "Fader");
  141.             break;
  142.  
  143.         case MIXERCONTROL_CONTROLTYPE_VOLUME:
  144.             lstrcpy(szControlType, "Volume Fader");
  145.             break;
  146.  
  147.         case MIXERCONTROL_CONTROLTYPE_BASS:
  148.             lstrcpy(szControlType, "Bass Fader");
  149.             break;
  150.  
  151.         case MIXERCONTROL_CONTROLTYPE_TREBLE:
  152.             lstrcpy(szControlType, "Treble Fader");
  153.             break;
  154.  
  155.         case MIXERCONTROL_CONTROLTYPE_EQUALIZER:
  156.             lstrcpy(szControlType, "Equalizer Fader");
  157.             break;
  158.  
  159.         case MIXERCONTROL_CONTROLTYPE_SINGLESELECT:
  160.             lstrcpy(szControlType, "Single-Sel List");
  161.             break;
  162.  
  163.         case MIXERCONTROL_CONTROLTYPE_MUX:
  164.             lstrcpy(szControlType, "MUX List");
  165.             break;
  166.  
  167.         case MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT:
  168.             lstrcpy(szControlType, "Multi-Sel List");
  169.             break;
  170.  
  171.         case MIXERCONTROL_CONTROLTYPE_MIXER:
  172.             lstrcpy(szControlType, "Mixer List");
  173.             break;
  174.  
  175.         case MIXERCONTROL_CONTROLTYPE_MICROTIME:
  176.             lstrcpy(szControlType, "Microsecond Time");
  177.             break;
  178.  
  179.         case MIXERCONTROL_CONTROLTYPE_MILLITIME:
  180.             lstrcpy(szControlType, "Millisecond Time");
  181.             break;
  182.  
  183.         default:
  184.             DPF(0, "!MixAppGetControlTypeName: invalid control type %.08lXh!", pmxctrl->dwControlType);
  185.             lstrcpy(szControlType, "** NOT VALID **");
  186.             return (FALSE);
  187.     }
  188.  
  189.     return (TRUE);
  190. } // MixAppGetControlTypeName()
  191.  
  192.  
  193. //==========================================================================;
  194. //
  195. //
  196. //
  197. //
  198. //==========================================================================;
  199.  
  200. //--------------------------------------------------------------------------;
  201. //
  202. //  BOOL MixAppDisplayControl
  203. //
  204. //  Description:
  205. //
  206. //
  207. //  Arguments:
  208. //      HWND hwnd:
  209. //
  210. //      DWORD dwControlID:
  211. //
  212. //  Return (BOOL):
  213. //
  214. //  History:
  215. //      07/21/93
  216. //
  217. //--------------------------------------------------------------------------;
  218.  
  219. BOOL FNLOCAL MixAppDisplayControl
  220. (
  221.     HWND                    hwnd,
  222.     DWORD                   dwControlID
  223. )
  224. {
  225.     MIXERLINECONTROLS   mxlc;
  226.     MMRESULT            mmr;
  227.     BOOL                f;
  228.     MACONTROLINSTANCE   maci;
  229.  
  230.  
  231.     //
  232.     //
  233.     //
  234.     //
  235.     mxlc.cbStruct    = sizeof(mxlc);
  236. ////mxlc.dwLineID    = 0;
  237.     mxlc.dwControlID = dwControlID;
  238. ////mxlc.cControls   = 1;
  239.     mxlc.cbmxctrl    = sizeof(gmxctrl);
  240.     mxlc.pamxctrl    = &gmxctrl;
  241.  
  242.     mmr = mixerGetLineControls((HMIXEROBJ)ghmx, &mxlc, MIXER_GETLINECONTROLSF_ONEBYID);
  243.     if (MMSYSERR_NOERROR != mmr)
  244.     {
  245.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  246.                   "mixerGetLineControls(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  247.                   dwControlID, ghmx, mmr);
  248.         return (FALSE);
  249.     }
  250.  
  251.  
  252.     //
  253.     //
  254.     //
  255.     if (MIXERCONTROL_CONTROLF_DISABLED & gmxctrl.fdwControl)
  256.     {
  257.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  258.                   "This control (ctrlid=%.08lXh) is disabled.",
  259.                   dwControlID);
  260.         return (FALSE);
  261.     }
  262.  
  263.  
  264.     //
  265.     //
  266.     //
  267.     gfDisplayingControl = TRUE;
  268.     gdwControlID        = dwControlID;
  269.  
  270.  
  271.     //
  272.     //
  273.     //
  274.     maci.hmx        = ghmx;
  275.     maci.pmxl       = &gmxl;
  276.     maci.pmxctrl    = &gmxctrl;
  277.  
  278.  
  279.  
  280.     //
  281.     //
  282.     //
  283.     //
  284.     f = FALSE;
  285.     switch (MIXERCONTROL_CT_CLASS_MASK & gmxctrl.dwControlType)
  286.     {
  287.         case MIXERCONTROL_CT_CLASS_CUSTOM:
  288.             AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  289.                       "Control type class CUSTOM not done yet!");
  290.             break;
  291.  
  292.         case MIXERCONTROL_CT_CLASS_METER:
  293.             f = DialogBoxParam(ghinst,
  294.                                DLG_MIXAPP_CONTROL,
  295.                                hwnd,
  296.                                MixAppDlgProcControlMeter,
  297.                                (LPARAM)(LPVOID)&maci);
  298.             break;
  299.  
  300.         case MIXERCONTROL_CT_CLASS_SWITCH:
  301.             f = DialogBoxParam(ghinst,
  302.                                DLG_MIXAPP_CONTROL,
  303.                                hwnd,
  304.                                MixAppDlgProcControlSwitch,
  305.                                (LPARAM)(LPVOID)&maci);
  306.             break;
  307.  
  308.         case MIXERCONTROL_CT_CLASS_NUMBER:
  309.             AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  310.                       "Control type class NUMBER not done yet!");
  311.             break;
  312.  
  313.         case MIXERCONTROL_CT_CLASS_SLIDER:
  314.             AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  315.                       "Control type class SLIDER not done yet!");
  316.             break;
  317.  
  318.         case MIXERCONTROL_CT_CLASS_FADER:
  319.             f = DialogBoxParam(ghinst,
  320.                                DLG_MIXAPP_CONTROL,
  321.                                hwnd,
  322.                                MixAppDlgProcControlFader,
  323.                                (LPARAM)(LPVOID)&maci);
  324.             break;
  325.  
  326.         case MIXERCONTROL_CT_CLASS_LIST:
  327.             f = DialogBoxParam(ghinst,
  328.                                DLG_MIXAPP_CONTROL,
  329.                                hwnd,
  330.                                MixAppDlgProcControlList,
  331.                                (LPARAM)(LPVOID)&maci);
  332.             break;
  333.  
  334.         default:
  335.             AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  336.                       "Unknown control type class=%.08lXh!",
  337.                       gmxctrl.dwControlType);
  338.             break;
  339.     }
  340.  
  341.     gfDisplayingControl = FALSE;
  342.  
  343.     //
  344.     //
  345.     //
  346.     if (!f)
  347.     {
  348.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  349.                   "Do not know how to deal with control type=%.08lXh!",
  350.                   gmxctrl.dwControlType);
  351.     }
  352.  
  353.     return (f);
  354. } // MixAppDisplayControl()
  355.  
  356.  
  357. //==========================================================================;
  358. //
  359. //
  360. //
  361. //
  362. //==========================================================================;
  363.  
  364. //--------------------------------------------------------------------------;
  365. //
  366. //  BOOL MixAppDlgProcControlInfo
  367. //
  368. //  Description:
  369. //
  370. //
  371. //  Arguments:
  372. //      HWND hwnd:
  373. //
  374. //      UINT uMsg:
  375. //
  376. //      WPARAM wParam:
  377. //
  378. //      LPARAM lParam:
  379. //
  380. //  Return (BOOL):
  381. //
  382. //  History:
  383. //      07/12/93
  384. //
  385. //--------------------------------------------------------------------------;
  386.  
  387. BOOL CALLBACK MixAppDlgProcControlInfo
  388. (
  389.     HWND                    hwnd,
  390.     UINT                    uMsg,
  391.     WPARAM                  wParam,
  392.     LPARAM                  lParam
  393. )
  394. {
  395.     HWND                hedit;
  396.     UINT                u;
  397.     MIXERLINECONTROLS   mxlc;
  398.     MIXERCONTROL        mxctrl;
  399.     MMRESULT            mmr;
  400.  
  401.     //
  402.     //
  403.     //
  404.     //
  405.     switch (uMsg)
  406.     {
  407.         case WM_INITDIALOG:
  408.             hedit = GetDlgItem(hwnd, IDD_CONTROLINFO_EDIT_INFO);
  409.             SetWindowFont(hedit, GetStockFont(SYSTEM_FIXED_FONT), FALSE);
  410.  
  411.             //
  412.             //
  413.             //
  414.             //
  415.             mxlc.cbStruct       = sizeof(mxlc);
  416. ////////////mxlc.dwLineID       = 0;
  417.             mxlc.dwControlID    = lParam;
  418. ////////////mxlc.cControls      = 1;
  419.             mxlc.cbmxctrl       = sizeof(mxctrl);
  420.             mxlc.pamxctrl       = &mxctrl;
  421.  
  422.             mmr = mixerGetLineControls((HMIXEROBJ)ghmx, &mxlc, MIXER_GETLINECONTROLSF_ONEBYID);
  423.             if (MMSYSERR_NOERROR != mmr)
  424.             {
  425.                 AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  426.                           "mixerGetLineControls(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  427.                           lParam, ghmx, mmr);
  428.             }
  429.             else
  430.             {
  431.                 static TCHAR    szDisplayTitle[]  = TEXT("[Control Info]\r\n");
  432.  
  433.                 //
  434.                 //
  435.                 //
  436.                 MEditPrintF(hedit, NULL);
  437.                 MEditPrintF(hedit, szDisplayTitle);
  438.  
  439.                 MEditPrintF(hedit, "%25s: %.04Xh", (LPTSTR)"Mixer Handle",
  440.                             ghmx);
  441.  
  442.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"Line ID",
  443.                             mxlc.dwLineID);
  444.  
  445.  
  446.                 //
  447.                 //
  448.                 //
  449.                 MEditPrintF(hedit, "%25s: %lu bytes (requested %lu)", (LPTSTR)"Size of Control Info",
  450.                             mxctrl.cbStruct, (DWORD)sizeof(mxctrl));
  451.  
  452.  
  453.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"Control ID",
  454.                             mxctrl.dwControlID);
  455.  
  456.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"Control Type",
  457.                             mxctrl.dwControlType);
  458.  
  459.                 MEditPrintF(hedit, "~%25s: %.08lXh", (LPTSTR)"Control Flags",
  460.                             mxctrl.fdwControl);
  461.  
  462.                 if (MIXERCONTROL_CONTROLF_DISABLED & mxctrl.fdwControl)
  463.                     MEditPrintF(hedit, "~, disabled");
  464.  
  465.                 if (MIXERCONTROL_CONTROLF_MULTIPLE & mxctrl.fdwControl)
  466.                     MEditPrintF(hedit, "~, multiple");
  467.  
  468.                 if (MIXERCONTROL_CONTROLF_UNIFORM & mxctrl.fdwControl)
  469.                     MEditPrintF(hedit, "~, uniform");
  470.  
  471.                 if (~(MIXERCONTROL_CONTROLF_UNIFORM | MIXERCONTROL_CONTROLF_MULTIPLE | MIXERCONTROL_CONTROLF_DISABLED) & mxctrl.fdwControl)
  472.                     MEditPrintF(hedit, "~, *INVALID FLAGS*");
  473.  
  474.                 MEditPrintF(hedit, "");
  475.  
  476.                 MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Multiple Items",
  477.                             mxctrl.cMultipleItems);
  478.  
  479.                 MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Short Name",
  480.                             (LPTSTR)mxctrl.szShortName);
  481.  
  482.                 MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Name",
  483.                             (LPTSTR)mxctrl.szName);
  484.  
  485.  
  486.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"dwMinimum",
  487.                             mxctrl.Bounds.dwMinimum);
  488.  
  489.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"dwMaximum",
  490.                             mxctrl.Bounds.dwMaximum);
  491.  
  492.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"cSteps",
  493.                             mxctrl.Metrics.cSteps);
  494.             }
  495.  
  496.             return (TRUE);
  497.  
  498.         case WM_COMMAND:
  499.             u = GET_WM_COMMAND_ID(wParam, lParam);
  500.             if ((IDOK == u) || (IDCANCEL == u))
  501.             {
  502.                 EndDialog(hwnd, (IDOK == u));
  503.             }
  504.             break;
  505.     }
  506.  
  507.     return (FALSE);
  508. } // MixAppDlgProcControlInfo()
  509.  
  510.  
  511. //--------------------------------------------------------------------------;
  512. //
  513. //  BOOL MixAppDlgProcLineControls
  514. //
  515. //  Description:
  516. //      This dialog procedure is used to display driver capabilities.
  517. //
  518. //  Arguments:
  519. //      HWND hwnd: Handle to window.
  520. //
  521. //      UINT uMsg: Message being sent to the window.
  522. //
  523. //      WPARAM wParam: Specific argument to message.
  524. //
  525. //      LPARAM lParam: Specific argument to message.
  526. //
  527. //  Return (BOOL):
  528. //      The return value is specific to the message that was received. For
  529. //      the most part, it is FALSE if this dialog procedure does not handle
  530. //      a message.
  531. //
  532. //  History:
  533. //       1/ 2/93
  534. //
  535. //--------------------------------------------------------------------------;
  536.  
  537. BOOL CALLBACK MixAppDlgProcLineControls
  538. (
  539.     HWND                    hwnd,
  540.     UINT                    uMsg,
  541.     WPARAM                  wParam,
  542.     LPARAM                  lParam
  543. )
  544. {
  545.     static PTABBEDLISTBOX   ptlb;
  546.     HWND                hwndStatic;
  547.     MMRESULT            mmr;
  548.     RECT                rc;
  549.     PAINTSTRUCT         ps;
  550.     UINT                uId;
  551.     UINT                uCode;
  552.     int                 n;
  553.     LRESULT             lr;
  554.  
  555.     UINT                cbmxctrls;
  556.     MIXERLINECONTROLS   mxlc;
  557.     PMIXERCONTROL       pamxctrl;
  558.  
  559.  
  560.     //
  561.     //
  562.     //
  563.     switch (uMsg)
  564.     {
  565.         case WM_INITDIALOG:
  566.             hwndStatic = GetDlgItem(hwnd, IDD_LINECONTROLS_STATIC_POSITION);
  567.  
  568.             GetWindowRect(hwndStatic, &rc);
  569.             ScreenToClient(hwnd, (LPPOINT)&rc.left);
  570.             ScreenToClient(hwnd, (LPPOINT)&rc.right);
  571.  
  572.             ShowWindow(hwndStatic, SW_HIDE);
  573.  
  574.             EnableWindow(GetDlgItem(hwnd, IDD_LINECONTROLS_BTN_INFO), FALSE);
  575.             EnableWindow(GetDlgItem(hwnd, IDD_LINECONTROLS_BTN_SETTINGS), FALSE);
  576.  
  577.             ptlb = TlbCreate(hwnd, IDD_LINECONTROLS_LIST_CONTROLS, &rc);
  578.             if (NULL == ptlb)
  579.                 return (TRUE);
  580.  
  581.             TlbSetFont(ptlb, GetStockFont(SYSTEM_FONT), FALSE);
  582.             TlbSetTitleAndTabs(ptlb, gszLineControlsFormatTitle, FALSE);
  583.  
  584.             SetWindowPos(ptlb->hlb, GetDlgItem(hwnd, IDOK),
  585.                             0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
  586.  
  587.             ListBox_ResetContent(ptlb->hlb);
  588.  
  589.             //
  590.             //
  591.             //
  592.             //
  593.             gmxl.cbStruct     = sizeof(gmxl);
  594.             gmxl.dwLineID     = lParam;
  595.  
  596.             mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &gmxl, MIXER_GETLINEINFOF_LINEID);
  597.             if (MMSYSERR_NOERROR != mmr)
  598.             {
  599.                 AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  600.                         "mixerGetLineInfo(lineid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  601.                         lParam, ghmx, mmr);
  602.                 EndDialog(hwnd, FALSE);
  603.                 return (TRUE);
  604.             }
  605.  
  606.             if (0 == gmxl.cControls)
  607.             {
  608.                 AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  609.                             "There are no controls associated with the selected line.");
  610.                 EndDialog(hwnd, FALSE);
  611.                 return (TRUE);
  612.             }
  613.  
  614.  
  615.             cbmxctrls = sizeof(*pamxctrl) * (UINT)gmxl.cControls;
  616.  
  617.             pamxctrl = (PMIXERCONTROL)LocalAlloc(LPTR, cbmxctrls);
  618.             if (NULL == pamxctrl)
  619.             {
  620.                 EndDialog(hwnd, FALSE);
  621.                 return (TRUE);
  622.             }
  623.  
  624.             SetWindowRedraw(ptlb->hlb, FALSE);
  625.  
  626.             //
  627.             //
  628.             //
  629.             //
  630.             mxlc.cbStruct       = sizeof(mxlc);
  631.             mxlc.dwLineID       = lParam;
  632. ////////////mxlc.dwControlID    = 0;
  633. ////////////mxlc.dwControlType  = 0;
  634.             mxlc.cControls      = gmxl.cControls;
  635.             mxlc.cbmxctrl       = sizeof(*pamxctrl);
  636.             mxlc.pamxctrl       = pamxctrl;
  637.  
  638.             mmr = mixerGetLineControls((HMIXEROBJ)ghmx, &mxlc, MIXER_GETLINECONTROLSF_ALL);
  639.             if (MMSYSERR_NOERROR != mmr)
  640.             {
  641.                 AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  642.                         "mixerGetLineControls(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  643.                         lParam, ghmx, mmr);
  644.             }
  645.             else
  646.             {
  647.                 TCHAR       ach[128];
  648.                 TCHAR       szControlType[64];
  649.                 UINT        u;
  650.                 int         nIndex;
  651.  
  652.                 if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
  653.                     MixAppDebugLog(NULL);
  654.  
  655.                 for (u = 0; u < mxlc.cControls; u++)
  656.                 {
  657.                     MixAppGetControlTypeName(&pamxctrl[u], szControlType);
  658.  
  659.                     //
  660.                     //
  661.                     //
  662.                     wsprintf(ach, gszLineControlsFormatList,
  663.                             u,
  664.                             (LPTSTR)szControlType,
  665.                             pamxctrl[u].dwControlID,
  666.                             pamxctrl[u].fdwControl,
  667.                             pamxctrl[u].cMultipleItems,
  668.                             (LPSTR)pamxctrl[u].szName);
  669.  
  670.                     if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
  671.                     {
  672.                         MixAppDebugLog(ach);
  673.                         MixAppDebugLog(gszCRLF);
  674.                     }
  675.  
  676.                     nIndex = ListBox_AddString(ptlb->hlb, ach);
  677.                     ListBox_SetItemData(ptlb->hlb, nIndex, pamxctrl[u].dwControlID);
  678.                 }
  679.  
  680.                 ListBox_SetCurSel(ptlb->hlb, 0);
  681.                 EnableWindow(GetDlgItem(hwnd, IDD_LINECONTROLS_BTN_INFO), TRUE);
  682.                 EnableWindow(GetDlgItem(hwnd, IDD_LINECONTROLS_BTN_SETTINGS), TRUE);
  683.             }
  684.  
  685.             SetWindowRedraw(ptlb->hlb, TRUE);
  686.             LocalFree((HLOCAL)pamxctrl);
  687.             return (TRUE);
  688.  
  689.  
  690.         case WM_PAINT:
  691.             if (NULL != ptlb)
  692.             {
  693.                 BeginPaint(hwnd, &ps);
  694.                 TlbPaint(ptlb, hwnd, ps.hdc);
  695.                 EndPaint(hwnd, &ps);
  696.             }
  697.             break;
  698.  
  699.         case WM_COMMAND:
  700.             uId   = GET_WM_COMMAND_ID(wParam, lParam);
  701.             uCode = GET_WM_COMMAND_CMD(wParam, lParam);
  702.             switch (uId)
  703.             {
  704.                 case IDOK:
  705.                 case IDCANCEL:
  706.                     if (NULL != ptlb)
  707.                     {
  708.                         //
  709.                         //  hadidk! don't destroy the listbox window, but
  710.                         //  free all other memory for TLB. the listbox
  711.                         //  window will be destroyed when the dialog is
  712.                         //  destroyed.
  713.                         //
  714.                         ptlb->hlb = NULL;
  715.  
  716.                         TlbDestroy(ptlb);
  717.                         ptlb = NULL;
  718.                     }
  719.  
  720.                     EndDialog(hwnd, TRUE);
  721.                     break;
  722.  
  723.  
  724.                 case IDD_LINECONTROLS_BTN_INFO:
  725.                     n  = ListBox_GetCurSel(ptlb->hlb);
  726.                     if (LB_ERR == n)
  727.                         break;
  728.  
  729.                     lr = ListBox_GetItemData(ptlb->hlb, n);
  730.                     DialogBoxParam(ghinst,
  731.                                    DLG_CONTROLINFO,
  732.                                    hwnd,
  733.                                    MixAppDlgProcControlInfo,
  734.                                    lr);
  735.                     break;
  736.  
  737.                 case IDD_LINECONTROLS_BTN_SETTINGS:
  738.                     n  = ListBox_GetCurSel(ptlb->hlb);
  739.                     if (LB_ERR == n)
  740.                         break;
  741.  
  742.                     lr = ListBox_GetItemData(ptlb->hlb, n);
  743.                     MixAppDisplayControl(hwnd, lr);
  744.                     break;
  745.  
  746.                 case IDD_LINECONTROLS_LIST_CONTROLS:
  747.                     switch (uCode)
  748.                     {
  749.                         case LBN_SELCHANGE:
  750.                             break;
  751.  
  752.                         case LBN_DBLCLK:
  753.                             n  = ListBox_GetCurSel(ptlb->hlb);
  754.                             if (LB_ERR == n)
  755.                                 break;
  756.  
  757.                             lr = ListBox_GetItemData(ptlb->hlb, n);
  758.                             if (GetKeyState(VK_CONTROL) < 0)
  759.                             {
  760.                                 DialogBoxParam(ghinst,
  761.                                                DLG_CONTROLINFO,
  762.                                                hwnd,
  763.                                                MixAppDlgProcControlInfo,
  764.                                                lr);
  765.                             }
  766.                             else
  767.                             {
  768.                                 MixAppDisplayControl(hwnd, lr);
  769.                             }
  770.                             break;
  771.                     }
  772.                     break;
  773.             }
  774.             break;
  775.     }
  776.  
  777.     return (FALSE);
  778. } // MixAppDlgProcLineControls
  779.  
  780.  
  781. //==========================================================================;
  782. //
  783. //
  784. //
  785. //
  786. //==========================================================================;
  787.  
  788. //--------------------------------------------------------------------------;
  789. //
  790. //  LRESULT MixAppControlChange
  791. //
  792. //  Description:
  793. //
  794. //
  795. //  Arguments:
  796. //      HWND hwnd:
  797. //
  798. //      HMIXER hmx:
  799. //
  800. //      DWORD dwControlID:
  801. //
  802. //  Return (LRESULT):
  803. //
  804. //  History:
  805. //      07/21/93
  806. //
  807. //--------------------------------------------------------------------------;
  808.  
  809. LRESULT FNGLOBAL MixAppControlChange
  810. (
  811.     HWND                    hwnd,
  812.     HMIXER                  hmx,
  813.     DWORD                   dwControlID
  814. )
  815. {
  816.     DPF(1, "MixAppControlChange(hwnd=%Xh, hmx=%Xh, dwControlID=%.08lXh)",
  817.         hwnd, hmx, dwControlID);
  818.  
  819.  
  820.     //
  821.     //
  822.     //
  823.     if (gfDisplayingControl &&
  824.         (dwControlID == gdwControlID) &&
  825.         (NULL != ghdlgControl))
  826.     {
  827.         SendMessage(ghdlgControl, MM_MIXM_CONTROL_CHANGE, (WPARAM)hmx, dwControlID);
  828.     }
  829.  
  830.  
  831.     //
  832.     //  return zero because we handled the message
  833.     //
  834.     return (0L);
  835. } // MixAppControlChange()
  836.