From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/bandtrack.c | 39 +++++++++++++++++++++++++++++++++----- dlls/dmband/tests/dmband.c | 2 -- 2 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/dlls/dmband/bandtrack.c b/dlls/dmband/bandtrack.c index 845345a9fa2..6233d39b9c0 100644 --- a/dlls/dmband/bandtrack.c +++ b/dlls/dmband/bandtrack.c @@ -104,10 +104,13 @@ static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface) return ref; }
-static HRESULT WINAPI band_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *pSegment) +static HRESULT WINAPI band_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *segment) { struct band_track *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p): stub\n", This, pSegment); + + FIXME("(%p, %p): stub\n", This, segment); + + if (!segment) return E_POINTER; return S_OK; }
@@ -116,16 +119,42 @@ static HRESULT WINAPI band_track_InitPlay(IDirectMusicTrack8 *iface, void **state_data, DWORD virtual_track8id, DWORD flags) { struct band_track *This = impl_from_IDirectMusicTrack8(iface); + struct band_entry *entry; + HRESULT hr; + + FIXME("(%p, %p, %p, %p, %ld, %lx): semi-stub\n", This, segment_state, performance, state_data, virtual_track8id, flags); + + if (!performance) return E_POINTER;
- FIXME("(%p, %p, %p, %p, %ld, %lx): stub\n", This, segment_state, performance, state_data, virtual_track8id, flags); + if (This->header.bAutoDownload) + { + LIST_FOR_EACH_ENTRY(entry, &This->bands, struct band_entry, entry) + { + if (FAILED(hr = IDirectMusicBand_Download(entry->band, performance))) + return hr; + } + }
return S_OK; }
-static HRESULT WINAPI band_track_EndPlay(IDirectMusicTrack8 *iface, void *pStateData) +static HRESULT WINAPI band_track_EndPlay(IDirectMusicTrack8 *iface, void *state_data) { struct band_track *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p): stub\n", This, pStateData); + struct band_entry *entry; + HRESULT hr; + + FIXME("(%p, %p): semi-stub\n", This, state_data); + + if (This->header.bAutoDownload) + { + LIST_FOR_EACH_ENTRY(entry, &This->bands, struct band_entry, entry) + { + if (FAILED(hr = IDirectMusicBand_Unload(entry->band, NULL))) + return hr; + } + } + return S_OK; }
diff --git a/dlls/dmband/tests/dmband.c b/dlls/dmband/tests/dmband.c index 07ffcf4e7fe..ee45ca33714 100644 --- a/dlls/dmband/tests/dmband.c +++ b/dlls/dmband/tests/dmband.c @@ -226,12 +226,10 @@ static void test_bandtrack(void) ok(hr == S_OK, "DirectMusicBandTrack create failed: %#lx, expected S_OK\n", hr);
/* IDirectMusicTrack8 */ - todo_wine { hr = IDirectMusicTrack8_Init(dmt8, NULL); ok(hr == E_POINTER, "IDirectMusicTrack8_Init failed: %#lx\n", hr); hr = IDirectMusicTrack8_InitPlay(dmt8, NULL, NULL, NULL, 0, 0); ok(hr == E_POINTER, "IDirectMusicTrack8_InitPlay failed: %#lx\n", hr); - } hr = IDirectMusicTrack8_EndPlay(dmt8, NULL); ok(hr == S_OK, "IDirectMusicTrack8_EndPlay failed: %#lx\n", hr); hr = IDirectMusicTrack8_Play(dmt8, NULL, 0, 0, 0, 0, NULL, NULL, 0);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/seqtrack.c | 95 +++++++++++++++++++++++++++++++++++++--- dlls/dmime/tests/dmime.c | 13 +----- 2 files changed, 91 insertions(+), 17 deletions(-)
diff --git a/dlls/dmime/seqtrack.c b/dlls/dmime/seqtrack.c index 21b78ff26cd..a6043cb4a89 100644 --- a/dlls/dmime/seqtrack.c +++ b/dlls/dmime/seqtrack.c @@ -108,13 +108,96 @@ static HRESULT WINAPI sequence_track_EndPlay(IDirectMusicTrack8 *iface, void *pS return S_OK; }
-static HRESULT WINAPI sequence_track_Play(IDirectMusicTrack8 *iface, void *pStateData, - MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags, - IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID) +static HRESULT WINAPI sequence_track_Play(IDirectMusicTrack8 *iface, void *state_data, + MUSIC_TIME start_time, MUSIC_TIME end_time, MUSIC_TIME time_offset, DWORD segment_flags, + IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD track_id) { - struct sequence_track *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID); - return S_OK; + struct sequence_track *This = impl_from_IDirectMusicTrack8(iface); + IDirectMusicGraph *graph; + HRESULT hr; + UINT i; + + TRACE("(%p, %p, %ld, %ld, %ld, %#lx, %p, %p, %ld)\n", This, state_data, start_time, end_time, + time_offset, segment_flags, performance, segment_state, track_id); + + if (start_time != 0) FIXME("start_time %ld not implemented\n", start_time); + if (end_time != -1) FIXME("end_time %ld not implemented\n", end_time); + if (time_offset != 0) FIXME("time_offset %ld not implemented\n", time_offset); + if (segment_flags) FIXME("segment_flags %#lx not implemented\n", segment_flags); + if (segment_state) FIXME("segment_state %p not implemented\n", segment_state); + + if (FAILED(hr = IDirectMusicPerformance_QueryInterface(performance, + &IID_IDirectMusicGraph, (void **)&graph))) + return hr; + + for (i = 0; SUCCEEDED(hr) &&i < This->count; i++) + { + DMUS_IO_SEQ_ITEM *item = This->items + i; + DMUS_NOTE_PMSG *msg; + + if (FAILED(hr = IDirectMusicPerformance_AllocPMsg(performance, sizeof(*msg), + (DMUS_PMSG **)&msg))) + break; + + msg->mtTime = item->mtTime; + msg->dwFlags = DMUS_PMSGF_MUSICTIME; + msg->dwPChannel = item->dwPChannel; + msg->dwVirtualTrackID = track_id; + msg->dwType = DMUS_PMSGT_NOTE; + msg->dwGroupID = 1; + msg->mtDuration = item->mtDuration; + msg->wMusicValue = item->bByte1; + msg->nOffset = item->nOffset; + msg->bVelocity = item->bByte2; + msg->bFlags = 1; + msg->bMidiValue = item->bByte1; + + if (FAILED(hr = IDirectMusicGraph_StampPMsg(graph, (DMUS_PMSG *)msg)) + || FAILED(hr = IDirectMusicPerformance_SendPMsg(performance, (DMUS_PMSG *)msg))) + { + IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)msg); + break; + } + } + + for (i = 0; SUCCEEDED(hr) &&i < This->curve_count; i++) + { + DMUS_IO_CURVE_ITEM *item = This->curve_items + i; + DMUS_CURVE_PMSG *msg; + + if (FAILED(hr = IDirectMusicPerformance_AllocPMsg(performance, sizeof(*msg), + (DMUS_PMSG **)&msg))) + break; + + msg->mtTime = item->mtStart; + msg->dwFlags = DMUS_PMSGF_MUSICTIME; + msg->dwPChannel = item->dwPChannel; + msg->dwVirtualTrackID = track_id; + msg->dwType = DMUS_PMSGT_CURVE; + msg->mtDuration = item->mtDuration; + msg->mtOriginalStart = item->mtStart; + msg->mtResetDuration = item->mtResetDuration; + msg->nStartValue = item->nStartValue; + msg->nEndValue = item->nEndValue; + msg->nResetValue = item->nResetValue; + msg->nOffset = item->nOffset; + msg->bType = item->bType; + msg->bCurveShape = item->bCurveShape; + msg->bCCData = item->bCCData; + msg->bFlags = item->bFlags; + msg->wParamType = item->wParamType; + msg->wMergeIndex = item->wMergeIndex; + + if (FAILED(hr = IDirectMusicGraph_StampPMsg(graph, (DMUS_PMSG *)msg)) + || FAILED(hr = IDirectMusicPerformance_SendPMsg(performance, (DMUS_PMSG *)msg))) + { + IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)msg); + break; + } + } + + IDirectMusicGraph_Release(graph); + return hr; }
static HRESULT WINAPI sequence_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index 412cccce781..6881eac80c6 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -3502,30 +3502,21 @@ static void test_sequence_track(void)
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)¬e); ok(!ret, "got %#lx\n", ret); - if (note->dwType == DMUS_PMSGT_NOTE) - { check_dmus_note_pmsg(note, 0, 0, 500, 60, 120); - } hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)note); ok(hr == S_OK, "got %#lx\n", hr);
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)¬e); - todo_wine ok(!ret, "got %#lx\n", ret); - if (!ret) - { + ok(!ret, "got %#lx\n", ret); check_dmus_note_pmsg(note, 1000, 1, 200, 50, 100); hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)note); ok(hr == S_OK, "got %#lx\n", hr); - }
ret = test_tool_wait_message(tool, 500, &msg); - todo_wine ok(!ret, "got %#lx\n", ret); - if (!ret) - { + ok(!ret, "got %#lx\n", ret); ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %#lx\n", msg->dwType); hr = IDirectMusicPerformance_FreePMsg(performance, msg); ok(hr == S_OK, "got %#lx\n", hr); - }
IDirectMusicSegment_Release(segment);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmband/band.c | 34 ++++++++++++++++++++++++++++++++ dlls/dmband/bandtrack.c | 38 +++++++++++++++++++++++++----------- dlls/dmband/dmband_private.h | 2 ++ dlls/dmband/tests/dmband.c | 1 - dlls/dmime/tests/dmime.c | 18 +++-------------- 5 files changed, 66 insertions(+), 27 deletions(-)
diff --git a/dlls/dmband/band.c b/dlls/dmband/band.c index 4b3c053c586..456bb20143e 100644 --- a/dlls/dmband/band.c +++ b/dlls/dmband/band.c @@ -486,3 +486,37 @@ HRESULT band_connect_to_collection(IDirectMusicBand *iface, IDirectMusicCollecti
return S_OK; } + +HRESULT band_send_messages(IDirectMusicBand *iface, IDirectMusicPerformance *performance, + IDirectMusicGraph *graph, MUSIC_TIME time, DWORD track_id) +{ + struct band *This = impl_from_IDirectMusicBand(iface); + struct instrument_entry *entry; + HRESULT hr = S_OK; + + LIST_FOR_EACH_ENTRY_REV(entry, &This->instruments, struct instrument_entry, entry) + { + DMUS_PATCH_PMSG *msg; + + if (FAILED(hr = IDirectMusicPerformance_AllocPMsg(performance, sizeof(*msg), + (DMUS_PMSG **)&msg))) + break; + + msg->mtTime = time; + msg->dwFlags = DMUS_PMSGF_MUSICTIME; + msg->dwPChannel = entry->instrument.dwPChannel; + msg->dwVirtualTrackID = track_id; + msg->dwType = DMUS_PMSGT_PATCH; + msg->dwGroupID = 1; + msg->byInstrument = entry->instrument.dwPatch; + + if (FAILED(hr = IDirectMusicGraph_StampPMsg(graph, (DMUS_PMSG *)msg)) + || FAILED(hr = IDirectMusicPerformance_SendPMsg(performance, (DMUS_PMSG *)msg))) + { + IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)msg); + break; + } + } + + return hr; +} diff --git a/dlls/dmband/bandtrack.c b/dlls/dmband/bandtrack.c index 6233d39b9c0..e0acb6ff62d 100644 --- a/dlls/dmband/bandtrack.c +++ b/dlls/dmband/bandtrack.c @@ -159,22 +159,38 @@ static HRESULT WINAPI band_track_EndPlay(IDirectMusicTrack8 *iface, void *state_ }
static HRESULT WINAPI band_track_Play(IDirectMusicTrack8 *iface, void *state_data, - MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD flags, - IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, - DWORD virtual_id) + MUSIC_TIME start_time, MUSIC_TIME end_time, MUSIC_TIME time_offset, DWORD segment_flags, + IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD track_id) { struct band_track *This = impl_from_IDirectMusicTrack8(iface); + IDirectMusicGraph *graph; + struct band_entry *entry; + HRESULT hr;
- FIXME("(%p, %p, %ld, %ld, %ld, %lx, %p, %p, %ld): semi-stub\n", This, state_data, mtStart, mtEnd, mtOffset, flags, performance, segment_state, virtual_id); + TRACE("(%p, %p, %ld, %ld, %ld, %#lx, %p, %p, %ld)\n", This, state_data, start_time, end_time, + time_offset, segment_flags, performance, segment_state, track_id);
- /* Sends following pMSG: - - DMUS_PATCH_PMSG - - DMUS_TRANSPOSE_PMSG - - DMUS_CHANNEL_PRIORITY_PMSG - - DMUS_MIDI_PMSG - */ + if (!performance) return DMUS_S_END;
- return S_OK; + if (start_time != 0) FIXME("start_time %ld not implemented\n", start_time); + if (end_time != -1) FIXME("end_time %ld not implemented\n", end_time); + if (time_offset != 0) FIXME("time_offset %ld not implemented\n", time_offset); + if (segment_flags) FIXME("segment_flags %#lx not implemented\n", segment_flags); + if (segment_state) FIXME("segment_state %p not implemented\n", segment_state); + + if (FAILED(hr = IDirectMusicPerformance_QueryInterface(performance, + &IID_IDirectMusicGraph, (void **)&graph))) + return hr; + + LIST_FOR_EACH_ENTRY(entry, &This->bands, struct band_entry, entry) + { + if (FAILED(hr = band_send_messages(entry->band, performance, graph, + entry->head.lBandTimeLogical, track_id))) + break; + } + + IDirectMusicGraph_Release(graph); + return hr; }
static HRESULT WINAPI band_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, diff --git a/dlls/dmband/dmband_private.h b/dlls/dmband/dmband_private.h index a12b9f8cc82..48c5ec02aeb 100644 --- a/dlls/dmband/dmband_private.h +++ b/dlls/dmband/dmband_private.h @@ -48,5 +48,7 @@ extern HRESULT create_dmband(REFIID riid, void **ret_iface); extern HRESULT create_dmbandtrack(REFIID riid, void **ret_iface);
extern HRESULT band_connect_to_collection(IDirectMusicBand *iface, IDirectMusicCollection *collection); +extern HRESULT band_send_messages(IDirectMusicBand *iface, IDirectMusicPerformance *performance, + IDirectMusicGraph *graph, MUSIC_TIME time, DWORD track_id);
#endif /* __WINE_DMBAND_PRIVATE_H */ diff --git a/dlls/dmband/tests/dmband.c b/dlls/dmband/tests/dmband.c index ee45ca33714..d88606976e4 100644 --- a/dlls/dmband/tests/dmband.c +++ b/dlls/dmband/tests/dmband.c @@ -233,7 +233,6 @@ static void test_bandtrack(void) hr = IDirectMusicTrack8_EndPlay(dmt8, NULL); ok(hr == S_OK, "IDirectMusicTrack8_EndPlay failed: %#lx\n", hr); hr = IDirectMusicTrack8_Play(dmt8, NULL, 0, 0, 0, 0, NULL, NULL, 0); - todo_wine ok(hr == DMUS_S_END, "IDirectMusicTrack8_Play failed: %#lx\n", hr); hr = IDirectMusicTrack8_GetParam(dmt8, NULL, 0, NULL, NULL); ok(hr == E_POINTER, "IDirectMusicTrack8_GetParam failed: %#lx\n", hr); diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index 6881eac80c6..6dc9d8e0f5e 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -3756,39 +3756,27 @@ static void test_band_track_play(void)
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&patch); ok(!ret, "got %#lx\n", ret); - if (patch->dwType == DMUS_PMSGT_PATCH) - { check_dmus_patch_pmsg(patch, 0, 1, 0, 1); - } hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)patch); ok(hr == S_OK, "got %#lx\n", hr);
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&patch); - todo_wine ok(!ret, "got %#lx\n", ret); - if (!ret) - { + ok(!ret, "got %#lx\n", ret); check_dmus_patch_pmsg(patch, 1000, 2, 0, 3); hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)patch); ok(hr == S_OK, "got %#lx\n", hr); - }
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&patch); - todo_wine ok(!ret, "got %#lx\n", ret); - if (!ret) - { + ok(!ret, "got %#lx\n", ret); check_dmus_patch_pmsg(patch, 1000, 1, 0, 2); hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)patch); ok(hr == S_OK, "got %#lx\n", hr); - }
ret = test_tool_wait_message(tool, 500, &msg); - todo_wine ok(!ret, "got %#lx\n", ret); - if (!ret) - { + ok(!ret, "got %#lx\n", ret); ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %#lx\n", msg->dwType); hr = IDirectMusicPerformance_FreePMsg(performance, msg); ok(hr == S_OK, "got %#lx\n", hr); - }
IDirectMusicSegment_Release(segment);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/performance.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index 2018fa013de..782f300eb4b 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -1637,6 +1637,39 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface,
switch (msg->dwType) { + case DMUS_PMSGT_MIDI: + { + static const UINT event_size = sizeof(DMUS_EVENTHEADER) + sizeof(DWORD); + DMUS_BUFFERDESC desc = {.dwSize = sizeof(desc), .cbBuffer = 2 * event_size}; + DMUS_MIDI_PMSG *midi = (DMUS_MIDI_PMSG *)msg; + IDirectMusicBuffer *buffer; + IDirectMusicPort *port; + DWORD group, channel; + UINT value = 0; + + if (FAILED(hr = IDirectMusicPerformance_PChannelInfo(performance, msg->dwPChannel, + &port, &group, &channel))) + { + WARN("Failed to get message port, hr %#lx\n", hr); + return DMUS_S_FREE; + } + + value |= channel; + value |= (UINT)midi->bStatus; + value |= (UINT)midi->bByte1 << 8; + value |= (UINT)midi->bByte2 << 16; + + if (SUCCEEDED(hr = IDirectMusic_CreateMusicBuffer(This->dmusic, &desc, &buffer, NULL))) + { + hr = IDirectMusicBuffer_PackStructured(buffer, msg->rtTime, group, value); + if (SUCCEEDED(hr)) hr = IDirectMusicPort_PlayBuffer(port, buffer); + IDirectMusicBuffer_Release(buffer); + } + + IDirectMusicPort_Release(port); + break; + } + case DMUS_PMSGT_NOTIFICATION: { DMUS_NOTIFICATION_PMSG *notif = (DMUS_NOTIFICATION_PMSG *)msg;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/performance.c | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index 782f300eb4b..b12a8315330 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -1626,6 +1626,35 @@ static HRESULT WINAPI performance_tool_GetMediaTypes(IDirectMusicTool *iface, DW return E_NOTIMPL; }
+static HRESULT performance_send_midi_pmsg(struct performance *This, DMUS_PMSG *msg, UINT flags, + BYTE status, BYTE byte1, BYTE byte2) +{ + IDirectMusicPerformance8 *performance = &This->IDirectMusicPerformance8_iface; + DMUS_MIDI_PMSG *midi; + HRESULT hr; + + if (FAILED(hr = IDirectMusicPerformance8_AllocPMsg(performance, sizeof(*midi), + (DMUS_PMSG **)&midi))) + return hr; + + if (flags & DMUS_PMSGF_REFTIME) midi->rtTime = msg->rtTime; + if (flags & DMUS_PMSGF_MUSICTIME) midi->mtTime = msg->mtTime; + midi->dwFlags = flags; + midi->dwPChannel = msg->dwPChannel; + midi->dwVirtualTrackID = msg->dwVirtualTrackID; + midi->dwVoiceID = msg->dwVoiceID; + midi->dwGroupID = msg->dwGroupID; + midi->dwType = DMUS_PMSGT_MIDI; + midi->bStatus = status; + midi->bByte1 = byte1; + midi->bByte2 = byte2; + + if (FAILED(hr = IDirectMusicPerformance8_SendPMsg(performance, (DMUS_PMSG *)midi))) + IDirectMusicPerformance8_FreePMsg(performance, (DMUS_PMSG *)midi); + + return hr; +} + static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, IDirectMusicPerformance *performance, DMUS_PMSG *msg) { @@ -1670,6 +1699,22 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, break; }
+ case DMUS_PMSGT_NOTE: + { + DMUS_NOTE_PMSG *note = (DMUS_NOTE_PMSG *)msg; + + if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_REFTIME | DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_IMMEDIATE, + 0x90 /* NOTE_ON */, note->bMidiValue, note->bVelocity))) + WARN("Failed to translate message to MIDI, hr %#lx\n", hr); + + msg->mtTime += note->mtDuration; + if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_QUEUE, + 0x80 /* NOTE_OFF */, note->bMidiValue, 0))) + WARN("Failed to translate message to MIDI, hr %#lx\n", hr); + + break; + } + case DMUS_PMSGT_NOTIFICATION: { DMUS_NOTIFICATION_PMSG *notif = (DMUS_NOTIFICATION_PMSG *)msg;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/performance.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index b12a8315330..63429023da2 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -1715,6 +1715,25 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, break; }
+ case DMUS_PMSGT_PATCH: + { + DMUS_PATCH_PMSG *patch = (DMUS_PATCH_PMSG *)msg; + + if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_REFTIME | DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_IMMEDIATE, + 0xb0 /* Control Change */, 0x00 /* CC: Bank MSB */, patch->byMSB))) + WARN("Failed to translate message to MIDI, hr %#lx\n", hr); + + if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_REFTIME | DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_IMMEDIATE, + 0xb0 /* Control Change */, 0x20 /* CC: Bank LSB */, patch->byLSB))) + WARN("Failed to translate message to MIDI, hr %#lx\n", hr); + + if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_REFTIME | DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_IMMEDIATE, + 0xc0 /* Program Change */, patch->byInstrument, 0))) + WARN("Failed to translate message to MIDI, hr %#lx\n", hr); + + break; + } + case DMUS_PMSGT_NOTIFICATION: { DMUS_NOTIFICATION_PMSG *notif = (DMUS_NOTIFICATION_PMSG *)msg;
I'm approving but something for the future:\ Shouldn't we use an enum or defines for the performance_send_midi_pmsg() status parameter?\ You added comments but a self descriptive enum / define would be IMHO nicer.
This merge request was approved by Michael Stefaniuc.