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

Windows编程

开发平台:

Visual C++

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