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 / mmcaps / lowlevel.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  37KB  |  1,585 lines

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. //  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
  5. //  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
  6. //  A PARTICULAR PURPOSE.
  7. //
  8. //  Copyright (C) 1993 - 1997 Microsoft Corporation. All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. //  lowlevel.c
  13. //
  14. //  Description:
  15. //
  16. //
  17. //  History:
  18. //       5/16/93
  19. //
  20. //==========================================================================;
  21.  
  22. #include <windows.h>
  23. #include <windowsx.h>
  24. #include <mmsystem.h>
  25.  
  26. //#include "msmixmgr.h"
  27.  
  28. #include "appport.h"
  29. #include "mmcaps.h"
  30.  
  31. #include "debug.h"
  32.  
  33.  
  34. //
  35. //
  36. //
  37. TCHAR       gszDeviceFormatTitle[]  = TEXT("Type\t8!Index\t5!Version\t7!Product Name");
  38. TCHAR       gszDeviceFormatList[]   = TEXT("%-9s\t%d\t%u.%.02u\t%-32s");
  39.  
  40.  
  41. //
  42. //
  43. //
  44. //
  45. TCHAR       gszBogusCaps[]       = TEXT("????");
  46. TCHAR       gszTimerDevice[]     = TEXT("Internal PC Timer");
  47. TCHAR       gszDefaultMapper[]   = TEXT("Default Mapper");
  48.  
  49.  
  50. #define MMCAPS_DEVTYPE_UNKNOWN      0
  51. #define MMCAPS_DEVTYPE_AUXILIARY    1
  52. #define MMCAPS_DEVTYPE_JOYSTICK     2
  53. #define MMCAPS_DEVTYPE_MIDIIN       3
  54. #define MMCAPS_DEVTYPE_MIDIOUT      4
  55. #define MMCAPS_DEVTYPE_MIXER        5
  56. #define MMCAPS_DEVTYPE_TIMER        6
  57. #define MMCAPS_DEVTYPE_WAVEIN       7
  58. #define MMCAPS_DEVTYPE_WAVEOUT      8
  59.  
  60. PTSTR gaszDeviceType[] =
  61. {
  62.     gszUnknown,
  63.     TEXT("Auxiliary"),
  64.     TEXT("Joystick"),
  65.     TEXT("MIDI In"),
  66.     TEXT("MIDI Out"),
  67.     TEXT("Mixer"),
  68.     TEXT("Timer"),
  69.     TEXT("Wave In"),
  70.     TEXT("Wave Out")
  71. };
  72.  
  73.  
  74.  
  75.  
  76.  
  77. //
  78. //  AUXCAPS
  79. //
  80. //
  81. //
  82. PTSTR gaszAuxCapsTechnology[] =
  83. {
  84.     gszNotSpecified,                //
  85.     TEXT("CD-Audio"),               // AUXCAPS_CDAUDIO
  86.     TEXT("Auxiliary Input")         // AUXCAPS_AUXIN
  87. };
  88.  
  89. #define AUXCAPS_TECHNOLOGY_LAST     AUXCAPS_AUXIN
  90.  
  91.  
  92. PTSTR gaszAuxCapsSupport[32] =
  93. {
  94.     TEXT("Volume"),         // Bit 0    AUXCAPS_VOLUME
  95.     TEXT("L/R Volume"),     // Bit 1    AUXCAPS_LRVOLUME
  96.     NULL,                   // Bit 2
  97.     NULL,                   // Bit 3
  98.     NULL,                   // Bit 4
  99.     NULL,                   // Bit 5
  100.     NULL,                   // Bit 6
  101.     NULL,                   // Bit 7
  102.     NULL,                   // Bit 8
  103.     NULL,                   // Bit 9
  104.     NULL,                   // Bit 10
  105.     NULL,                   // Bit 11
  106.     NULL,                   // Bit 12
  107.     NULL,                   // Bit 13
  108.     NULL,                   // Bit 14
  109.     NULL,                   // Bit 15
  110.     NULL,                   // Bit 16
  111.     NULL,                   // Bit 17
  112.     NULL,                   // Bit 18
  113.     NULL,                   // Bit 19
  114.     NULL,                   // Bit 20
  115.     NULL,                   // Bit 21
  116.     NULL,                   // Bit 22
  117.     NULL,                   // Bit 23
  118.     NULL,                   // Bit 24
  119.     NULL,                   // Bit 25
  120.     NULL,                   // Bit 26
  121.     NULL,                   // Bit 27
  122.     NULL,                   // Bit 28
  123.     NULL,                   // Bit 29
  124.     NULL,                   // Bit 30
  125.     NULL                    // Bit 31
  126. };
  127.  
  128.  
  129.  
  130. //
  131. //  MIDI[IN|OUT]CAPS
  132. //
  133. //
  134. //
  135. PTSTR gaszMidiOutCapsTechnology[] =
  136. {
  137.     gszNotSpecified,
  138.     TEXT("MIDI Port"),                  // MOD_MIDIPORT
  139.     TEXT("Internal Synth"),             // MOD_SYNTH   
  140.     TEXT("Internal Square Wave Synth"), // MOD_SQSYNTH 
  141.     TEXT("Internal FM Synth"),          // MOD_FMSYNTH 
  142.     TEXT("MIDI Mapper")                 // MOD_MAPPER  
  143. };
  144.  
  145. #define MIDIOUTCAPS_TECHNOLOGY_LAST     MOD_MAPPER
  146.  
  147.  
  148. PTSTR gaszMidiOutCapsSupport[32] =
  149. {
  150.     TEXT("Volume"),         // Bit 0    MIDICAPS_VOLUME
  151.     TEXT("L/R Volume"),     // Bit 1    MIDICAPS_LRVOLUME
  152.     TEXT("Patch Caching"),  // Bit 2    MIDICAPS_CACHE
  153.     TEXT("Poly Message"),   // Bit 3    MIDICAPS_POLYMSG (Win 4)
  154.     NULL,                   // Bit 4
  155.     NULL,                   // Bit 5
  156.     NULL,                   // Bit 6
  157.     NULL,                   // Bit 7
  158.     NULL,                   // Bit 8
  159.     NULL,                   // Bit 9
  160.     NULL,                   // Bit 10
  161.     NULL,                   // Bit 11
  162.     NULL,                   // Bit 12
  163.     NULL,                   // Bit 13
  164.     NULL,                   // Bit 14
  165.     NULL,                   // Bit 15
  166.     NULL,                   // Bit 16
  167.     NULL,                   // Bit 17
  168.     NULL,                   // Bit 18
  169.     NULL,                   // Bit 19
  170.     NULL,                   // Bit 20
  171.     NULL,                   // Bit 21
  172.     NULL,                   // Bit 22
  173.     NULL,                   // Bit 23
  174.     NULL,                   // Bit 24
  175.     NULL,                   // Bit 25
  176.     NULL,                   // Bit 26
  177.     NULL,                   // Bit 27
  178.     NULL,                   // Bit 28
  179.     NULL,                   // Bit 29
  180.     NULL,                   // Bit 30
  181.     NULL                    // Bit 31
  182. };
  183.  
  184.  
  185.  
  186.  
  187. //
  188. //  MIXERCAPS
  189. //
  190. //
  191. //
  192. PTSTR gaszMixerCapsSupport[32] =
  193. {
  194.     NULL,                   // Bit 0
  195.     NULL,                   // Bit 1
  196.     NULL,                   // Bit 2
  197.     NULL,                   // Bit 3
  198.     NULL,                   // Bit 4
  199.     NULL,                   // Bit 5
  200.     NULL,                   // Bit 6
  201.     NULL,                   // Bit 7
  202.     NULL,                   // Bit 8
  203.     NULL,                   // Bit 9
  204.     NULL,                   // Bit 10
  205.     NULL,                   // Bit 11
  206.     NULL,                   // Bit 12
  207.     NULL,                   // Bit 13
  208.     NULL,                   // Bit 14
  209.     NULL,                   // Bit 15
  210.     NULL,                   // Bit 16
  211.     NULL,                   // Bit 17
  212.     NULL,                   // Bit 18
  213.     NULL,                   // Bit 19
  214.     NULL,                   // Bit 20
  215.     NULL,                   // Bit 21
  216.     NULL,                   // Bit 22
  217.     NULL,                   // Bit 23
  218.     NULL,                   // Bit 24
  219.     NULL,                   // Bit 25
  220.     NULL,                   // Bit 26
  221.     NULL,                   // Bit 27
  222.     NULL,                   // Bit 28
  223.     NULL,                   // Bit 29
  224.     NULL,                   // Bit 30
  225.     NULL                    // Bit 31
  226. };
  227.  
  228.  
  229.  
  230.  
  231.  
  232. //
  233. //  WAVE[IN|OUT]CAPS
  234. //
  235. //
  236. //
  237. PTSTR gaszWaveInOutCapsFormats[32] =
  238. {
  239.     TEXT("8M11"),           // Bit 0    WAVE_FORMAT_1M08
  240.     TEXT("8S11"),           // Bit 1    WAVE_FORMAT_1S08
  241.     TEXT("16M11"),          // Bit 2    WAVE_FORMAT_1M16
  242.     TEXT("16S11"),          // Bit 3    WAVE_FORMAT_1S16
  243.     TEXT("8M22"),           // Bit 4    WAVE_FORMAT_2M08
  244.     TEXT("8S22"),           // Bit 5    WAVE_FORMAT_2S08
  245.     TEXT("16M22"),          // Bit 6    WAVE_FORMAT_2M16
  246.     TEXT("16S22"),          // Bit 7    WAVE_FORMAT_2S16
  247.     TEXT("8M44"),           // Bit 8    WAVE_FORMAT_4M08
  248.     TEXT("8S44"),           // Bit 9    WAVE_FORMAT_4S08
  249.     TEXT("16M44"),          // Bit 10   WAVE_FORMAT_4M16
  250.     TEXT("16S44"),          // Bit 11   WAVE_FORMAT_4S16
  251.     NULL,                   // Bit 12
  252.     NULL,                   // Bit 13
  253.     NULL,                   // Bit 14
  254.     NULL,                   // Bit 15
  255.     NULL,                   // Bit 16
  256.     NULL,                   // Bit 17
  257.     NULL,                   // Bit 18
  258.     NULL,                   // Bit 19
  259.     NULL,                   // Bit 20
  260.     NULL,                   // Bit 21
  261.     NULL,                   // Bit 22
  262.     NULL,                   // Bit 23
  263.     NULL,                   // Bit 24
  264.     NULL,                   // Bit 25
  265.     NULL,                   // Bit 26
  266.     NULL,                   // Bit 27
  267.     NULL,                   // Bit 28
  268.     NULL,                   // Bit 29
  269.     NULL,                   // Bit 30
  270.     NULL                    // Bit 31
  271. };
  272.  
  273. PTSTR gaszWaveOutCapsSupport[32] =
  274. {
  275.     TEXT("Pitch"),          // Bit 0    WAVECAPS_PITCH
  276.     TEXT("Playback Rate"),  // Bit 1    WAVECAPS_PLAYBACKRATE
  277.     TEXT("Volume"),         // Bit 2    WAVECAPS_VOLUME
  278.     TEXT("L/R Volume"),     // Bit 3    WAVECAPS_LRVOLUME
  279.     TEXT("Sync"),           // Bit 4    WAVECAPS_SYNC
  280.     NULL,                   // Bit 5
  281.     NULL,                   // Bit 6
  282.     NULL,                   // Bit 7
  283.     NULL,                   // Bit 8
  284.     NULL,                   // Bit 9
  285.     NULL,                   // Bit 10
  286.     NULL,                   // Bit 11
  287.     NULL,                   // Bit 12
  288.     NULL,                   // Bit 13
  289.     NULL,                   // Bit 14
  290.     NULL,                   // Bit 15
  291.     NULL,                   // Bit 16
  292.     NULL,                   // Bit 17
  293.     NULL,                   // Bit 18
  294.     NULL,                   // Bit 19
  295.     NULL,                   // Bit 20
  296.     NULL,                   // Bit 21
  297.     NULL,                   // Bit 22
  298.     NULL,                   // Bit 23
  299.     NULL,                   // Bit 24
  300.     NULL,                   // Bit 25
  301.     NULL,                   // Bit 26
  302.     NULL,                   // Bit 27
  303.     NULL,                   // Bit 28
  304.     NULL,                   // Bit 29
  305.     NULL,                   // Bit 30
  306.     NULL                    // Bit 31
  307. };
  308.  
  309.  
  310. //==========================================================================;
  311. //
  312. //
  313. //
  314. //
  315. //==========================================================================;
  316.  
  317. //--------------------------------------------------------------------------;
  318. //  
  319. //  BOOL MMCapsDetailAuxiliary
  320. //  
  321. //  Description:
  322. //  
  323. //  
  324. //  Arguments:
  325. //      HWND hedit:
  326. //  
  327. //      int nDevId:
  328. //  
  329. //  Return (BOOL):
  330. //  
  331. //  History:
  332. //      05/11/93
  333. //  
  334. //--------------------------------------------------------------------------;
  335.  
  336. BOOL FNLOCAL MMCapsDetailAuxiliary
  337. (
  338.     HWND            hedit,
  339.     int             nDevId
  340. )
  341. {
  342.     TCHAR           ach[MMCAPS_MAX_STRING_MIDPID_CHARS];
  343.     PSTR            psz;
  344.     MMRESULT        mmr;
  345.     AUXCAPS         ac;
  346.     UINT            u;
  347.     DWORD           dw;
  348.  
  349.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  350.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_AUXILIARY]);
  351.  
  352.     if (-1 == nDevId)
  353.     AppMEditPrintF(hedit, "       Index (Id): %d (Mapper)\r\n", nDevId);
  354.     else
  355.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  356.  
  357.  
  358.     //
  359.     //
  360.     //
  361.     mmr = auxGetDevCaps(nDevId, &ac, sizeof(ac));
  362.     if (MMSYSERR_NOERROR != mmr)
  363.     {
  364.     _fmemset(&ac, 0, sizeof(ac));
  365.     if (-1 != nDevId)
  366.     {
  367.         lstrcpy(ac.szPname, gszBogusCaps);
  368.     }
  369.     else
  370.     {
  371.         if (0 != auxGetNumDevs())
  372.         {
  373.         ac.wMid           = MM_MICROSOFT;
  374.         ac.vDriverVersion = (MMVERSION)GetVersion();
  375.         lstrcpy(ac.szPname, gszDefaultMapper);
  376.         mmr = MMSYSERR_NOERROR;
  377.         }
  378.     }
  379.     }
  380.  
  381.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)ac.szPname);
  382.  
  383.     if (MMSYSERR_NOERROR != mmr)
  384.     return (TRUE);
  385.  
  386.     //
  387.     //
  388.     //
  389.     //
  390.     MMCapsMidAndPid(ac.wMid, ach, 0, NULL);
  391.     AppMEditPrintF(hedit, "  Manufacturer Id: %s\r\n", (LPSTR)ach);
  392.  
  393.     MMCapsMidAndPid(ac.wMid, NULL, ac.wPid, ach);
  394.     AppMEditPrintF(hedit, "       Product Id: %s\r\n", (LPSTR)ach);
  395.  
  396.     AppMEditPrintF(hedit, "   Driver Version: %u.%.02u\r\n",
  397.          (ac.vDriverVersion >> 8), (BYTE)ac.vDriverVersion);
  398.  
  399.  
  400.     if (ac.wTechnology > AUXCAPS_TECHNOLOGY_LAST)
  401.     {
  402.     wsprintf(ach, "[%u], Unknown", ac.wTechnology);
  403.     psz = ach;
  404.     }
  405.     else
  406.     {
  407.     psz = gaszAuxCapsTechnology[ac.wTechnology];
  408.     }
  409.  
  410.     AppMEditPrintF(hedit, "       Technology: %s\r\n", (LPSTR)psz);
  411.  
  412.     //
  413.     //
  414.     //
  415.     //
  416.     AppMEditPrintF(hedit, " Standard Support: [%.08lXh]", ac.dwSupport);
  417.     for (u = 0, dw = ac.dwSupport; dw; u++)
  418.     {
  419.     if ((BYTE)dw & (BYTE)1)
  420.     {
  421.         psz = gaszAuxCapsSupport[u];
  422.         if (NULL == psz)
  423.         {
  424.         wsprintf(ach, "Unknown%u", u);
  425.         psz = ach;
  426.         }
  427.  
  428.         AppMEditPrintF(hedit, ", %s", (LPSTR)psz);
  429.     }
  430.  
  431.     dw >>= 1;
  432.     }
  433.     AppMEditPrintF(hedit, "\r\n");
  434.  
  435.     return (TRUE);
  436. } // MMCapsDetailAuxiliary()
  437.  
  438.  
  439. //--------------------------------------------------------------------------;
  440. //  
  441. //  BOOL MMCapsDetailJoystick
  442. //  
  443. //  Description:
  444. //  
  445. //  
  446. //  Arguments:
  447. //      HWND hedit:
  448. //  
  449. //      int nDevId:
  450. //  
  451. //  Return (BOOL):
  452. //  
  453. //  History:
  454. //      05/11/93
  455. //  
  456. //--------------------------------------------------------------------------;
  457.  
  458. BOOL FNLOCAL MMCapsDetailJoystick
  459. (
  460.     HWND            hedit,
  461.     int             nDevId
  462. )
  463. {
  464.     TCHAR           ach[MMCAPS_MAX_STRING_MIDPID_CHARS];
  465.     MMRESULT        mmr;
  466.     JOYCAPS         jc;
  467.  
  468.  
  469.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  470.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_JOYSTICK]);
  471.  
  472.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  473.  
  474.  
  475.     //
  476.     //
  477.     //
  478.     mmr = joyGetDevCaps(nDevId, &jc, sizeof(jc));
  479.     if (MMSYSERR_NOERROR != mmr)
  480.     {
  481.     lstrcpy(jc.szPname, gszBogusCaps);
  482.     }
  483.  
  484.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)jc.szPname);
  485.  
  486.     if (MMSYSERR_NOERROR != mmr)
  487.     return (TRUE);
  488.  
  489.     //
  490.     //
  491.     //
  492.     //
  493.     MMCapsMidAndPid(jc.wMid, ach, 0, NULL);
  494.     AppMEditPrintF(hedit, "  Manufacturer Id: %s\r\n", (LPSTR)ach);
  495.  
  496.     MMCapsMidAndPid(jc.wMid, NULL, jc.wPid, ach);
  497.     AppMEditPrintF(hedit, "       Product Id: %s\r\n", (LPSTR)ach);
  498.  
  499.     AppMEditPrintF(hedit, "   Driver Version: (sigh)\r\n");
  500.  
  501.     AppMEditPrintF(hedit, "          Buttons: %u\r\n", jc.wNumButtons);
  502.     AppMEditPrintF(hedit, "    Minimum X Pos: %u\r\n", jc.wXmin);
  503.     AppMEditPrintF(hedit, "    Maximum X Pos: %u\r\n", jc.wXmax);
  504.     AppMEditPrintF(hedit, "    Minimum Y Pos: %u\r\n", jc.wYmin);
  505.     AppMEditPrintF(hedit, "    Maximum Y Pos: %u\r\n", jc.wYmax);
  506.     AppMEditPrintF(hedit, "    Minimum Z Pos: %u\r\n", jc.wZmin);
  507.     AppMEditPrintF(hedit, "    Maximum Z Pos: %u\r\n", jc.wZmax);
  508.     AppMEditPrintF(hedit, "   Minimum Period: %u\r\n", jc.wPeriodMin);
  509.     AppMEditPrintF(hedit, "   Maximum Period: %u\r\n", jc.wPeriodMax);
  510.  
  511.  
  512.     return (TRUE);
  513. } // MMCapsDetailJoystick()
  514.  
  515.  
  516. //--------------------------------------------------------------------------;
  517. //  
  518. //  BOOL MMCapsDetailMidiIn
  519. //  
  520. //  Description:
  521. //  
  522. //  
  523. //  Arguments:
  524. //      HWND hedit:
  525. //  
  526. //      int nDevId:
  527. //  
  528. //  Return (BOOL):
  529. //  
  530. //  History:
  531. //      05/11/93
  532. //  
  533. //--------------------------------------------------------------------------;
  534.  
  535. BOOL FNLOCAL MMCapsDetailMidiIn
  536. (
  537.     HWND            hedit,
  538.     int             nDevId
  539. )
  540. {
  541.     TCHAR           ach[MMCAPS_MAX_STRING_MIDPID_CHARS];
  542.     MMRESULT        mmr;
  543.     MIDIINCAPS      mic;
  544.  
  545.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  546.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_MIDIIN]);
  547.  
  548.     if (-1 == nDevId)
  549.     AppMEditPrintF(hedit, "       Index (Id): %d (Mapper)\r\n", nDevId);
  550.     else
  551.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  552.  
  553.  
  554.     //
  555.     //
  556.     //
  557.     mmr = midiInGetDevCaps(nDevId, &mic, sizeof(mic));
  558.     if (MMSYSERR_NOERROR != mmr)
  559.     {
  560.     _fmemset(&mic, 0, sizeof(mic));
  561.     if (-1 != nDevId)
  562.     {
  563.         lstrcpy(mic.szPname, gszBogusCaps);
  564.     }
  565.     else
  566.     {
  567.         if (0 != midiInGetNumDevs())
  568.         {
  569.         mic.wMid           = MM_MICROSOFT;
  570.         mic.vDriverVersion = (MMVERSION)GetVersion();
  571.         lstrcpy(mic.szPname, gszDefaultMapper);
  572.         mmr = MMSYSERR_NOERROR;
  573.         }
  574.     }
  575.     }
  576.  
  577.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)mic.szPname);
  578.  
  579.     if (MMSYSERR_NOERROR != mmr)
  580.     return (TRUE);
  581.  
  582.     //
  583.     //
  584.     //
  585.     //
  586.     MMCapsMidAndPid(mic.wMid, ach, 0, NULL);
  587.     AppMEditPrintF(hedit, "  Manufacturer Id: %s\r\n", (LPSTR)ach);
  588.  
  589.     MMCapsMidAndPid(mic.wMid, NULL, mic.wPid, ach);
  590.     AppMEditPrintF(hedit, "       Product Id: %s\r\n", (LPSTR)ach);
  591.  
  592.     AppMEditPrintF(hedit, "   Driver Version: %u.%.02u\r\n",
  593.          (mic.vDriverVersion >> 8), (BYTE)mic.vDriverVersion);
  594.  
  595.     return (TRUE);
  596. } // MMCapsDetailMidiIn()
  597.  
  598.  
  599. //--------------------------------------------------------------------------;
  600. //  
  601. //  BOOL MMCapsDetailMidiOut
  602. //  
  603. //  Description:
  604. //  
  605. //  
  606. //  Arguments:
  607. //      HWND hedit:
  608. //  
  609. //      int nDevId:
  610. //  
  611. //  Return (BOOL):
  612. //  
  613. //  History:
  614. //      05/11/93
  615. //  
  616. //--------------------------------------------------------------------------;
  617.  
  618. BOOL FNLOCAL MMCapsDetailMidiOut
  619. (
  620.     HWND            hedit,
  621.     int             nDevId
  622. )
  623. {
  624.     TCHAR           ach[MMCAPS_MAX_STRING_MIDPID_CHARS];
  625.     PSTR            psz;
  626.     MMRESULT        mmr;
  627.     MIDIOUTCAPS     moc;
  628.     UINT            u;
  629.     DWORD           dw;
  630.  
  631.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  632.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_MIDIOUT]);
  633.  
  634.     if (-1 == nDevId)
  635.     AppMEditPrintF(hedit, "       Index (Id): %d (Mapper)\r\n", nDevId);
  636.     else
  637.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  638.  
  639.  
  640.     //
  641.     //
  642.     //
  643.     mmr = midiOutGetDevCaps(nDevId, &moc, sizeof(moc));
  644.     if (MMSYSERR_NOERROR != mmr)
  645.     {
  646.     _fmemset(&moc, 0, sizeof(moc));
  647.     if (-1 != nDevId)
  648.     {
  649.         lstrcpy(moc.szPname, gszBogusCaps);
  650.     }
  651.     else
  652.     {
  653.         if (0 != midiOutGetNumDevs())
  654.         {
  655.         moc.wMid           = MM_MICROSOFT;
  656.         moc.vDriverVersion = (MMVERSION)GetVersion();
  657.         lstrcpy(moc.szPname, gszDefaultMapper);
  658.         mmr = MMSYSERR_NOERROR;
  659.         }
  660.     }
  661.     }
  662.  
  663.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)moc.szPname);
  664.  
  665.     if (MMSYSERR_NOERROR != mmr)
  666.     return (TRUE);
  667.  
  668.     //
  669.     //
  670.     //
  671.     //
  672.     MMCapsMidAndPid(moc.wMid, ach, 0, NULL);
  673.     AppMEditPrintF(hedit, "  Manufacturer Id: %s\r\n", (LPSTR)ach);
  674.  
  675.     MMCapsMidAndPid(moc.wMid, NULL, moc.wPid, ach);
  676.     AppMEditPrintF(hedit, "       Product Id: %s\r\n", (LPSTR)ach);
  677.  
  678.     AppMEditPrintF(hedit, "   Driver Version: %u.%.02u\r\n",
  679.          (moc.vDriverVersion >> 8), (BYTE)moc.vDriverVersion);
  680.  
  681.  
  682.     if (moc.wTechnology > MIDIOUTCAPS_TECHNOLOGY_LAST)
  683.     {
  684.     wsprintf(ach, "[%u], Unknown", moc.wTechnology);
  685.     psz = ach;
  686.     }
  687.     else
  688.     {
  689.     psz = gaszMidiOutCapsTechnology[moc.wTechnology];
  690.     }
  691.  
  692.     AppMEditPrintF(hedit, "       Technology: %s\r\n", (LPSTR)psz);
  693.     AppMEditPrintF(hedit, " Voices (Patches): %u (if internal synth)\r\n", moc.wVoices);
  694.     AppMEditPrintF(hedit, "        Polyphony: %u (if internal synth)\r\n", moc.wNotes);
  695.     AppMEditPrintF(hedit, "     Channel Mask: %.04Xh (if internal synth)\r\n", moc.wChannelMask);
  696.  
  697.     //
  698.     //
  699.     //
  700.     //
  701.     AppMEditPrintF(hedit, " Standard Support: [%.08lXh]", moc.dwSupport);
  702.     for (u = 0, dw = moc.dwSupport; dw; u++)
  703.     {
  704.     if ((BYTE)dw & (BYTE)1)
  705.     {
  706.         psz = gaszMidiOutCapsSupport[u];
  707.         if (NULL == psz)
  708.         {
  709.         wsprintf(ach, "Unknown%u", u);
  710.         psz = ach;
  711.         }
  712.  
  713.         AppMEditPrintF(hedit, ", %s", (LPSTR)psz);
  714.     }
  715.  
  716.     dw >>= 1;
  717.     }
  718.     AppMEditPrintF(hedit, "\r\n");
  719.  
  720.     return (TRUE);
  721. } // MMCapsDetailMidiOut()
  722.  
  723.  
  724. //--------------------------------------------------------------------------;
  725. //  
  726. //  BOOL MMCapsDetailMixer
  727. //  
  728. //  Description:
  729. //  
  730. //  
  731. //  Arguments:
  732. //      HWND hedit:
  733. //  
  734. //      int nDevId:
  735. //  
  736. //  Return (BOOL):
  737. //  
  738. //  History:
  739. //      05/11/93
  740. //  
  741. //--------------------------------------------------------------------------;
  742.  
  743. BOOL FNLOCAL MMCapsDetailMixer
  744. (
  745.     HWND            hedit,
  746.     int             nDevId
  747. )
  748. {
  749.     TCHAR           ach[MMCAPS_MAX_STRING_MIDPID_CHARS];
  750.     PSTR            psz;
  751.     MMRESULT        mmr;
  752.     MIXERCAPS       mxc;
  753.     UINT            u;
  754.     DWORD           dw;
  755.  
  756.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  757.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_MIXER]);
  758.  
  759. #ifdef MIXER_MAPPER
  760.     if (-1 == nDevId)
  761.     AppMEditPrintF(hedit, "       Index (Id): %d (Mapper)\r\n", nDevId);
  762.     else
  763.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  764. #else
  765.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  766. #endif
  767.  
  768.  
  769.     //
  770.     //
  771.     //
  772.     mmr = mixerGetDevCaps(nDevId, &mxc, sizeof(mxc));
  773.     if (MMSYSERR_NOERROR != mmr)
  774.     {
  775.     _fmemset(&mxc, 0, sizeof(mxc));
  776.     if (-1 != nDevId)
  777.     {
  778.         lstrcpy(mxc.szPname, gszBogusCaps);
  779.     }
  780.     else
  781.     {
  782.         if (0 != mixerGetNumDevs())
  783.         {
  784.         mxc.wMid           = MM_MICROSOFT;
  785.         mxc.vDriverVersion = (MMVERSION)GetVersion();
  786.         lstrcpy(mxc.szPname, gszDefaultMapper);
  787.         mmr = MMSYSERR_NOERROR;
  788.         }
  789.     }
  790.     }
  791.  
  792.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)mxc.szPname);
  793.  
  794.     if (MMSYSERR_NOERROR != mmr)
  795.     return (TRUE);
  796.  
  797.     //
  798.     //
  799.     //
  800.     //
  801.     MMCapsMidAndPid(mxc.wMid, ach, 0, NULL);
  802.     AppMEditPrintF(hedit, "  Manufacturer Id: %s\r\n", (LPSTR)ach);
  803.  
  804.     MMCapsMidAndPid(mxc.wMid, NULL, mxc.wPid, ach);
  805.     AppMEditPrintF(hedit, "       Product Id: %s\r\n", (LPSTR)ach);
  806.  
  807.     AppMEditPrintF(hedit, "   Driver Version: %u.%.02u\r\n",
  808.          (mxc.vDriverVersion >> 8), (BYTE)mxc.vDriverVersion);
  809.  
  810.     AppMEditPrintF(hedit, "     Destinations: %u\r\n", mxc.cDestinations);
  811.  
  812.     //
  813.     //
  814.     //
  815.     //
  816.     AppMEditPrintF(hedit, " Standard Support: [%.08lXh]", mxc.fdwSupport);
  817.     for (u = 0, dw = mxc.fdwSupport; dw; u++)
  818.     {
  819.     if ((BYTE)dw & (BYTE)1)
  820.     {
  821.         psz = gaszMixerCapsSupport[u];
  822.         if (NULL == psz)
  823.         {
  824.         wsprintf(ach, "Unknown%u", u);
  825.         psz = ach;
  826.         }
  827.  
  828.         AppMEditPrintF(hedit, ", %s", (LPSTR)psz);
  829.     }
  830.  
  831.     dw >>= 1;
  832.     }
  833.     AppMEditPrintF(hedit, "\r\n");
  834.  
  835.     return (TRUE);
  836. } // MMCapsDetailMixer()
  837.  
  838.  
  839. //--------------------------------------------------------------------------;
  840. //  
  841. //  BOOL MMCapsDetailTimer
  842. //  
  843. //  Description:
  844. //  
  845. //  
  846. //  Arguments:
  847. //      HWND hedit:
  848. //  
  849. //      int nDevId:
  850. //  
  851. //  Return (BOOL):
  852. //  
  853. //  History:
  854. //      05/11/93
  855. //  
  856. //--------------------------------------------------------------------------;
  857.  
  858. BOOL FNLOCAL MMCapsDetailTimer
  859. (
  860.     HWND            hedit,
  861.     int             nDevId
  862. )
  863. {
  864.     MMRESULT        mmr;
  865.     TIMECAPS        tc;
  866.     MMVERSION       uMMSysVer;
  867.  
  868.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  869.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_TIMER]);
  870.  
  871.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  872.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)gszTimerDevice);
  873.  
  874.     mmr = timeGetDevCaps(&tc, sizeof(tc));
  875.     if (MMSYSERR_NOERROR != mmr)
  876.     return (TRUE);
  877.  
  878.     //
  879.     //
  880.     //
  881.     //
  882.     uMMSysVer = (MMVERSION)GetVersion();
  883.     AppMEditPrintF(hedit, "   Driver Version: %u.%.02u\r\n",
  884.          (uMMSysVer >> 8), (BYTE)uMMSysVer);
  885.  
  886.     AppMEditPrintF(hedit, "   Minimum Period: %u\r\n", tc.wPeriodMin);
  887.     AppMEditPrintF(hedit, "   Maximum Period: %u\r\n", tc.wPeriodMax);
  888.  
  889.     return (TRUE);
  890. } // MMCapsDetailTimer()
  891.  
  892.  
  893. //--------------------------------------------------------------------------;
  894. //  
  895. //  BOOL MMCapsDetailWaveIn
  896. //  
  897. //  Description:
  898. //  
  899. //  
  900. //  Arguments:
  901. //      HWND hedit:
  902. //  
  903. //      int nDevId:
  904. //  
  905. //  Return (BOOL):
  906. //  
  907. //  History:
  908. //      05/11/93
  909. //  
  910. //--------------------------------------------------------------------------;
  911.  
  912. BOOL FNLOCAL MMCapsDetailWaveIn
  913. (
  914.     HWND            hedit,
  915.     int             nDevId
  916. )
  917. {
  918.     TCHAR           ach[MMCAPS_MAX_STRING_MIDPID_CHARS];
  919.     PSTR            psz;
  920.     MMRESULT        mmr;
  921.     WAVEINCAPS      wic;
  922.     UINT            u;
  923.     DWORD           dw;
  924.  
  925.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  926.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_WAVEIN]);
  927.  
  928.     if (-1 == nDevId)
  929.     AppMEditPrintF(hedit, "       Index (Id): %d (Mapper)\r\n", nDevId);
  930.     else
  931.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  932.  
  933.  
  934.     //
  935.     //
  936.     //
  937.     mmr = waveInGetDevCaps(nDevId, &wic, sizeof(wic));
  938.     if (MMSYSERR_NOERROR != mmr)
  939.     {
  940.     _fmemset(&wic, 0, sizeof(wic));
  941.     if (-1 != nDevId)
  942.     {
  943.         lstrcpy(wic.szPname, gszBogusCaps);
  944.     }
  945.     else
  946.     {
  947.         if (0 != waveInGetNumDevs())
  948.         {
  949.         wic.wMid           = MM_MICROSOFT;
  950.         wic.vDriverVersion = (MMVERSION)GetVersion();
  951.         lstrcpy(wic.szPname, gszDefaultMapper);
  952.         mmr = MMSYSERR_NOERROR;
  953.         }
  954.     }
  955.     }
  956.  
  957.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)wic.szPname);
  958.  
  959.     if (MMSYSERR_NOERROR != mmr)
  960.     return (TRUE);
  961.  
  962.     //
  963.     //
  964.     //
  965.     //
  966.     MMCapsMidAndPid(wic.wMid, ach, 0, NULL);
  967.     AppMEditPrintF(hedit, "  Manufacturer Id: %s\r\n", (LPSTR)ach);
  968.  
  969.     MMCapsMidAndPid(wic.wMid, NULL, wic.wPid, ach);
  970.     AppMEditPrintF(hedit, "       Product Id: %s\r\n", (LPSTR)ach);
  971.  
  972.     AppMEditPrintF(hedit, "   Driver Version: %u.%.02u\r\n",
  973.          (wic.vDriverVersion >> 8), (BYTE)wic.vDriverVersion);
  974.  
  975.     AppMEditPrintF(hedit, "         Channels: %u\r\n", wic.wChannels);
  976.  
  977.     //
  978.     //
  979.     //
  980.     //
  981.     AppMEditPrintF(hedit, " Standard Formats: [%.08lXh]", wic.dwFormats);
  982.     for (u = 0, dw = wic.dwFormats; dw; u++)
  983.     {
  984.     if ((BYTE)dw & (BYTE)1)
  985.     {
  986.         psz = gaszWaveInOutCapsFormats[u];
  987.         if (NULL == psz)
  988.         {
  989.         wsprintf(ach, "Unknown%u", u);
  990.         psz = ach;
  991.         }
  992.  
  993.         AppMEditPrintF(hedit, ", %s", (LPSTR)psz);
  994.     }
  995.  
  996.     dw >>= 1;
  997.     }
  998.     AppMEditPrintF(hedit, "\r\n");
  999.  
  1000.  
  1001.     return (TRUE);
  1002. } // MMCapsDetailWaveIn()
  1003.  
  1004.  
  1005. //--------------------------------------------------------------------------;
  1006. //  
  1007. //  BOOL MMCapsDetailWaveOut
  1008. //  
  1009. //  Description:
  1010. //  
  1011. //  
  1012. //  Arguments:
  1013. //      HWND hedit:
  1014. //  
  1015. //      int nDevId:
  1016. //  
  1017. //  Return (BOOL):
  1018. //  
  1019. //  History:
  1020. //      05/11/93
  1021. //  
  1022. //--------------------------------------------------------------------------;
  1023.  
  1024. BOOL FNLOCAL MMCapsDetailWaveOut
  1025. (
  1026.     HWND            hedit,
  1027.     int             nDevId
  1028. )
  1029. {
  1030.     TCHAR           ach[MMCAPS_MAX_STRING_MIDPID_CHARS];
  1031.     PSTR            psz;
  1032.     MMRESULT        mmr;
  1033.     WAVEOUTCAPS     woc;
  1034.     UINT            u;
  1035.     DWORD           dw;
  1036.  
  1037.     AppMEditPrintF(hedit, "      Device Type: %s\r\n",
  1038.          (LPSTR)gaszDeviceType[MMCAPS_DEVTYPE_WAVEOUT]);
  1039.  
  1040.     if (-1 == nDevId)
  1041.     AppMEditPrintF(hedit, "       Index (Id): %d (Mapper)\r\n", nDevId);
  1042.     else
  1043.     AppMEditPrintF(hedit, "       Index (Id): %d\r\n", nDevId);
  1044.  
  1045.  
  1046.     //
  1047.     //
  1048.     //
  1049.     mmr = waveOutGetDevCaps(nDevId, &woc, sizeof(woc));
  1050.     if (MMSYSERR_NOERROR != mmr)
  1051.     {
  1052.     _fmemset(&woc, 0, sizeof(woc));
  1053.     if (-1 != nDevId)
  1054.     {
  1055.         lstrcpy(woc.szPname, gszBogusCaps);
  1056.     }
  1057.     else
  1058.     {
  1059.         if (0 != waveOutGetNumDevs())
  1060.         {
  1061.         woc.wMid           = MM_MICROSOFT;
  1062.         woc.vDriverVersion = (MMVERSION)GetVersion();
  1063.         lstrcpy(woc.szPname, gszDefaultMapper);
  1064.         mmr = MMSYSERR_NOERROR;
  1065.         }
  1066.     }
  1067.     }
  1068.  
  1069.     AppMEditPrintF(hedit, "     Product Name: %s\r\n", (LPSTR)woc.szPname);
  1070.  
  1071.     if (MMSYSERR_NOERROR != mmr)
  1072.     return (TRUE);
  1073.  
  1074.     //
  1075.     //
  1076.     //
  1077.     //
  1078.     MMCapsMidAndPid(woc.wMid, ach, 0, NULL);
  1079.     AppMEditPrintF(hedit, "  Manufacturer Id: %s\r\n", (LPSTR)ach);
  1080.  
  1081.     MMCapsMidAndPid(woc.wMid, NULL, woc.wPid, ach);
  1082.     AppMEditPrintF(hedit, "       Product Id: %s\r\n", (LPSTR)ach);
  1083.  
  1084.     AppMEditPrintF(hedit, "   Driver Version: %u.%.02u\r\n",
  1085.          (woc.vDriverVersion >> 8), (BYTE)woc.vDriverVersion);
  1086.  
  1087.     AppMEditPrintF(hedit, "         Channels: %u\r\n", woc.wChannels);
  1088.  
  1089.     //
  1090.     //
  1091.     //
  1092.     //
  1093.     AppMEditPrintF(hedit, " Standard Formats: [%.08lXh]", woc.dwFormats);
  1094.     for (u = 0, dw = woc.dwFormats; dw; u++)
  1095.     {
  1096.     if ((BYTE)dw & (BYTE)1)
  1097.     {
  1098.         psz = gaszWaveInOutCapsFormats[u];
  1099.         if (NULL == psz)
  1100.         {
  1101.         wsprintf(ach, "Unknown%u", u);
  1102.         psz = ach;
  1103.         }
  1104.  
  1105.         AppMEditPrintF(hedit, ", %s", (LPSTR)psz);
  1106.     }
  1107.  
  1108.     dw >>= 1;
  1109.     }
  1110.     AppMEditPrintF(hedit, "\r\n");
  1111.  
  1112.  
  1113.     //
  1114.     //
  1115.     //
  1116.     //
  1117.     AppMEditPrintF(hedit, " Standard Support: [%.08lXh]", woc.dwSupport);
  1118.     for (u = 0, dw = woc.dwSupport; dw; u++)
  1119.     {
  1120.     if ((BYTE)dw & (BYTE)1)
  1121.     {
  1122.         psz = gaszWaveOutCapsSupport[u];
  1123.         if (NULL == psz)
  1124.         {
  1125.         wsprintf(ach, "Unknown%u", u);
  1126.         psz = ach;
  1127.         }
  1128.  
  1129.         AppMEditPrintF(hedit, ", %s", (LPSTR)psz);
  1130.     }
  1131.  
  1132.     dw >>= 1;
  1133.     }
  1134.     AppMEditPrintF(hedit, "\r\n");
  1135.  
  1136.     return (TRUE);
  1137. } // MMCapsDetailWaveOut()
  1138.  
  1139.  
  1140. //==========================================================================;
  1141. //
  1142. //
  1143. //
  1144. //
  1145. //==========================================================================;
  1146.  
  1147. //--------------------------------------------------------------------------;
  1148. //  
  1149. //  BOOL MMCapsDetailLowLevel
  1150. //  
  1151. //  Description:
  1152. //  
  1153. //  
  1154. //  Arguments:
  1155. //      HWND hedit:
  1156. //
  1157. //      LPARAM lParam:
  1158. //  
  1159. //  Return (BOOL):
  1160. //  
  1161. //  History:
  1162. //      05/16/93
  1163. //  
  1164. //--------------------------------------------------------------------------;
  1165.  
  1166. BOOL FNGLOBAL MMCapsDetailLowLevel
  1167. (
  1168.     HWND            hedit,
  1169.     LPARAM          lParam
  1170. )
  1171. {
  1172.     int         nDevId;
  1173.     UINT        uDevType;
  1174.  
  1175.     //
  1176.     //  HIWORD(lParam): MMCAPS_DEVTYPE_*
  1177.     //  LOWORD(lParam): Device index (id)
  1178.     //
  1179.     nDevId   = (int)(short)LOWORD(lParam);
  1180.     uDevType = HIWORD(lParam);
  1181.  
  1182.     //
  1183.     //
  1184.     //
  1185.     //
  1186.     switch (uDevType)
  1187.     {
  1188.     case MMCAPS_DEVTYPE_AUXILIARY:
  1189.         MMCapsDetailAuxiliary(hedit, nDevId);
  1190.         break;
  1191.  
  1192.     case MMCAPS_DEVTYPE_JOYSTICK:
  1193.         MMCapsDetailJoystick(hedit, nDevId);
  1194.         break;
  1195.  
  1196.     case MMCAPS_DEVTYPE_MIDIIN:
  1197.         MMCapsDetailMidiIn(hedit, nDevId);
  1198.         break;
  1199.  
  1200.     case MMCAPS_DEVTYPE_MIDIOUT:
  1201.         MMCapsDetailMidiOut(hedit, nDevId);
  1202.         break;
  1203.  
  1204.     case MMCAPS_DEVTYPE_MIXER:
  1205.         MMCapsDetailMixer(hedit, nDevId);
  1206.         break;
  1207.  
  1208.     case MMCAPS_DEVTYPE_TIMER:
  1209.         MMCapsDetailTimer(hedit, nDevId);
  1210.         break;
  1211.  
  1212.     case MMCAPS_DEVTYPE_WAVEIN:
  1213.         MMCapsDetailWaveIn(hedit, nDevId);
  1214.         break;
  1215.  
  1216.     case MMCAPS_DEVTYPE_WAVEOUT:
  1217.         MMCapsDetailWaveOut(hedit, nDevId);
  1218.         break;
  1219.     }
  1220.  
  1221.  
  1222.     //
  1223.     //
  1224.     //
  1225.     return (TRUE);
  1226. } // MMCapsDetailLowLevel()
  1227.  
  1228.  
  1229. //--------------------------------------------------------------------------;
  1230. //  
  1231. //  BOOL MMCapsEnumerateLowLevel
  1232. //  
  1233. //  Description:
  1234. //  
  1235. //  
  1236. //  Arguments:
  1237. //      PZYZTABBEDLISTBOX ptlb:
  1238. //  
  1239. //      BOOL fComplete:
  1240. //  
  1241. //  Return (BOOL):
  1242. //  
  1243. //  History:
  1244. //      05/18/93
  1245. //  
  1246. //--------------------------------------------------------------------------;
  1247.  
  1248. BOOL FNGLOBAL MMCapsEnumerateLowLevel
  1249. (
  1250.     PZYZTABBEDLISTBOX   ptlb,
  1251.     BOOL                fComplete
  1252. )
  1253. {
  1254.     TCHAR       ach[128];
  1255.     MMRESULT    mmr;
  1256.     int         n;
  1257.     int         nDevs;
  1258.     int         nIndex;
  1259.     LPARAM      lParam;
  1260.     UINT        uDevType;
  1261.     MMVERSION   uMMSysVer;
  1262.     HWND        hlb;
  1263.  
  1264.  
  1265.     //
  1266.     //
  1267.     //
  1268.     //
  1269.     //
  1270.     if (fComplete)
  1271.     {
  1272.     TlbSetTitleAndTabs(ptlb, gszDeviceFormatTitle, FALSE);
  1273.     }
  1274.  
  1275.     hlb = ptlb->hlb;
  1276.  
  1277.     uMMSysVer = (MMVERSION)GetVersion();
  1278.  
  1279.  
  1280.     //
  1281.     //
  1282.     //
  1283.     nDevs = auxGetNumDevs();
  1284.     for (n = -1; n < nDevs; n++)
  1285.     {
  1286.     AUXCAPS         ac;
  1287.  
  1288.     mmr = auxGetDevCaps(n, &ac, sizeof(ac));
  1289.     if (MMSYSERR_NOERROR != mmr)
  1290.     {
  1291.         if (-1 != n)
  1292.         {
  1293.         ac.vDriverVersion = 0;
  1294.         lstrcpy(ac.szPname, gszBogusCaps);
  1295.         }
  1296.         else
  1297.         {
  1298.         if (0 == nDevs)
  1299.             break;
  1300.  
  1301.         ac.vDriverVersion = uMMSysVer;
  1302.         lstrcpy(ac.szPname, gszDefaultMapper);
  1303.         }
  1304.     }
  1305.  
  1306.     //
  1307.     //
  1308.     //
  1309.     uDevType = MMCAPS_DEVTYPE_AUXILIARY;
  1310.     wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1311.          n, (ac.vDriverVersion >> 8), (BYTE)ac.vDriverVersion,
  1312.          (LPSTR)ac.szPname);
  1313.  
  1314.     nIndex = ListBox_AddString(hlb, ach);
  1315.     lParam = MAKELPARAM((WORD)n, (WORD)uDevType);
  1316.     ListBox_SetItemData(hlb, nIndex, lParam);
  1317.     }
  1318.  
  1319.  
  1320.     //
  1321.     //
  1322.     //
  1323.     nDevs = joyGetNumDevs();
  1324.     for (n = 0; n < nDevs; n++)
  1325.     {
  1326.     JOYCAPS         jc;
  1327.  
  1328.     mmr = joyGetDevCaps(n, &jc, sizeof(jc));
  1329.     if (MMSYSERR_NOERROR != mmr)
  1330.     {
  1331.         lstrcpy(jc.szPname, gszBogusCaps);
  1332.     }
  1333.  
  1334.     //
  1335.     //
  1336.     //
  1337.     uDevType = MMCAPS_DEVTYPE_JOYSTICK;
  1338.     wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1339.          n, 0, 0, (LPSTR)jc.szPname);
  1340.  
  1341.     nIndex = ListBox_AddString(hlb, ach);
  1342.     lParam = MAKELPARAM((WORD)n, (WORD)uDevType);
  1343.     ListBox_SetItemData(hlb, nIndex, lParam);
  1344.     }
  1345.  
  1346.  
  1347.  
  1348.     //
  1349.     //
  1350.     //
  1351.     nDevs = midiInGetNumDevs();
  1352.     for (n = -1; n < nDevs; n++)
  1353.     {
  1354.     MIDIINCAPS      mic;
  1355.  
  1356.     mmr = midiInGetDevCaps(n, &mic, sizeof(mic));
  1357.     if (MMSYSERR_NOERROR != mmr)
  1358.     {
  1359.         if (-1 != n)
  1360.         {
  1361.         mic.vDriverVersion = 0;
  1362.         lstrcpy(mic.szPname, gszBogusCaps);
  1363.         }
  1364.         else
  1365.         {
  1366.         if (0 == nDevs)
  1367.             break;
  1368.  
  1369.         mic.vDriverVersion = uMMSysVer;
  1370.         lstrcpy(mic.szPname, gszDefaultMapper);
  1371.         }
  1372.     }
  1373.  
  1374.     //
  1375.     //
  1376.     //
  1377.     uDevType = MMCAPS_DEVTYPE_MIDIIN;
  1378.     wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1379.          n, (mic.vDriverVersion >> 8), (BYTE)mic.vDriverVersion,
  1380.          (LPSTR)mic.szPname);
  1381.  
  1382.     nIndex = ListBox_AddString(hlb, ach);
  1383.     lParam = MAKELPARAM((WORD)n, (WORD)uDevType);
  1384.     ListBox_SetItemData(hlb, nIndex, lParam);
  1385.     }
  1386.  
  1387.     //
  1388.     //
  1389.     //
  1390.     nDevs = midiOutGetNumDevs();
  1391.     for (n = -1; n < nDevs; n++)
  1392.     {
  1393.     MIDIOUTCAPS     moc;
  1394.  
  1395.     mmr = midiOutGetDevCaps(n, &moc, sizeof(moc));
  1396.     if (MMSYSERR_NOERROR != mmr)
  1397.     {
  1398.         if (-1 != n)
  1399.         {
  1400.         moc.vDriverVersion = 0;
  1401.         lstrcpy(moc.szPname, gszBogusCaps);
  1402.         }
  1403.         else
  1404.         {
  1405.         if (0 == nDevs)
  1406.             break;
  1407.  
  1408.         moc.vDriverVersion = uMMSysVer;
  1409.         lstrcpy(moc.szPname, gszDefaultMapper);
  1410.         }
  1411.     }
  1412.  
  1413.     //
  1414.     //
  1415.     //
  1416.     uDevType = MMCAPS_DEVTYPE_MIDIOUT;
  1417.     wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1418.          n, (moc.vDriverVersion >> 8), (BYTE)moc.vDriverVersion,
  1419.          (LPSTR)moc.szPname);
  1420.  
  1421.     nIndex = ListBox_AddString(hlb, ach);
  1422.     lParam = MAKELPARAM((WORD)n, (WORD)uDevType);
  1423.     ListBox_SetItemData(hlb, nIndex, lParam);
  1424.     }
  1425.  
  1426.  
  1427.     //
  1428.     //
  1429.     //
  1430.     //
  1431.     //
  1432. #ifndef WIN32
  1433.     nDevs = mixerGetNumDevs();
  1434. #ifdef MIXER_MAPPER
  1435.     for (n = -1; n < nDevs; n++)
  1436. #else
  1437.     for (n = 0; n < nDevs; n++)
  1438. #endif
  1439.     {
  1440.     MIXERCAPS       mxc;
  1441.  
  1442.     mmr = mixerGetDevCaps(n, &mxc, sizeof(mxc));
  1443.     if (MMSYSERR_NOERROR != mmr)
  1444.     {
  1445.         if (-1 != n)
  1446.         {
  1447.         mxc.vDriverVersion = 0;
  1448.         lstrcpy(mxc.szPname, gszBogusCaps);
  1449.         }
  1450.         else
  1451.         {
  1452.         if (0 == nDevs)
  1453.             break;
  1454.  
  1455.         mxc.vDriverVersion = uMMSysVer;
  1456.         lstrcpy(mxc.szPname, gszDefaultMapper);
  1457.         }
  1458.     }
  1459.  
  1460.     //
  1461.     //
  1462.     //
  1463.     uDevType = MMCAPS_DEVTYPE_MIXER;
  1464.     wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1465.          n, (mxc.vDriverVersion >> 8), (BYTE)mxc.vDriverVersion,
  1466.          (LPSTR)mxc.szPname);
  1467.  
  1468.     nIndex = ListBox_AddString(hlb, ach);
  1469.     lParam = MAKELPARAM((WORD)n, (WORD)uDevType);
  1470.     ListBox_SetItemData(hlb, nIndex, lParam);
  1471.     }
  1472. #endif
  1473.  
  1474.  
  1475.  
  1476.     //
  1477.     //
  1478.     //
  1479.     {
  1480.     TIMECAPS    tc;
  1481.  
  1482.     mmr = timeGetDevCaps(&tc, sizeof(tc));
  1483.     if (MMSYSERR_NOERROR == mmr)
  1484.     {
  1485.         //
  1486.         //
  1487.         //
  1488.         uDevType = MMCAPS_DEVTYPE_TIMER;
  1489.         wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1490.              0, (uMMSysVer >> 8), (BYTE)uMMSysVer,
  1491.              (LPSTR)gszTimerDevice);
  1492.  
  1493.         nIndex = ListBox_AddString(hlb, ach);
  1494.         lParam = MAKELPARAM(0, (WORD)uDevType);
  1495.         ListBox_SetItemData(hlb, nIndex, lParam);
  1496.     }
  1497.     }
  1498.  
  1499.  
  1500.  
  1501.     //
  1502.     //
  1503.     //
  1504.     nDevs = waveInGetNumDevs();
  1505.     for (n = -1; n < nDevs; n++)
  1506.     {
  1507.     WAVEINCAPS      wic;
  1508.  
  1509.     mmr = waveInGetDevCaps(n, &wic, sizeof(wic));
  1510.     if (MMSYSERR_NOERROR != mmr)
  1511.     {
  1512.         if (-1 != n)
  1513.         {
  1514.         wic.vDriverVersion = 0;
  1515.         lstrcpy(wic.szPname, gszBogusCaps);
  1516.         }
  1517.         else
  1518.         {
  1519.         if (0 == nDevs)
  1520.             break;
  1521.  
  1522.         wic.vDriverVersion = uMMSysVer;
  1523.         lstrcpy(wic.szPname, gszDefaultMapper);
  1524.         }
  1525.     }
  1526.  
  1527.     //
  1528.     //
  1529.     //
  1530.     uDevType = MMCAPS_DEVTYPE_WAVEIN;
  1531.     wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1532.          n, (wic.vDriverVersion >> 8), (BYTE)wic.vDriverVersion,
  1533.          (LPSTR)wic.szPname);
  1534.  
  1535.     nIndex = ListBox_AddString(hlb, ach);
  1536.     lParam = MAKELPARAM((WORD)n, (WORD)uDevType);
  1537.     ListBox_SetItemData(hlb, nIndex, lParam);
  1538.     }
  1539.  
  1540.     //
  1541.     //
  1542.     //
  1543.     nDevs = waveOutGetNumDevs();
  1544.     for (n = -1; n < nDevs; n++)
  1545.     {
  1546.     WAVEOUTCAPS     woc;
  1547.  
  1548.     mmr = waveOutGetDevCaps(n, &woc, sizeof(woc));
  1549.     if (MMSYSERR_NOERROR != mmr)
  1550.     {
  1551.         if (-1 != n)
  1552.         {
  1553.         woc.vDriverVersion = 0;
  1554.         lstrcpy(woc.szPname, gszBogusCaps);
  1555.         }
  1556.         else
  1557.         {
  1558.         if (0 == nDevs)
  1559.             break;
  1560.  
  1561.         woc.vDriverVersion = uMMSysVer;
  1562.         lstrcpy(woc.szPname, gszDefaultMapper);
  1563.         }
  1564.     }
  1565.  
  1566.     //
  1567.     //
  1568.     //
  1569.     uDevType = MMCAPS_DEVTYPE_WAVEOUT;
  1570.     wsprintf(ach, gszDeviceFormatList, (LPSTR)gaszDeviceType[uDevType],
  1571.          n, (woc.vDriverVersion >> 8), (BYTE)woc.vDriverVersion,
  1572.          (LPSTR)woc.szPname);
  1573.  
  1574.     nIndex = ListBox_AddString(hlb, ach);
  1575.     lParam = MAKELPARAM((WORD)n, (WORD)uDevType);
  1576.     ListBox_SetItemData(hlb, nIndex, lParam);
  1577.     }
  1578.  
  1579.  
  1580.     //
  1581.     //
  1582.     //
  1583.     return (TRUE);
  1584. } // MMCapsEnumerateLowLevel()
  1585.