/* SynthPortImpl IDirectMusicPort interface follows: */ static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_PlayBuffer(LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER buffer) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); HRESULT hr; REFERENCE_TIME time; LPBYTE data; DWORD size; TRACE("(%p/%p)->(%p)\n", iface, This, buffer); if (!buffer) return E_POINTER; hr = IDirectMusicBuffer_GetStartTime(buffer, &time); if (SUCCEEDED(hr)) hr = IDirectMusicBuffer_GetRawBufferPtr(buffer, &data); if (SUCCEEDED(hr)) hr = IDirectMusicBuffer_GetUsedBytes(buffer, &size); if (SUCCEEDED(hr)) hr = IDirectMusicSynth_PlayBuffer(This->synth, time, data, size); return hr; }
/* SynthPortImpl IDirectMusicPort IUnknown part follows: */ static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_QueryInterface(LPDIRECTMUSICPORT iface, REFIID riid, LPVOID *ret_iface) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_dmguid(riid), ret_iface); if (IsEqualIID (riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirectMusicPort) || IsEqualGUID(riid, &IID_IDirectMusicPort8)) { *ret_iface = &This->IDirectMusicPort_iface; IDirectMusicPort_AddRef((LPDIRECTMUSICPORT)*ret_iface); return S_OK; } else if (IsEqualGUID(riid, &IID_IDirectMusicPortDownload) || IsEqualGUID(riid, &IID_IDirectMusicPortDownload8)) { *ret_iface = &This->IDirectMusicPortDownload_iface; IDirectMusicPortDownload_AddRef((LPDIRECTMUSICPORTDOWNLOAD)*ret_iface); return S_OK; } else if (IsEqualGUID(riid, &IID_IDirectMusicThru) || IsEqualGUID(riid, &IID_IDirectMusicThru8)) { *ret_iface = &This->IDirectMusicThru_iface; IDirectMusicThru_AddRef((LPDIRECTMUSICTHRU)*ret_iface); return S_OK; } WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface); return E_NOINTERFACE; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_Compact(LPDIRECTMUSICPORT iface) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(): stub\n", iface, This); return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_UnloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicDownloadedInstrument *downloaded_instrument) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%p): stub\n", iface, This, downloaded_instrument); return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_Read(LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER buffer) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%p): stub\n", iface, This, buffer); return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetReadNotificationHandle(LPDIRECTMUSICPORT iface, HANDLE event) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%p): stub\n", iface, This, event); return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetDirectSound(LPDIRECTMUSICPORT iface, LPDIRECTSOUND direct_sound, LPDIRECTSOUNDBUFFER direct_sound_buffer) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, direct_sound, direct_sound_buffer); return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetRunningStats(LPDIRECTMUSICPORT iface, LPDMUS_SYNTHSTATS stats) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%p): stub\n", iface, This, stats); return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_DeviceIoControl(LPDIRECTMUSICPORT iface, DWORD io_control_code, LPVOID in_buffer, DWORD in_buffer_size, LPVOID out_buffer, DWORD out_buffer_size, LPDWORD bytes_returned, LPOVERLAPPED overlapped) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%d, %p, %d, %p, %d, %p, %p): stub\n", iface, This, io_control_code, in_buffer, in_buffer_size, out_buffer, out_buffer_size, bytes_returned, overlapped); return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetNumChannelGroups(LPDIRECTMUSICPORT iface, DWORD channel_groups) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%d): semi-stub\n", iface, This, channel_groups); This->nrofgroups = channel_groups; return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetCaps(LPDIRECTMUSICPORT iface, LPDMUS_PORTCAPS port_caps) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); TRACE("(%p/%p)->(%p)\n", iface, This, port_caps); *port_caps = This->caps; return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_Activate(LPDIRECTMUSICPORT iface, BOOL active) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); TRACE("(%p/%p)->(%d)\n", iface, This, active); This->fActive = active; return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetChannelPriority(LPDIRECTMUSICPORT iface, DWORD channel_group, DWORD channel, LPDWORD priority) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); TRACE("(%p/%p)->(%u, %u, %p)\n", iface, This, channel_group, channel, priority); *priority = This->group[channel_group - 1].channel[channel].priority; return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetNumChannelGroups(LPDIRECTMUSICPORT iface, LPDWORD channel_groups) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); TRACE("(%p/%p)->(%p)\n", iface, This, channel_groups); *channel_groups = This->nrofgroups; return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetLatencyClock(LPDIRECTMUSICPORT iface, IReferenceClock** clock) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); TRACE("(%p/%p)->(%p)\n", iface, This, clock); *clock = This->pLatencyClock; IReferenceClock_AddRef(*clock); return S_OK; }
static ULONG WINAPI SynthPortImpl_IDirectMusicPort_AddRef(LPDIRECTMUSICPORT iface) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p)->(): new ref = %u\n", This, ref); DMUSIC_LockModule(); return ref; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_DownloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicInstrument* instrument, IDirectMusicDownloadedInstrument** downloaded_instrument, DMUS_NOTERANGE* note_ranges, DWORD num_note_ranges) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%p, %p, %p, %d): stub\n", iface, This, instrument, downloaded_instrument, note_ranges, num_note_ranges); if (!instrument || !downloaded_instrument || (num_note_ranges && !note_ranges)) return E_POINTER; return DMUSIC_CreateDirectMusicDownloadedInstrumentImpl(&IID_IDirectMusicDownloadedInstrument, (LPVOID*)downloaded_instrument, NULL); }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetChannelPriority(LPDIRECTMUSICPORT iface, DWORD channel_group, DWORD channel, DWORD priority) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); FIXME("(%p/%p)->(%d, %d, %d): semi-stub\n", iface, This, channel_group, channel, priority); if (channel > 16) { WARN("isn't there supposed to be 16 channels (no. %d requested)?! (faking as it is ok)\n", channel); /*return E_INVALIDARG;*/ } return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetFormat(LPDIRECTMUSICPORT iface, LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize, LPDWORD pdwBufferSize) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); WAVEFORMATEX format; FIXME("(%p, %p, %p, %p): stub\n", This, pWaveFormatEx, pdwWaveFormatExSize, pdwBufferSize); if (pWaveFormatEx == NULL) { if (pdwWaveFormatExSize) *pdwWaveFormatExSize = sizeof(format); else return E_POINTER; } else { if (pdwWaveFormatExSize == NULL) return E_POINTER; /* Just fill this in with something that will not crash Direct Sound for now. */ /* It won't be used anyway until Performances are completed */ format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = 2; /* This->params.dwAudioChannels; */ format.nSamplesPerSec = 44100; /* This->params.dwSampleRate; */ format.wBitsPerSample = 16; /* FIXME: check this */ format.nBlockAlign = (format.wBitsPerSample * format.nChannels) / 8; format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; format.cbSize = 0; if (*pdwWaveFormatExSize >= sizeof(format)) { CopyMemory(pWaveFormatEx, &format, min(sizeof(format), *pdwWaveFormatExSize)); *pdwWaveFormatExSize = sizeof(format); /* FIXME check if this is set */ } else return E_POINTER; /* FIXME find right error */ } if (pdwBufferSize) *pdwBufferSize = 44100 * 2 * 2; else return E_POINTER; return S_OK; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_UnloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicDownloadedInstrument *downloaded_instrument) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); IDirectMusicDownloadedInstrumentImpl *downloaded_object = unsafe_impl_from_IDirectMusicDownloadedInstrument(downloaded_instrument); TRACE("(%p/%p)->(%p)\n", iface, This, downloaded_instrument); if (!downloaded_instrument) return E_POINTER; if (!downloaded_object->downloaded) return DMUS_E_NOT_DOWNLOADED_TO_PORT; HeapFree(GetProcessHeap(), 0, downloaded_object->data); downloaded_object->data = NULL; downloaded_object->downloaded = FALSE; return S_OK; }
static ULONG WINAPI SynthPortImpl_IDirectMusicPort_Release(LPDIRECTMUSICPORT iface) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(): new ref = %u\n", This, ref); if (!ref) { IDirectMusicSynth_Activate(This->synth, FALSE); IDirectMusicSynth_Close(This->synth); IDirectMusicSynth_Release(This->synth); IDirectMusicSynthSink_Release(This->synth_sink); IReferenceClock_Release(This->pLatencyClock); HeapFree(GetProcessHeap(), 0, This); } DMUSIC_UnlockModule(); return ref; }
static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_DownloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicInstrument* instrument, IDirectMusicDownloadedInstrument** downloaded_instrument, DMUS_NOTERANGE* note_ranges, DWORD num_note_ranges) { SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); IDirectMusicInstrumentImpl *instrument_object; HRESULT ret; BOOL free; HANDLE download; DMUS_DOWNLOADINFO *info; DMUS_OFFSETTABLE *offset_table; DMUS_INSTRUMENT *instrument_info; BYTE *data; ULONG offset; ULONG nb_regions; ULONG size; ULONG i; TRACE("(%p/%p)->(%p, %p, %p, %d)\n", iface, This, instrument, downloaded_instrument, note_ranges, num_note_ranges); if (!instrument || !downloaded_instrument || (num_note_ranges && !note_ranges)) return E_POINTER; instrument_object = impl_from_IDirectMusicInstrument(instrument); nb_regions = instrument_object->header.cRegions; size = sizeof(DMUS_DOWNLOADINFO) + sizeof(ULONG) * (1 + nb_regions) + sizeof(DMUS_INSTRUMENT) + sizeof(DMUS_REGION) * nb_regions; data = HeapAlloc(GetProcessHeap(), 0, size); if (!data) return E_OUTOFMEMORY; info = (DMUS_DOWNLOADINFO*)data; offset_table = (DMUS_OFFSETTABLE*)(data + sizeof(DMUS_DOWNLOADINFO)); offset = sizeof(DMUS_DOWNLOADINFO) + sizeof(ULONG) * (1 + nb_regions); info->dwDLType = DMUS_DOWNLOADINFO_INSTRUMENT2; info->dwDLId = 0; info->dwNumOffsetTableEntries = 1 + instrument_object->header.cRegions; info->cbSize = size; offset_table->ulOffsetTable[0] = offset; instrument_info = (DMUS_INSTRUMENT*)(data + offset); offset += sizeof(DMUS_INSTRUMENT); instrument_info->ulPatch = MIDILOCALE2Patch(&instrument_object->header.Locale); instrument_info->ulFirstRegionIdx = 1; instrument_info->ulGlobalArtIdx = 0; /* FIXME */ instrument_info->ulFirstExtCkIdx = 0; /* FIXME */ instrument_info->ulCopyrightIdx = 0; /* FIXME */ instrument_info->ulFlags = 0; /* FIXME */ for (i = 0; i < nb_regions; i++) { DMUS_REGION *region = (DMUS_REGION*)(data + offset); offset_table->ulOffsetTable[1 + i] = offset; offset += sizeof(DMUS_REGION); region->RangeKey = instrument_object->regions[i].header.RangeKey; region->RangeVelocity = instrument_object->regions[i].header.RangeVelocity; region->fusOptions = instrument_object->regions[i].header.fusOptions; region->usKeyGroup = instrument_object->regions[i].header.usKeyGroup; region->ulRegionArtIdx = 0; /* FIXME */ region->ulNextRegionIdx = i != (nb_regions - 1) ? (i + 2) : 0; region->ulFirstExtCkIdx = 0; /* FIXME */ region->WaveLink = instrument_object->regions[i].wave_link; region->WSMP = instrument_object->regions[i].wave_sample; region->WLOOP[0] = instrument_object->regions[i].wave_loop; } ret = IDirectMusicSynth8_Download(This->synth, &download, (VOID*)data, &free); if (SUCCEEDED(ret)) ret = DMUSIC_CreateDirectMusicDownloadedInstrumentImpl(downloaded_instrument); if (SUCCEEDED(ret)) { IDirectMusicDownloadedInstrumentImpl *downloaded_object = impl_from_IDirectMusicDownloadedInstrument(*downloaded_instrument); downloaded_object->data = data; downloaded_object->downloaded = TRUE; } *downloaded_instrument = NULL; HeapFree(GetProcessHeap(), 0, data); return E_FAIL; }