From 8c48fba6a207824676364b0e11929fdf4f1047f1 Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Mon, 20 Aug 2018 00:01:34 +0200 Subject: [PATCH] dmusic: Add a stub midi out port. Signed-off-by: Michael Stefaniuc Signed-off-by: Alexandre Julliard --- dlls/dmusic/port.c | 225 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 223 insertions(+), 2 deletions(-) diff --git a/dlls/dmusic/port.c b/dlls/dmusic/port.c index 713175650bf..2f8fb9288c2 100644 --- a/dlls/dmusic/port.c +++ b/dlls/dmusic/port.c @@ -21,6 +21,7 @@ #include #include "dmusic_private.h" +#include "wine/heap.h" WINE_DEFAULT_DEBUG_CHANNEL(dmusic); @@ -903,12 +904,232 @@ HRESULT synth_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_param return hr; } +struct midi_port { + IDirectMusicPort IDirectMusicPort_iface; + LONG ref; +}; + +static inline struct midi_port *impl_from_IDirectMusicPort(IDirectMusicPort *iface) +{ + return CONTAINING_RECORD(iface, struct midi_port, IDirectMusicPort_iface); +} + +static HRESULT WINAPI midi_IDirectMusicPort_QueryInterface(IDirectMusicPort *iface, REFIID riid, + void **ret_iface) +{ + TRACE("(%p, %s, %p)\n", iface, debugstr_dmguid(riid), ret_iface); + + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicPort)) + *ret_iface = iface; + else { + WARN("no interface for %s\n", debugstr_dmguid(riid)); + *ret_iface = NULL; + return E_NOINTERFACE; + } + + IDirectMusicPort_AddRef(iface); + + return S_OK; +} + +static ULONG WINAPI midi_IDirectMusicPort_AddRef(IDirectMusicPort *iface) +{ + struct midi_port *This = impl_from_IDirectMusicPort(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref = %u\n", iface, ref); + + return ref; +} + +static ULONG WINAPI midi_IDirectMusicPort_Release(IDirectMusicPort *iface) +{ + struct midi_port *This = impl_from_IDirectMusicPort(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref = %u\n", iface, ref); + + if (!ref) + heap_free(This); + + return ref; +} + +static HRESULT WINAPI midi_IDirectMusicPort_PlayBuffer(IDirectMusicPort *iface, + IDirectMusicBuffer *buffer) +{ + FIXME("(%p, %p) stub!\n", iface, buffer); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_SetReadNotificationHandle(IDirectMusicPort *iface, + HANDLE event) +{ + FIXME("(%p, %p) stub!\n", iface, event); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_Read(IDirectMusicPort *iface, + IDirectMusicBuffer *buffer) +{ + FIXME("(%p, %p) stub!\n", iface, buffer); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_DownloadInstrument(IDirectMusicPort *iface, + IDirectMusicInstrument *instrument, IDirectMusicDownloadedInstrument **downloaded, + DMUS_NOTERANGE *ranges, DWORD num_ranges) +{ + FIXME("(%p, %p, %p, %p, %u) stub!\n", iface, instrument, downloaded, ranges, num_ranges); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_UnloadInstrument(IDirectMusicPort *iface, + IDirectMusicDownloadedInstrument *downloaded) +{ + FIXME("(%p, %p) stub!\n", iface, downloaded); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_GetLatencyClock(IDirectMusicPort *iface, + IReferenceClock **clock) +{ + FIXME("(%p, %p) stub!\n", iface, clock); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_GetRunningStats(IDirectMusicPort *iface, + DMUS_SYNTHSTATS *stats) +{ + FIXME("(%p, %p) stub!\n", iface, stats); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_Compact(IDirectMusicPort *iface) +{ + FIXME("(%p) stub!\n", iface); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_GetCaps(IDirectMusicPort *iface, DMUS_PORTCAPS *caps) +{ + FIXME("(%p, %p) stub!\n", iface, caps); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_DeviceIoControl(IDirectMusicPort *iface, + DWORD io_control_code, void *in, DWORD size_in, void *out, DWORD size_out, DWORD *ret_len, + OVERLAPPED *overlapped) +{ + FIXME("(%p, %u, %p, %u, %p, %u, %p, %p) stub!\n", iface, io_control_code, in, size_in, out + , size_out, ret_len, overlapped); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_SetNumChannelGroups(IDirectMusicPort *iface, + DWORD cgroups) +{ + FIXME("(%p, %u) stub!\n", iface, cgroups); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_GetNumChannelGroups(IDirectMusicPort *iface, + DWORD *cgroups) +{ + FIXME("(%p, %p) stub!\n", iface, cgroups); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_Activate(IDirectMusicPort *iface, BOOL active) +{ + FIXME("(%p, %u) stub!\n", iface, active); + + return S_OK; +} + +static HRESULT WINAPI midi_IDirectMusicPort_SetChannelPriority(IDirectMusicPort *iface, + DWORD channel_group, DWORD channel, DWORD priority) +{ + FIXME("(%p, %u, %u, %u) stub!\n", iface, channel_group, channel, priority); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_GetChannelPriority(IDirectMusicPort *iface, + DWORD channel_group, DWORD channel, DWORD *priority) +{ + FIXME("(%p, %u, %u, %p) stub!\n", iface, channel_group, channel, priority); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_SetDirectSound(IDirectMusicPort *iface, + IDirectSound *dsound, IDirectSoundBuffer *dsbuffer) +{ + FIXME("(%p, %p, %p) stub!\n", iface, dsound, dsbuffer); + + return E_NOTIMPL; +} + +static HRESULT WINAPI midi_IDirectMusicPort_GetFormat(IDirectMusicPort *iface, WAVEFORMATEX *format, + DWORD *format_size, DWORD *buffer_size) +{ + FIXME("(%p, %p, %p, %p) stub!\n", iface, format, format_size, buffer_size); + + return E_NOTIMPL; +} + +static const IDirectMusicPortVtbl midi_port_vtbl = { + midi_IDirectMusicPort_QueryInterface, + midi_IDirectMusicPort_AddRef, + midi_IDirectMusicPort_Release, + midi_IDirectMusicPort_PlayBuffer, + midi_IDirectMusicPort_SetReadNotificationHandle, + midi_IDirectMusicPort_Read, + midi_IDirectMusicPort_DownloadInstrument, + midi_IDirectMusicPort_UnloadInstrument, + midi_IDirectMusicPort_GetLatencyClock, + midi_IDirectMusicPort_GetRunningStats, + midi_IDirectMusicPort_Compact, + midi_IDirectMusicPort_GetCaps, + midi_IDirectMusicPort_DeviceIoControl, + midi_IDirectMusicPort_SetNumChannelGroups, + midi_IDirectMusicPort_GetNumChannelGroups, + midi_IDirectMusicPort_Activate, + midi_IDirectMusicPort_SetChannelPriority, + midi_IDirectMusicPort_GetChannelPriority, + midi_IDirectMusicPort_SetDirectSound, + midi_IDirectMusicPort_GetFormat, +}; + HRESULT midi_out_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_params, DMUS_PORTCAPS *port_caps, IDirectMusicPort **port) { - FIXME("(%p, %p, %p): stub\n", port_params, port_caps, port); + struct midi_port *obj; - return E_NOTIMPL; + TRACE("(%p, %p, %p)\n", port_params, port_caps, port); + + if (!(obj = heap_alloc_zero(sizeof(*obj)))) + return E_OUTOFMEMORY; + + obj->IDirectMusicPort_iface.lpVtbl = &midi_port_vtbl; + obj->ref = 1; + + *port = &obj->IDirectMusicPort_iface; + + return S_OK; } HRESULT midi_in_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_params,