// Copyright (c) 1998 Microsoft Corporation #include #include #include #include #include "dmusicc.h" #include "..\dmusic\dmusicp.h" #include "dmusic32.h" // @globalv Registry location of legacy driver port definitions const char cszPortsRoot[] = REGSTR_PATH_PRIVATEPROPERTIES "\\Midi\\Ports"; // @mfunc:(INTERNAL) Update the port list with legacy devices enumerated via // the WinMM MIDI API. // // @rdesc Returns one of the following: // // @flag S_OK | On success // @flag S_FALSE | If there were no devices found // @flag E_OUTOFMEMORY | If there was insufficient memory to build the port list // // HRESULT EnumLegacyDevices( LPVOID pInstance, PORTENUMCB cb) { MIDIOUTCAPS moc; MIDIINCAPS mic; int idxDev; int cDev; UINT cAdded; HRESULT hr; HKEY hkPortsRoot; DMUS_PORTCAPS dmpc; // Initialize caps with stuff that doesn't change // ZeroMemory(&dmpc, sizeof(dmpc)); dmpc.dwSize = sizeof(dmpc); dmpc.dwMaxChannelGroups = 1; // Try to open the port registry key. We will continue even if this fails and use // non-persistent GUID's. // if (RegCreateKey(HKEY_LOCAL_MACHINE, cszPortsRoot, &hkPortsRoot)) { hkPortsRoot = NULL; } cAdded = 0; // MIDI output devices // // Starts at -1 == MIDI mapper // cDev = (int)midiOutGetNumDevs(); for (idxDev = -1; idxDev < cDev; ++idxDev) { if (midiOutGetDevCaps((UINT)idxDev, &moc, sizeof(moc))) { continue; } // NOTE: Since this DLL is only Win9x, we know that moc.szPname // is from midiOutGetDevCapsA // MultiByteToWideChar( CP_OEMCP, 0, moc.szPname, -1, dmpc.wszDescription, sizeof(dmpc.wszDescription)); dmpc.dwClass = DMUS_PC_OUTPUTCLASS; dmpc.dwType = DMUS_PORT_WINMM_DRIVER; dmpc.dwFlags = DMUS_PC_SHAREABLE; if (moc.wTechnology == MOD_MIDIPORT) { dmpc.dwFlags |= DMUS_PC_EXTERNAL; } hr = (*cb)(pInstance, dmpc, ptLegacyDevice, idxDev, -1, -1, hkPortsRoot); if (SUCCEEDED(hr)) { ++cAdded; } else if (hr == E_OUTOFMEMORY) { return hr; } } // MIDI input devices // // NOTE: Starts at 0, no input mapper // cDev = (int)midiInGetNumDevs(); for (idxDev = 0; idxDev < cDev; ++idxDev) { if (midiInGetDevCaps((UINT)idxDev, &mic, sizeof(mic))) { continue; } MultiByteToWideChar( CP_OEMCP, 0, mic.szPname, -1, dmpc.wszDescription, sizeof(dmpc.wszDescription)); dmpc.dwClass = DMUS_PC_INPUTCLASS; dmpc.dwFlags = DMUS_PC_EXTERNAL; hr = (*cb)(pInstance, dmpc, ptLegacyDevice, idxDev, -1, // PinID -1 flags as legacy device -1, hkPortsRoot); if (SUCCEEDED(hr)) { ++cAdded; } else if (hr == E_OUTOFMEMORY) { return hr; } } if (hkPortsRoot) { RegCloseKey(hkPortsRoot); } return cAdded ? S_OK : S_FALSE; }