/* for ClassFactory */ HRESULT WINAPI DMUSIC_CreateDirectMusicSynthImpl(REFIID riid, void **ppobj, IUnknown *outer) { static const WCHAR descrW[] = {'M','i','c','r','o','s','o','f','t',' ', 'S','y','n','t','h','e','s','i','z','e','r',0}; IDirectMusicSynth8Impl *obj; HRESULT hr; TRACE("(%s, %p, %p)\n", debugstr_guid(riid), ppobj, outer); obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*obj)); if (NULL == obj) { *ppobj = NULL; return E_OUTOFMEMORY; } obj->IDirectMusicSynth8_iface.lpVtbl = &DirectMusicSynth8_Vtbl; obj->IKsControl_iface.lpVtbl = &DMSynthImpl_IKsControl_Vtbl; obj->ref = 1; /* fill in caps */ obj->pCaps.dwSize = sizeof(DMUS_PORTCAPS); obj->pCaps.dwFlags = DMUS_PC_DLS | DMUS_PC_SOFTWARESYNTH | DMUS_PC_DIRECTSOUND | DMUS_PC_DLS2 | DMUS_PC_AUDIOPATH | DMUS_PC_WAVE; obj->pCaps.guidPort = CLSID_DirectMusicSynth; obj->pCaps.dwClass = DMUS_PC_OUTPUTCLASS; obj->pCaps.dwType = DMUS_PORT_USER_MODE_SYNTH; obj->pCaps.dwMemorySize = DMUS_PC_SYSTEMMEMORY; obj->pCaps.dwMaxChannelGroups = 1000; obj->pCaps.dwMaxVoices = 1000; obj->pCaps.dwMaxAudioChannels = 2; obj->pCaps.dwEffectFlags = DMUS_EFFECT_REVERB; strcpyW(obj->pCaps.wszDescription, descrW); hr = IDirectMusicSynth8_QueryInterface(&obj->IDirectMusicSynth8_iface, riid, ppobj); IDirectMusicSynth8_Release(&obj->IDirectMusicSynth8_iface); return hr; }
/* IDirectMusic8Impl IDirectMusic part: */ static HRESULT WINAPI IDirectMusic8Impl_EnumPort(LPDIRECTMUSIC8 iface, DWORD dwIndex, LPDMUS_PORTCAPS pPortCaps) { IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; TRACE("(%p, %d, %p)\n", This, dwIndex, pPortCaps); if (NULL == pPortCaps) { return E_POINTER; } /* i guess the first port shown is always software synthesizer */ if (dwIndex == 0) { IDirectMusicSynth8* synth; TRACE("enumerating 'Microsoft Software Synthesizer' port\n"); CoCreateInstance (&CLSID_DirectMusicSynth, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynth8, (void**)&synth); IDirectMusicSynth8_GetPortCaps (synth, pPortCaps); IDirectMusicSynth8_Release (synth); return S_OK; } /* it seems that the rest of devices are obtained thru dmusic32.EnumLegacyDevices...*sigh*...which is undocumented*/ #if 0 int numMIDI = midiOutGetNumDevs(); int numWAVE = waveOutGetNumDevs(); int i; /* then return digital sound ports */ for (i = 1; i <= numWAVE; i++) { TRACE("enumerating 'digital sound' ports\n"); if (i == dwIndex) { DirectSoundEnumerateA(register_waveport, pPortCaps); return S_OK; } } /* finally, list all *real* MIDI ports*/ for (i = numWAVE + 1; i <= numWAVE + numMIDI; i++) { TRACE("enumerating 'real MIDI' ports\n"); if (i == dwIndex) FIXME("Found MIDI port, but *real* MIDI ports not supported yet\n"); } #endif return S_FALSE; }
static void create_system_ports_list(IDirectMusic8Impl* object) { port_info * port; const WCHAR emulated[] = {' ','[','E','m','u','l','a','t','e','d',']',0}; ULONG nb_ports; ULONG nb_midi_out; ULONG nb_midi_in; MIDIOUTCAPSW caps_out; MIDIINCAPSW caps_in; IDirectMusicSynth8* synth; HRESULT hr; ULONG i; TRACE("(%p)\n", object); /* NOTE: - it seems some native versions get the rest of devices through dmusic32.EnumLegacyDevices...*sigh*...which is undocumented - should we enum wave devices ? Native does not seem to */ nb_midi_out = midiOutGetNumDevs(); nb_midi_in = midiInGetNumDevs(); nb_ports = 1 /* midi mapper */ + nb_midi_out + nb_midi_in + 1 /* synth port */; port = object->system_ports = HeapAlloc(GetProcessHeap(), 0, nb_ports * sizeof(port_info)); if (!object->system_ports) return; /* Fill common port caps for all winmm ports */ for (i = 0; i < (nb_ports - 1 /* synth port*/); i++) { object->system_ports[i].caps.dwSize = sizeof(DMUS_PORTCAPS); object->system_ports[i].caps.dwType = DMUS_PORT_WINMM_DRIVER; object->system_ports[i].caps.dwMemorySize = 0; object->system_ports[i].caps.dwMaxChannelGroups = 1; object->system_ports[i].caps.dwMaxVoices = 0; object->system_ports[i].caps.dwMaxAudioChannels = 0; object->system_ports[i].caps.dwEffectFlags = DMUS_EFFECT_NONE; /* Fake port GUID */ object->system_ports[i].caps.guidPort = IID_IUnknown; object->system_ports[i].caps.guidPort.Data1 = i + 1; } /* Fill midi mapper port info */ port->device = MIDI_MAPPER; port->create = DMUSIC_CreateMidiOutPortImpl; midiOutGetDevCapsW(MIDI_MAPPER, &caps_out, sizeof(caps_out)); strcpyW(port->caps.wszDescription, caps_out.szPname); strcatW(port->caps.wszDescription, emulated); port->caps.dwFlags = DMUS_PC_SHAREABLE; port->caps.dwClass = DMUS_PC_OUTPUTCLASS; port++; /* Fill midi out port info */ for (i = 0; i < nb_midi_out; i++) { port->device = i; port->create = DMUSIC_CreateMidiOutPortImpl; midiOutGetDevCapsW(i, &caps_out, sizeof(caps_out)); strcpyW(port->caps.wszDescription, caps_out.szPname); strcatW(port->caps.wszDescription, emulated); port->caps.dwFlags = DMUS_PC_SHAREABLE | DMUS_PC_EXTERNAL; port->caps.dwClass = DMUS_PC_OUTPUTCLASS; port++; } /* Fill midi in port info */ for (i = 0; i < nb_midi_in; i++) { port->device = i; port->create = DMUSIC_CreateMidiInPortImpl; midiInGetDevCapsW(i, &caps_in, sizeof(caps_in)); strcpyW(port->caps.wszDescription, caps_in.szPname); strcatW(port->caps.wszDescription, emulated); port->caps.dwFlags = DMUS_PC_EXTERNAL; port->caps.dwClass = DMUS_PC_INPUTCLASS; port++; } /* Fill synth port info */ port->create = DMUSIC_CreateSynthPortImpl; hr = CoCreateInstance(&CLSID_DirectMusicSynth, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynth8, (void**)&synth); if (SUCCEEDED(hr)) { port->caps.dwSize = sizeof(port->caps); hr = IDirectMusicSynth8_GetPortCaps(synth, &port->caps); IDirectMusicSynth8_Release(synth); } if (FAILED(hr)) nb_ports--; object->nb_system_ports = nb_ports; }