Module: wine Branch: master Commit: 10a1e533c3de65ae29078be607148531a22e654c URL: https://gitlab.winehq.org/wine/wine/-/commit/10a1e533c3de65ae29078be60714853...
Author: Rémi Bernon rbernon@codeweavers.com Date: Thu Oct 12 22:18:06 2023 +0200
dmband: Download segment tracks if performance auto-download is set.
---
dlls/dmband/bandtrack.c | 4 ++-- dlls/dmime/dmime_private.h | 2 +- dlls/dmime/performance.c | 2 +- dlls/dmime/segmentstate.c | 17 ++++++++++++++--- 4 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/dlls/dmband/bandtrack.c b/dlls/dmband/bandtrack.c index e0acb6ff62d..5229204b284 100644 --- a/dlls/dmband/bandtrack.c +++ b/dlls/dmband/bandtrack.c @@ -234,7 +234,7 @@ static HRESULT WINAPI band_track_SetParam(IDirectMusicTrack8 *iface, REFGUID typ band_connect_to_collection(entry->band, param); } else if (IsEqualGUID(type, &GUID_Disable_Auto_Download)) - FIXME("GUID_Disable_Auto_Download not handled yet\n"); + This->header.bAutoDownload = FALSE; else if (IsEqualGUID(type, &GUID_Download)) FIXME("GUID_Download not handled yet\n"); else if (IsEqualGUID(type, &GUID_DownloadToAudioPath)) @@ -265,7 +265,7 @@ static HRESULT WINAPI band_track_SetParam(IDirectMusicTrack8 *iface, REFGUID typ IDirectMusicPerformance_Release(performance); } else if (IsEqualGUID(type, &GUID_Enable_Auto_Download)) - FIXME("GUID_Enable_Auto_Download not handled yet\n"); + This->header.bAutoDownload = TRUE; else if (IsEqualGUID(type, &GUID_IDirectMusicBand)) FIXME("GUID_IDirectMusicBand not handled yet\n"); else if (IsEqualGUID(type, &GUID_StandardMIDIFile)) diff --git a/dlls/dmime/dmime_private.h b/dlls/dmime/dmime_private.h index c1f777f3949..7f1937eaa0f 100644 --- a/dlls/dmime/dmime_private.h +++ b/dlls/dmime/dmime_private.h @@ -75,7 +75,7 @@ extern void set_audiopath_primary_dsound_buffer(IDirectMusicAudioPath*,IDirectSo extern HRESULT segment_state_create(IDirectMusicSegment *segment, MUSIC_TIME start_time, IDirectMusicPerformance *performance, IDirectMusicSegmentState **ret_iface); extern HRESULT segment_state_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance *performance); -extern HRESULT segment_state_end_play(IDirectMusicSegmentState *iface); +extern HRESULT segment_state_end_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance *performance);
extern HRESULT wave_track_create_from_chunk(IStream *stream, struct chunk_entry *parent, IDirectMusicTrack8 **ret_iface); diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index dc6ef575713..ea2a3cc52dd 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -1740,7 +1740,7 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, if (IsEqualGUID(¬if->guidNotificationType, &GUID_NOTIFICATION_SEGMENT) && notif->dwNotificationOption == DMUS_NOTIFICATION_SEGEND) { - if (FAILED(hr = segment_state_end_play((IDirectMusicSegmentState *)notif->punkUser))) + if (FAILED(hr = segment_state_end_play((IDirectMusicSegmentState *)notif->punkUser, performance))) WARN("Failed to end segment state %p, hr %#lx\n", notif->punkUser, hr); }
diff --git a/dlls/dmime/segmentstate.c b/dlls/dmime/segmentstate.c index 1cb9daac69a..c43d833fedd 100644 --- a/dlls/dmime/segmentstate.c +++ b/dlls/dmime/segmentstate.c @@ -51,6 +51,7 @@ struct segment_state MUSIC_TIME start_time; MUSIC_TIME start_point; MUSIC_TIME end_point; + BOOL auto_download;
struct list tracks; }; @@ -103,7 +104,7 @@ static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface)
if (!ref) { - segment_state_end_play((IDirectMusicSegmentState *)iface); + segment_state_end_play((IDirectMusicSegmentState *)iface, NULL); if (This->segment) IDirectMusicSegment_Release(This->segment); free(This); } @@ -224,8 +225,13 @@ HRESULT segment_state_create(IDirectMusicSegment *segment, MUSIC_TIME start_time This->segment = segment; IDirectMusicSegment_AddRef(This->segment);
+ if (SUCCEEDED(hr = IDirectMusicPerformance_GetGlobalParam(performance, &GUID_PerfAutoDownload, + &This->auto_download, sizeof(This->auto_download))) && This->auto_download) + hr = IDirectMusicSegment_SetParam(segment, &GUID_DownloadToAudioPath, -1, + DMUS_SEG_ALLTRACKS, 0, performance); + This->start_time = start_time; - hr = IDirectMusicSegment_GetStartPoint(segment, &This->start_point); + if (SUCCEEDED(hr)) hr = IDirectMusicSegment_GetStartPoint(segment, &This->start_point); if (SUCCEEDED(hr)) hr = IDirectMusicSegment_GetLength(segment, &This->end_point);
for (i = 0; SUCCEEDED(hr); i++) @@ -283,10 +289,11 @@ HRESULT segment_state_play(IDirectMusicSegmentState *iface, IDirectMusicPerforma return hr; }
-HRESULT segment_state_end_play(IDirectMusicSegmentState *iface) +HRESULT segment_state_end_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance *performance) { struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface); struct track_entry *entry, *next; + HRESULT hr;
LIST_FOR_EACH_ENTRY_SAFE(entry, next, &This->tracks, struct track_entry, entry) { @@ -294,5 +301,9 @@ HRESULT segment_state_end_play(IDirectMusicSegmentState *iface) track_entry_destroy(entry); }
+ if (performance && This->auto_download && FAILED(hr = IDirectMusicSegment_SetParam(This->segment, + &GUID_UnloadFromAudioPath, -1, DMUS_SEG_ALLTRACKS, 0, performance))) + ERR("Failed to unload segment from performance, hr %#lx\n", hr); + return S_OK; }