Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
3.7 KiB

  1. // Copyright (c) 1998 Microsoft Corporation
  2. #include <windows.h>
  3. #include <mmsystem.h>
  4. #include <dsoundp.h>
  5. #include <regstr.h>
  6. #include "dmusicc.h"
  7. #include "..\dmusic\dmusicp.h"
  8. #include "dmusic32.h"
  9. // @globalv Registry location of legacy driver port definitions
  10. const char cszPortsRoot[] = REGSTR_PATH_PRIVATEPROPERTIES "\\Midi\\Ports";
  11. // @mfunc:(INTERNAL) Update the port list with legacy devices enumerated via
  12. // the WinMM MIDI API.
  13. //
  14. // @rdesc Returns one of the following:
  15. //
  16. // @flag S_OK | On success
  17. // @flag S_FALSE | If there were no devices found
  18. // @flag E_OUTOFMEMORY | If there was insufficient memory to build the port list
  19. //
  20. //
  21. HRESULT EnumLegacyDevices(
  22. LPVOID pInstance,
  23. PORTENUMCB cb)
  24. {
  25. MIDIOUTCAPS moc;
  26. MIDIINCAPS mic;
  27. int idxDev;
  28. int cDev;
  29. UINT cAdded;
  30. HRESULT hr;
  31. HKEY hkPortsRoot;
  32. DMUS_PORTCAPS dmpc;
  33. // Initialize caps with stuff that doesn't change
  34. //
  35. ZeroMemory(&dmpc, sizeof(dmpc));
  36. dmpc.dwSize = sizeof(dmpc);
  37. dmpc.dwMaxChannelGroups = 1;
  38. // Try to open the port registry key. We will continue even if this fails and use
  39. // non-persistent GUID's.
  40. //
  41. if (RegCreateKey(HKEY_LOCAL_MACHINE, cszPortsRoot, &hkPortsRoot))
  42. {
  43. hkPortsRoot = NULL;
  44. }
  45. cAdded = 0;
  46. // MIDI output devices
  47. //
  48. // Starts at -1 == MIDI mapper
  49. //
  50. cDev = (int)midiOutGetNumDevs();
  51. for (idxDev = -1; idxDev < cDev; ++idxDev)
  52. {
  53. if (midiOutGetDevCaps((UINT)idxDev, &moc, sizeof(moc)))
  54. {
  55. continue;
  56. }
  57. // NOTE: Since this DLL is only Win9x, we know that moc.szPname
  58. // is from midiOutGetDevCapsA
  59. //
  60. MultiByteToWideChar(
  61. CP_OEMCP,
  62. 0,
  63. moc.szPname,
  64. -1,
  65. dmpc.wszDescription,
  66. sizeof(dmpc.wszDescription));
  67. dmpc.dwClass = DMUS_PC_OUTPUTCLASS;
  68. dmpc.dwType = DMUS_PORT_WINMM_DRIVER;
  69. dmpc.dwFlags = DMUS_PC_SHAREABLE;
  70. if (moc.wTechnology == MOD_MIDIPORT)
  71. {
  72. dmpc.dwFlags |= DMUS_PC_EXTERNAL;
  73. }
  74. hr = (*cb)(pInstance,
  75. dmpc,
  76. ptLegacyDevice,
  77. idxDev,
  78. -1,
  79. -1,
  80. hkPortsRoot);
  81. if (SUCCEEDED(hr))
  82. {
  83. ++cAdded;
  84. }
  85. else if (hr == E_OUTOFMEMORY)
  86. {
  87. return hr;
  88. }
  89. }
  90. // MIDI input devices
  91. //
  92. // NOTE: Starts at 0, no input mapper
  93. //
  94. cDev = (int)midiInGetNumDevs();
  95. for (idxDev = 0; idxDev < cDev; ++idxDev)
  96. {
  97. if (midiInGetDevCaps((UINT)idxDev, &mic, sizeof(mic)))
  98. {
  99. continue;
  100. }
  101. MultiByteToWideChar(
  102. CP_OEMCP,
  103. 0,
  104. mic.szPname,
  105. -1,
  106. dmpc.wszDescription,
  107. sizeof(dmpc.wszDescription));
  108. dmpc.dwClass = DMUS_PC_INPUTCLASS;
  109. dmpc.dwFlags = DMUS_PC_EXTERNAL;
  110. hr = (*cb)(pInstance,
  111. dmpc,
  112. ptLegacyDevice,
  113. idxDev,
  114. -1, // PinID -1 flags as legacy device
  115. -1,
  116. hkPortsRoot);
  117. if (SUCCEEDED(hr))
  118. {
  119. ++cAdded;
  120. }
  121. else if (hr == E_OUTOFMEMORY)
  122. {
  123. return hr;
  124. }
  125. }
  126. if (hkPortsRoot)
  127. {
  128. RegCloseKey(hkPortsRoot);
  129. }
  130. return cAdded ? S_OK : S_FALSE;
  131. }