Module: wine Branch: master Commit: 5626be6bb8b22d6fd476ad8c5f7e236f5d1b4ff2 URL: https://gitlab.winehq.org/wine/wine/-/commit/5626be6bb8b22d6fd476ad8c5f7e236...
Author: Rémi Bernon rbernon@codeweavers.com Date: Sat Sep 9 14:06:32 2023 +0200
dmusic: Implement instrument articulation downloads.
---
dlls/dmusic/instrument.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c index a15a8d4e84f..8ce3c0bc979 100644 --- a/dlls/dmusic/instrument.c +++ b/dlls/dmusic/instrument.c @@ -452,6 +452,39 @@ HRESULT instrument_create_from_chunk(IStream *stream, struct chunk_entry *parent return S_OK; }
+static void write_articulation_download(struct list *articulations, ULONG *offsets, + BYTE **ptr, UINT index, DWORD *first, UINT *end) +{ + DMUS_ARTICULATION2 *dmus_articulation2 = NULL; + struct articulation *articulation; + CONNECTIONLIST *list; + UINT size; + + LIST_FOR_EACH_ENTRY(articulation, articulations, struct articulation, entry) + { + if (dmus_articulation2) dmus_articulation2->ulNextArtIdx = index; + else *first = index; + + offsets[index++] = sizeof(DMUS_DOWNLOADINFO) + *ptr - (BYTE *)offsets; + dmus_articulation2 = (DMUS_ARTICULATION2 *)*ptr; + (*ptr) += sizeof(DMUS_ARTICULATION2); + + dmus_articulation2->ulArtIdx = index; + dmus_articulation2->ulFirstExtCkIdx = 0; + dmus_articulation2->ulNextArtIdx = 0; + + size = articulation->list.cConnections * sizeof(CONNECTION); + offsets[index++] = sizeof(DMUS_DOWNLOADINFO) + *ptr - (BYTE *)offsets; + list = (CONNECTIONLIST *)*ptr; + (*ptr) += sizeof(CONNECTIONLIST) + size; + + *list = articulation->list; + memcpy(list + 1, articulation->connections, size); + } + + *end = index; +} + struct download_buffer { DMUS_DOWNLOADINFO info; @@ -464,6 +497,7 @@ HRESULT instrument_download_to_port(IDirectMusicInstrument *iface, IDirectMusicP IDirectMusicDownloadedInstrument **downloaded) { struct instrument *This = impl_from_IDirectMusicInstrument(iface); + struct articulation *articulation; struct download_buffer *buffer; IDirectMusicDownload *download; DWORD size, offset_count; @@ -477,10 +511,26 @@ HRESULT instrument_download_to_port(IDirectMusicInstrument *iface, IDirectMusicP size += sizeof(ULONG) + sizeof(DMUS_INSTRUMENT); offset_count = 1;
+ LIST_FOR_EACH_ENTRY(articulation, &This->articulations, struct articulation, entry) + { + size += sizeof(ULONG) + sizeof(DMUS_ARTICULATION2); + size += sizeof(ULONG) + sizeof(CONNECTIONLIST); + size += articulation->list.cConnections * sizeof(CONNECTION); + offset_count += 2; + } + LIST_FOR_EACH_ENTRY(region, &This->regions, struct region, entry) { size += sizeof(ULONG) + sizeof(DMUS_REGION); offset_count++; + + LIST_FOR_EACH_ENTRY(articulation, ®ion->articulations, struct articulation, entry) + { + size += sizeof(ULONG) + sizeof(DMUS_ARTICULATION2); + size += sizeof(ULONG) + sizeof(CONNECTIONLIST); + size += articulation->list.cConnections * sizeof(CONNECTION); + offset_count += 2; + } }
if (FAILED(hr = IDirectMusicPortDownload_AllocateBuffer(port, size, &download))) return hr; @@ -506,6 +556,9 @@ HRESULT instrument_download_to_port(IDirectMusicInstrument *iface, IDirectMusicP dmus_instrument->ulCopyrightIdx = 0; dmus_instrument->ulGlobalArtIdx = 0;
+ write_articulation_download(&This->articulations, buffer->offsets, &ptr, index, + &dmus_instrument->ulGlobalArtIdx, &index); + LIST_FOR_EACH_ENTRY(region, &This->regions, struct region, entry) { if (dmus_region) dmus_region->ulNextRegionIdx = index; @@ -532,6 +585,9 @@ HRESULT instrument_download_to_port(IDirectMusicInstrument *iface, IDirectMusicP IUnknown_Release(wave); } if (FAILED(hr)) goto failed; + + write_articulation_download(®ion->articulations, buffer->offsets, &ptr, index, + &dmus_region->ulRegionArtIdx, &index); }
if (FAILED(hr = IDirectMusicPortDownload_Download(port, download))) goto failed;