Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=9027 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=34751 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45135 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48220
-- v4: dmime: Play direct sound buffer from DMUS_PMSGT_WAVE message. dmime: Implement IDirectMusicTrack_Play for the wave track. dmime: Implement GUID_(Download|Unload)FromAudioPath for wave track. dmime: Create a wave track when loading a segment from a .wav. dmusic: Split wave entry points to dmusic_wave.h. dmime: Include dmobject.h in dmime_private.h. dmime: Get rid of the IDirectMusicWaveTrack typedef.
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=9027 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=34751 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45135 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48220 --- dlls/dmime/wavetrack.c | 105 ++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 53 deletions(-)
diff --git a/dlls/dmime/wavetrack.c b/dlls/dmime/wavetrack.c index 4150ea3bcd2..279cfb5c768 100644 --- a/dlls/dmime/wavetrack.c +++ b/dlls/dmime/wavetrack.c @@ -1,5 +1,4 @@ -/* IDirectMusicWaveTrack Implementation - * +/* * Copyright (C) 2003-2004 Rok Mandeljc * * This program is free software; you can redistribute it and/or @@ -22,9 +21,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
-/***************************************************************************** - * IDirectMusicWaveTrack implementation - */ struct wave_item { struct list entry; DMUS_IO_WAVE_ITEM_HEADER header; @@ -37,29 +33,30 @@ struct wave_part { struct list items; };
-typedef struct IDirectMusicWaveTrack { +struct wave_track +{ IDirectMusicTrack8 IDirectMusicTrack8_iface; struct dmobject dmobj; /* IPersistStream only */ LONG ref; DMUS_IO_WAVE_TRACK_HEADER header; struct list parts; -} IDirectMusicWaveTrack; +};
-/* IDirectMusicWaveTrack IDirectMusicTrack8 part: */ -static inline IDirectMusicWaveTrack *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface) +/* struct wave_track IDirectMusicTrack8 part: */ +static inline struct wave_track *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface) { - return CONTAINING_RECORD(iface, IDirectMusicWaveTrack, IDirectMusicTrack8_iface); + return CONTAINING_RECORD(iface, struct wave_track, IDirectMusicTrack8_iface); }
-static inline IDirectMusicWaveTrack *impl_from_IPersistStream(IPersistStream *iface) +static inline struct wave_track *impl_from_IPersistStream(IPersistStream *iface) { - return CONTAINING_RECORD(iface, IDirectMusicWaveTrack, dmobj.IPersistStream_iface); + return CONTAINING_RECORD(iface, struct wave_track, dmobj.IPersistStream_iface); }
static HRESULT WINAPI wave_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid, void **ret_iface) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
@@ -81,7 +78,7 @@ static HRESULT WINAPI wave_track_QueryInterface(IDirectMusicTrack8 *iface, REFII
static ULONG WINAPI wave_track_AddRef(IDirectMusicTrack8 *iface) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -91,7 +88,7 @@ static ULONG WINAPI wave_track_AddRef(IDirectMusicTrack8 *iface)
static ULONG WINAPI wave_track_Release(IDirectMusicTrack8 *iface) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref); @@ -119,40 +116,42 @@ static ULONG WINAPI wave_track_Release(IDirectMusicTrack8 *iface)
static HRESULT WINAPI wave_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *pSegment) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p): stub\n", This, pSegment); - return S_OK; + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %p): stub\n", This, pSegment); + return S_OK; }
static HRESULT WINAPI wave_track_InitPlay(IDirectMusicTrack8 *iface, IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance, void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags); - return S_OK; + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData, + dwVirtualTrack8ID, dwFlags); + return S_OK; }
static HRESULT WINAPI wave_track_EndPlay(IDirectMusicTrack8 *iface, void *pStateData) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p): stub\n", This, pStateData); - return S_OK; + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %p): stub\n", This, pStateData); + return S_OK; }
static HRESULT WINAPI wave_track_Play(IDirectMusicTrack8 *iface, void *pStateData, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags, IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID) { - IDirectMusicWaveTrack *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 wave_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; }
static HRESULT WINAPI wave_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *next, void *param) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s, %ld, %p, %p): not supported\n", This, debugstr_dmguid(type), time, next, param); return DMUS_E_GET_UNSUPPORTED; @@ -161,7 +160,7 @@ static HRESULT WINAPI wave_track_GetParam(IDirectMusicTrack8 *iface, REFGUID typ static HRESULT WINAPI wave_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, void *param) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s, %ld, %p)\n", This, debugstr_dmguid(type), time, param);
@@ -195,7 +194,7 @@ static HRESULT WINAPI wave_track_SetParam(IDirectMusicTrack8 *iface, REFGUID typ
static HRESULT WINAPI wave_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID type) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); static const GUID *valid[] = { &GUID_Disable_Auto_Download, &GUID_Download, @@ -218,7 +217,7 @@ static HRESULT WINAPI wave_track_IsParamSupported(IDirectMusicTrack8 *iface, REF
static HRESULT WINAPI wave_track_AddNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype)); return E_NOTIMPL; @@ -227,7 +226,7 @@ static HRESULT WINAPI wave_track_AddNotificationType(IDirectMusicTrack8 *iface, static HRESULT WINAPI wave_track_RemoveNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype)); return E_NOTIMPL; @@ -236,44 +235,45 @@ static HRESULT WINAPI wave_track_RemoveNotificationType(IDirectMusicTrack8 *ifac static HRESULT WINAPI wave_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack); - return S_OK; + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack); + return S_OK; }
static HRESULT WINAPI wave_track_PlayEx(IDirectMusicTrack8 *iface, void *pStateData, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags, IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %ld, %p, %p, %ld): stub\n", This, pStateData, wine_dbgstr_longlong(rtStart), - wine_dbgstr_longlong(rtEnd), wine_dbgstr_longlong(rtOffset), dwFlags, pPerf, pSegSt, dwVirtualID); - return S_OK; + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %ld, %p, %p, %ld): stub\n", This, pStateData, + wine_dbgstr_longlong(rtStart), wine_dbgstr_longlong(rtEnd), + wine_dbgstr_longlong(rtOffset), dwFlags, pPerf, pSegSt, dwVirtualID); + return S_OK; }
static HRESULT WINAPI wave_track_GetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam, void *pStateData, DWORD dwFlags) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %s, 0x%s, %p, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType), - wine_dbgstr_longlong(rtTime), prtNext, pParam, pStateData, dwFlags); - return S_OK; + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %s, 0x%s, %p, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType), + wine_dbgstr_longlong(rtTime), prtNext, pParam, pStateData, dwFlags); + return S_OK; }
static HRESULT WINAPI wave_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); - FIXME("(%p, %s, 0x%s, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType), - wine_dbgstr_longlong(rtTime), pParam, pStateData, dwFlags); - return S_OK; + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); + FIXME("(%p, %s, 0x%s, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType), + wine_dbgstr_longlong(rtTime), pParam, pStateData, dwFlags); + return S_OK; }
static HRESULT WINAPI wave_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **track) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface);
TRACE("(%p, %p, %ld, %p): method not implemented\n", This, context, trackgroup, track); return E_NOTIMPL; @@ -282,7 +282,7 @@ static HRESULT WINAPI wave_track_Compose(IDirectMusicTrack8 *iface, IUnknown *co static HRESULT WINAPI wave_track_Join(IDirectMusicTrack8 *iface, IDirectMusicTrack *newtrack, MUSIC_TIME join, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **resulttrack) { - IDirectMusicWaveTrack *This = impl_from_IDirectMusicTrack8(iface); + struct wave_track *This = impl_from_IDirectMusicTrack8(iface); TRACE("(%p, %p, %ld, %p, %ld, %p): method not implemented\n", This, newtrack, join, context, trackgroup, resulttrack); return E_NOTIMPL; @@ -368,8 +368,7 @@ error: return hr; }
-static HRESULT parse_wave_part(IDirectMusicWaveTrack *This, IStream *stream, - struct chunk_entry *wavp) +static HRESULT parse_wave_part(struct wave_track *This, IStream *stream, struct chunk_entry *wavp) { struct chunk_entry chunk = {.parent = wavp}; struct wave_part *part; @@ -417,7 +416,7 @@ error:
static HRESULT WINAPI wave_IPersistStream_Load(IPersistStream *iface, IStream *stream) { - IDirectMusicWaveTrack *This = impl_from_IPersistStream(iface); + struct wave_track *This = impl_from_IPersistStream(iface); struct chunk_entry wavt = {0}; struct chunk_entry chunk = {.parent = &wavt}; HRESULT hr; @@ -469,7 +468,7 @@ static const IPersistStreamVtbl persiststream_vtbl = { /* for ClassFactory */ HRESULT create_dmwavetrack(REFIID lpcGUID, void **ppobj) { - IDirectMusicWaveTrack *track; + struct wave_track *track; HRESULT hr;
*ppobj = NULL;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/audiopath.c | 1 - dlls/dmime/dmime_main.c | 1 - dlls/dmime/dmime_private.h | 2 ++ dlls/dmime/graph.c | 1 - dlls/dmime/lyricstrack.c | 1 - dlls/dmime/markertrack.c | 1 - dlls/dmime/paramcontroltrack.c | 1 - dlls/dmime/performance.c | 1 - dlls/dmime/segment.c | 1 - dlls/dmime/segmentstate.c | 1 - dlls/dmime/segtriggertrack.c | 1 - dlls/dmime/seqtrack.c | 1 - dlls/dmime/sysextrack.c | 1 - dlls/dmime/tempotrack.c | 1 - dlls/dmime/timesigtrack.c | 1 - dlls/dmime/wavetrack.c | 1 - 16 files changed, 2 insertions(+), 15 deletions(-)
diff --git a/dlls/dmime/audiopath.c b/dlls/dmime/audiopath.c index aef48a5d2db..3310624eb00 100644 --- a/dlls/dmime/audiopath.c +++ b/dlls/dmime/audiopath.c @@ -18,7 +18,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/dmime_main.c b/dlls/dmime/dmime_main.c index c0aa4e31cfb..89e70bcd1bd 100644 --- a/dlls/dmime/dmime_main.c +++ b/dlls/dmime/dmime_main.c @@ -34,7 +34,6 @@ #include "dmusici.h"
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/dmime_private.h b/dlls/dmime/dmime_private.h index e67797def30..94e0efbe771 100644 --- a/dlls/dmime/dmime_private.h +++ b/dlls/dmime/dmime_private.h @@ -42,6 +42,8 @@ #include "dmusics.h" #include "dmusicc.h"
+#include "dmobject.h" + /***************************************************************************** * Interfaces */ diff --git a/dlls/dmime/graph.c b/dlls/dmime/graph.c index d8f6bb88701..e0aa94833ae 100644 --- a/dlls/dmime/graph.c +++ b/dlls/dmime/graph.c @@ -18,7 +18,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/lyricstrack.c b/dlls/dmime/lyricstrack.c index a1b299e9a7c..f7da1132867 100644 --- a/dlls/dmime/lyricstrack.c +++ b/dlls/dmime/lyricstrack.c @@ -18,7 +18,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/markertrack.c b/dlls/dmime/markertrack.c index 460e708bc5d..8d36a4cdd01 100644 --- a/dlls/dmime/markertrack.c +++ b/dlls/dmime/markertrack.c @@ -18,7 +18,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/paramcontroltrack.c b/dlls/dmime/paramcontroltrack.c index 9d32484bfd7..4abcf614c3a 100644 --- a/dlls/dmime/paramcontroltrack.c +++ b/dlls/dmime/paramcontroltrack.c @@ -18,7 +18,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index 7d077db16cb..327f7d88c3b 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -20,7 +20,6 @@
#include "dmime_private.h" #include "wine/rbtree.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c index af7729f34b9..1194f81b09a 100644 --- a/dlls/dmime/segment.c +++ b/dlls/dmime/segment.c @@ -19,7 +19,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/segmentstate.c b/dlls/dmime/segmentstate.c index de47d85e9b8..1cb9daac69a 100644 --- a/dlls/dmime/segmentstate.c +++ b/dlls/dmime/segmentstate.c @@ -17,7 +17,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/segtriggertrack.c b/dlls/dmime/segtriggertrack.c index dc29ede4963..3f8e628b259 100644 --- a/dlls/dmime/segtriggertrack.c +++ b/dlls/dmime/segtriggertrack.c @@ -19,7 +19,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/seqtrack.c b/dlls/dmime/seqtrack.c index ae2f002da92..21b78ff26cd 100644 --- a/dlls/dmime/seqtrack.c +++ b/dlls/dmime/seqtrack.c @@ -17,7 +17,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/sysextrack.c b/dlls/dmime/sysextrack.c index f9c71abf08a..2c55d0dbe07 100644 --- a/dlls/dmime/sysextrack.c +++ b/dlls/dmime/sysextrack.c @@ -18,7 +18,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/tempotrack.c b/dlls/dmime/tempotrack.c index 6704448b71e..07f410118fe 100644 --- a/dlls/dmime/tempotrack.c +++ b/dlls/dmime/tempotrack.c @@ -19,7 +19,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime); WINE_DECLARE_DEBUG_CHANNEL(dmfile); diff --git a/dlls/dmime/timesigtrack.c b/dlls/dmime/timesigtrack.c index e98807b7503..0ebf5e4256e 100644 --- a/dlls/dmime/timesigtrack.c +++ b/dlls/dmime/timesigtrack.c @@ -18,7 +18,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
diff --git a/dlls/dmime/wavetrack.c b/dlls/dmime/wavetrack.c index 279cfb5c768..27e4d656163 100644 --- a/dlls/dmime/wavetrack.c +++ b/dlls/dmime/wavetrack.c @@ -17,7 +17,6 @@ */
#include "dmime_private.h" -#include "dmobject.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmusic/dmusic_private.h | 6 +----- dlls/dmusic/dmusic_wave.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 dlls/dmusic/dmusic_wave.h
diff --git a/dlls/dmusic/dmusic_private.h b/dlls/dmusic/dmusic_private.h index 2317ffa57c6..0bb3d5aaf83 100644 --- a/dlls/dmusic/dmusic_private.h +++ b/dlls/dmusic/dmusic_private.h @@ -42,6 +42,7 @@ #include "dmksctrl.h"
#include "dmobject.h" +#include "dmusic_wave.h"
/***************************************************************************** * Interfaces @@ -91,7 +92,6 @@ extern HRESULT DMUSIC_CreateReferenceClockImpl (LPCGUID lpcGUID, LPVOID* ppobj,
extern HRESULT download_create(DWORD size, IDirectMusicDownload **ret_iface);
-struct soundfont; extern HRESULT instrument_create_from_soundfont(struct soundfont *soundfont, UINT index, struct collection *collection, DMUS_OBJECTDESC *desc, IDirectMusicInstrument **ret_iface); extern HRESULT instrument_create_from_chunk(IStream *stream, struct chunk_entry *parent, @@ -100,10 +100,6 @@ extern HRESULT instrument_download_to_port(IDirectMusicInstrument *iface, IDirec IDirectMusicDownloadedInstrument **downloaded); extern HRESULT instrument_unload_from_port(IDirectMusicDownloadedInstrument *iface, IDirectMusicPortDownload *port);
-extern HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IUnknown **out); -extern HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IUnknown **out); -extern HRESULT wave_download_to_port(IUnknown *iface, IDirectMusicPortDownload *port, DWORD *id); - /***************************************************************************** * IDirectMusic8Impl implementation structure */ diff --git a/dlls/dmusic/dmusic_wave.h b/dlls/dmusic/dmusic_wave.h new file mode 100644 index 00000000000..0db0134ae17 --- /dev/null +++ b/dlls/dmusic/dmusic_wave.h @@ -0,0 +1,34 @@ +/* + * Copyright 2023 Rémi Bernon for CodeWeavers + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> +#include <stddef.h> + +#define COBJMACROS +#include "windef.h" +#include "winbase.h" + +#include "objbase.h" +#include "dmusici.h" + +struct soundfont; +struct chunk_entry; + +extern HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IUnknown **out); +extern HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IUnknown **out); +extern HRESULT wave_download_to_port(IUnknown *iface, IDirectMusicPortDownload *port, DWORD *id);
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=9027 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=34751 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45135 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48220 --- dlls/dmime/Makefile.in | 3 +- dlls/dmime/dmime_private.h | 3 + dlls/dmime/segment.c | 111 ++++++++++++++----------------------- dlls/dmime/tests/dmime.c | 2 +- dlls/dmime/wavetrack.c | 43 ++++++++++++-- dlls/dmusic/dmusic_wave.h | 1 + dlls/dmusic/wave.c | 7 +++ 7 files changed, 95 insertions(+), 75 deletions(-)
diff --git a/dlls/dmime/Makefile.in b/dlls/dmime/Makefile.in index ef4d0b9bee4..c60eb04d106 100644 --- a/dlls/dmime/Makefile.in +++ b/dlls/dmime/Makefile.in @@ -18,7 +18,8 @@ C_SRCS = \ sysextrack.c \ tempotrack.c \ timesigtrack.c \ - wavetrack.c + wavetrack.c \ + wave.c
IDL_SRCS = dmime.idl
diff --git a/dlls/dmime/dmime_private.h b/dlls/dmime/dmime_private.h index 94e0efbe771..636004aed84 100644 --- a/dlls/dmime/dmime_private.h +++ b/dlls/dmime/dmime_private.h @@ -77,6 +77,9 @@ extern HRESULT segment_state_create(IDirectMusicSegment *segment, MUSIC_TIME sta extern HRESULT segment_state_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance *performance); extern HRESULT segment_state_end_play(IDirectMusicSegmentState *iface);
+extern HRESULT wave_track_create_from_chunk(IStream *stream, struct chunk_entry *parent, + IDirectMusicTrack8 **ret_iface); + /***************************************************************************** * Auxiliary definitions */ diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c index 1194f81b09a..fc277ba73f9 100644 --- a/dlls/dmime/segment.c +++ b/dlls/dmime/segment.c @@ -741,13 +741,17 @@ static inline void dump_segment_header(DMUS_IO_SEGMENT_HEADER *h, DWORD size) } }
-static HRESULT parse_segment_form(struct segment *This, IStream *stream, const struct chunk_entry *riff) +static HRESULT parse_dmsg_chunk(struct segment *This, IStream *stream, const struct chunk_entry *riff) { struct chunk_entry chunk = {.parent = riff}; HRESULT hr;
TRACE("Parsing segment form in %p: %s\n", stream, debugstr_chunk(riff));
+ if (FAILED(hr = dmobj_parsedescriptor(stream, riff, &This->dmobj.desc, DMUS_OBJ_NAME | DMUS_OBJ_CATEGORY)) + || FAILED(hr = stream_reset_chunk_data(stream, riff))) + return hr; + while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) { switch (chunk.id) { case DMUS_FOURCC_SEGMENT_CHUNK: @@ -786,89 +790,58 @@ static inline struct segment *impl_from_IPersistStream(IPersistStream *iface) return CONTAINING_RECORD(iface, struct segment, dmobj.IPersistStream_iface); }
-static HRESULT parse_wave_form(struct segment *This, IStream *stream, const struct chunk_entry *riff) +static HRESULT WINAPI segment_persist_stream_Load(IPersistStream *iface, IStream *stream) { + struct segment *This = impl_from_IPersistStream(iface); + struct chunk_entry chunk = {0}; HRESULT hr; - struct chunk_entry chunk = {.parent = riff};
- TRACE("Parsing segment wave in %p: %s\n", stream, debugstr_chunk(riff)); + TRACE("(%p, %p): Loading\n", This, stream);
- while ((hr = stream_next_chunk(stream, &chunk)) == S_OK) { - switch (chunk.id) { - case mmioFOURCC('f','m','t',' '): { - if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &This->wave_format, - sizeof(This->wave_format))) ) - return hr; - TRACE("Wave Format tag %d\n", This->wave_format.wf.wFormatTag); - break; - } - case mmioFOURCC('d','a','t','a'): { - TRACE("Wave Data size %lu\n", chunk.size); - if (This->wave_data) - ERR("Multiple data streams detected\n"); - This->wave_data = malloc(chunk.size); - This->data_size = chunk.size; - if (!This->wave_data) - return E_OUTOFMEMORY; - if (FAILED(hr = stream_chunk_get_data(stream, &chunk, This->wave_data, chunk.size))) - return hr; - break; - } - case FOURCC_LIST: { - FIXME("Skipping LIST tag\n"); - break; - } - case mmioFOURCC('I','S','F','T'): { - FIXME("Skipping ISFT tag\n"); - break; - } - case mmioFOURCC('f','a','c','t'): { - FIXME("Skipping fact tag\n"); - break; - } - } - } + if (!stream) return E_POINTER;
- return SUCCEEDED(hr) ? S_OK : hr; -} + if ((hr = stream_get_chunk(stream, &chunk)) == S_OK) + { + switch (MAKE_IDTYPE(chunk.id, chunk.type)) + { + case MAKE_IDTYPE(FOURCC_RIFF, DMUS_FOURCC_SEGMENT_FORM): + hr = parse_dmsg_chunk(This, stream, &chunk); + break;
-static HRESULT WINAPI segment_persist_stream_Load(IPersistStream *iface, IStream *stream) -{ - struct segment *This = impl_from_IPersistStream(iface); - struct chunk_entry riff = {0}; - HRESULT hr; + case mmioFOURCC('M','T','h','d'): + FIXME("MIDI file loading not supported\n"); + break;
- TRACE("(%p, %p): Loading\n", This, stream); + case MAKE_IDTYPE(FOURCC_RIFF, mmioFOURCC('W','A','V','E')): + { + IDirectMusicTrack8 *track; + HRESULT hr;
- if (!stream) - return E_POINTER; + TRACE("Loading segment %p from wave file\n", This);
- if (stream_get_chunk(stream, &riff) != S_OK || - (riff.id != FOURCC_RIFF && riff.id != mmioFOURCC('M','T','h','d'))) - return DMUS_E_UNSUPPORTED_STREAM; - stream_reset_chunk_start(stream, &riff); + This->header.mtLength = 1; + if (FAILED(hr = wave_track_create_from_chunk(stream, &chunk, &track))) break; + hr = segment_append_track(This, (IDirectMusicTrack *)track, 1, 0); + break; + }
- if (riff.id == mmioFOURCC('M','T','h','d')) { - FIXME("MIDI file loading not supported\n"); - return S_OK; + default: + WARN("Invalid segment chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type)); + hr = DMUS_E_UNSUPPORTED_STREAM; + break; + } }
- hr = IDirectMusicObject_ParseDescriptor(&This->dmobj.IDirectMusicObject_iface, stream, - &This->dmobj.desc); if (FAILED(hr)) - return hr; - stream_reset_chunk_data(stream, &riff); - - if (riff.type == DMUS_FOURCC_SEGMENT_FORM) - hr = parse_segment_form(This, stream, &riff); - else if(riff.type == mmioFOURCC('W','A','V','E')) - hr = parse_wave_form(This, stream, &riff); - else { - FIXME("Unknown type %s\n", debugstr_chunk(&riff)); - hr = S_OK; + { + WARN("Failed to load segment from stream %p, hr %#lx\n", stream, hr); + return DMUS_E_UNSUPPORTED_STREAM; }
- return hr; + This->dmobj.desc.guidClass = CLSID_DirectMusicSegment; + This->dmobj.desc.dwValidData |= DMUS_OBJ_CLASS; + + return S_OK; }
static const IPersistStreamVtbl segment_persist_stream_vtbl = diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index cb35ef64ead..8468ee50dda 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -3279,7 +3279,7 @@ static void test_wave_pmsg(void) length = 0xdeadbeef; hr = IDirectMusicSegment_GetLength(segment, &length); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(length == 1, "got %lu\n", length); + ok(length == 1, "got %lu\n", length);
/* without Download, no DMUS_PMSGT_WAVE is sent */ diff --git a/dlls/dmime/wavetrack.c b/dlls/dmime/wavetrack.c index 27e4d656163..d9d6334adad 100644 --- a/dlls/dmime/wavetrack.c +++ b/dlls/dmime/wavetrack.c @@ -17,13 +17,14 @@ */
#include "dmime_private.h" +#include "dmusic_wave.h"
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
struct wave_item { struct list entry; DMUS_IO_WAVE_ITEM_HEADER header; - IDirectMusicObject *object; + IUnknown *object; };
struct wave_part { @@ -100,8 +101,7 @@ static ULONG WINAPI wave_track_Release(IDirectMusicTrack8 *iface) list_remove(&part->entry); LIST_FOR_EACH_ENTRY_SAFE(item, item2, &part->items, struct wave_item, entry) { list_remove(&item->entry); - if (item->object) - IDirectMusicObject_Release(item->object); + if (item->object) IUnknown_Release(item->object); free(item); } free(part); @@ -355,7 +355,7 @@ static HRESULT parse_wave_item(struct wave_part *part, IStream *stream, struct c hr = DMUS_E_UNSUPPORTED_STREAM; goto error; } - if (FAILED(hr = dmobj_parsereference(stream, &chunk, &item->object))) + if (FAILED(hr = dmobj_parsereference(stream, &chunk, (IDirectMusicObject **)&item->object))) goto error;
list_add_tail(&part->items, &item->entry); @@ -484,3 +484,38 @@ HRESULT create_dmwavetrack(REFIID lpcGUID, void **ppobj)
return hr; } + +HRESULT wave_track_create_from_chunk(IStream *stream, struct chunk_entry *parent, + IDirectMusicTrack8 **ret_iface) +{ + IDirectMusicTrack8 *iface; + struct wave_track *This; + struct wave_item *item; + struct wave_part *part; + HRESULT hr; + + if (FAILED(hr = create_dmwavetrack(&IID_IDirectMusicTrack8, (void **)&iface))) return hr; + This = impl_from_IDirectMusicTrack8(iface); + + if (!(part = calloc(1, sizeof(*part)))) + { + IDirectMusicTrack8_Release(iface); + return E_OUTOFMEMORY; + } + list_init(&part->items); + list_add_tail(&This->parts, &part->entry); + + if (!(item = calloc(1, sizeof(*item))) + || FAILED(hr = wave_create_from_chunk(stream, parent, &item->object))) + { + IDirectMusicTrack8_Release(iface); + free(item); + return hr; + } + if (FAILED(hr = wave_get_duration(item->object, &item->header.rtDuration))) + WARN("Failed to get wave duration, hr %#lx\n", hr); + list_add_tail(&part->items, &item->entry); + + *ret_iface = iface; + return S_OK; +} diff --git a/dlls/dmusic/dmusic_wave.h b/dlls/dmusic/dmusic_wave.h index 0db0134ae17..3f7209e250e 100644 --- a/dlls/dmusic/dmusic_wave.h +++ b/dlls/dmusic/dmusic_wave.h @@ -32,3 +32,4 @@ struct chunk_entry; extern HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IUnknown **out); extern HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IUnknown **out); extern HRESULT wave_download_to_port(IUnknown *iface, IDirectMusicPortDownload *port, DWORD *id); +extern HRESULT wave_get_duration(IUnknown *iface, REFERENCE_TIME *duration); diff --git a/dlls/dmusic/wave.c b/dlls/dmusic/wave.c index 40a8c9e129f..2f5e1409106 100644 --- a/dlls/dmusic/wave.c +++ b/dlls/dmusic/wave.c @@ -338,3 +338,10 @@ HRESULT wave_download_to_port(IUnknown *iface, IDirectMusicPortDownload *port, D IDirectMusicDownload_Release(download); return hr; } + +HRESULT wave_get_duration(IUnknown *iface, REFERENCE_TIME *duration) +{ + struct wave *This = impl_from_IUnknown(iface); + *duration = (REFERENCE_TIME)This->data_size * 10000000 / This->format->nAvgBytesPerSec; + return S_OK; +}
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=9027 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=34751 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45135 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48220 --- dlls/dmime/dmime_private.h | 2 ++ dlls/dmime/performance.c | 14 ++++++++ dlls/dmime/wavetrack.c | 70 +++++++++++++++++++++++++++++++++----- dlls/dmusic/dmusic_wave.h | 1 + dlls/dmusic/wave.c | 39 +++++++++++++++++++++ 5 files changed, 118 insertions(+), 8 deletions(-)
diff --git a/dlls/dmime/dmime_private.h b/dlls/dmime/dmime_private.h index 636004aed84..c1f777f3949 100644 --- a/dlls/dmime/dmime_private.h +++ b/dlls/dmime/dmime_private.h @@ -80,6 +80,8 @@ extern HRESULT segment_state_end_play(IDirectMusicSegmentState *iface); extern HRESULT wave_track_create_from_chunk(IStream *stream, struct chunk_entry *parent, IDirectMusicTrack8 **ret_iface);
+extern HRESULT performance_get_dsound(IDirectMusicPerformance8 *iface, IDirectSound **dsound); + /***************************************************************************** * Auxiliary definitions */ diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index 327f7d88c3b..84b4b4b8575 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -1731,3 +1731,17 @@ HRESULT create_dmperformance(REFIID iid, void **ret_iface) IDirectMusicPerformance_Release(&obj->IDirectMusicPerformance8_iface); return hr; } + +static inline struct performance *unsafe_impl_from_IDirectMusicPerformance8(IDirectMusicPerformance8 *iface) +{ + if (iface->lpVtbl != &performance_vtbl) return NULL; + return CONTAINING_RECORD(iface, struct performance, IDirectMusicPerformance8_iface); +} + +HRESULT performance_get_dsound(IDirectMusicPerformance8 *iface, IDirectSound **dsound) +{ + struct performance *This = unsafe_impl_from_IDirectMusicPerformance8(iface); + if (!This || !(*dsound = This->dsound)) return E_FAIL; + IDirectSound_AddRef(*dsound); + return S_OK; +} diff --git a/dlls/dmime/wavetrack.c b/dlls/dmime/wavetrack.c index d9d6334adad..7c72065520a 100644 --- a/dlls/dmime/wavetrack.c +++ b/dlls/dmime/wavetrack.c @@ -25,6 +25,7 @@ struct wave_item { struct list entry; DMUS_IO_WAVE_ITEM_HEADER header; IUnknown *object; + IDirectSoundBuffer *buffer; };
struct wave_part { @@ -97,13 +98,18 @@ static ULONG WINAPI wave_track_Release(IDirectMusicTrack8 *iface) struct wave_item *item, *item2; struct wave_part *part, *part2;
- LIST_FOR_EACH_ENTRY_SAFE(part, part2, &This->parts, struct wave_part, entry) { + LIST_FOR_EACH_ENTRY_SAFE(part, part2, &This->parts, struct wave_part, entry) + { list_remove(&part->entry); - LIST_FOR_EACH_ENTRY_SAFE(item, item2, &part->items, struct wave_item, entry) { + + LIST_FOR_EACH_ENTRY_SAFE(item, item2, &part->items, struct wave_item, entry) + { list_remove(&item->entry); + if (item->buffer) IDirectSoundBuffer_Release(item->buffer); if (item->object) IUnknown_Release(item->object); free(item); } + free(part); }
@@ -171,9 +177,46 @@ static HRESULT WINAPI wave_track_SetParam(IDirectMusicTrack8 *iface, REFGUID typ FIXME("GUID_Download not handled yet\n"); return S_OK; } - if (IsEqualGUID(type, &GUID_DownloadToAudioPath)) { - FIXME("GUID_DownloadToAudioPath not handled yet\n"); - return S_OK; + if (IsEqualGUID(type, &GUID_DownloadToAudioPath)) + { + IDirectMusicPerformance8 *performance; + IDirectMusicAudioPath *audio_path; + IUnknown *object = param; + struct wave_part *part; + struct wave_item *item; + IDirectSound *dsound; + HRESULT hr; + + if (FAILED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicPerformance8, (void **)&performance)) + && SUCCEEDED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicAudioPath, (void **)&audio_path))) + { + hr = IDirectMusicAudioPath_GetObjectInPath(audio_path, DMUS_PCHANNEL_ALL, DMUS_PATH_PERFORMANCE, 0, + &GUID_All_Objects, 0, &IID_IDirectMusicPerformance8, (void **)&performance); + IDirectMusicAudioPath_Release(audio_path); + } + + if (SUCCEEDED(hr)) + hr = performance_get_dsound(performance, &dsound); + IDirectMusicPerformance_Release(performance); + + if (FAILED(hr)) + { + WARN("Failed to get direct sound from param %p, hr %#lx\n", param, hr); + return hr; + } + + LIST_FOR_EACH_ENTRY(part, &This->parts, struct wave_part, entry) + { + LIST_FOR_EACH_ENTRY(item, &part->items, struct wave_item, entry) + { + if (item->buffer) continue; + if (FAILED(hr = wave_download_to_dsound(item->object, dsound, &item->buffer))) + { + WARN("Failed to download wave %p to direct sound, hr %#lx\n", item->object, hr); + return hr; + } + } + } } if (IsEqualGUID(type, &GUID_Enable_Auto_Download)) { FIXME("GUID_Enable_Auto_Download not handled yet\n"); @@ -183,9 +226,20 @@ static HRESULT WINAPI wave_track_SetParam(IDirectMusicTrack8 *iface, REFGUID typ FIXME("GUID_Unload not handled yet\n"); return S_OK; } - if (IsEqualGUID(type, &GUID_UnloadFromAudioPath)) { - FIXME("GUID_UnloadFromAudioPath not handled yet\n"); - return S_OK; + if (IsEqualGUID(type, &GUID_UnloadFromAudioPath)) + { + struct wave_part *part; + struct wave_item *item; + + LIST_FOR_EACH_ENTRY(part, &This->parts, struct wave_part, entry) + { + LIST_FOR_EACH_ENTRY(item, &part->items, struct wave_item, entry) + { + if (!item->buffer) continue; + IDirectSoundBuffer_Release(item->buffer); + item->buffer = NULL; + } + } }
return DMUS_E_TYPE_UNSUPPORTED; diff --git a/dlls/dmusic/dmusic_wave.h b/dlls/dmusic/dmusic_wave.h index 3f7209e250e..43396250261 100644 --- a/dlls/dmusic/dmusic_wave.h +++ b/dlls/dmusic/dmusic_wave.h @@ -32,4 +32,5 @@ struct chunk_entry; extern HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IUnknown **out); extern HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IUnknown **out); extern HRESULT wave_download_to_port(IUnknown *iface, IDirectMusicPortDownload *port, DWORD *id); +extern HRESULT wave_download_to_dsound(IUnknown *iface, IDirectSound *dsound, IDirectSoundBuffer **ret_iface); extern HRESULT wave_get_duration(IUnknown *iface, REFERENCE_TIME *duration); diff --git a/dlls/dmusic/wave.c b/dlls/dmusic/wave.c index 2f5e1409106..ef1cd2990ff 100644 --- a/dlls/dmusic/wave.c +++ b/dlls/dmusic/wave.c @@ -339,6 +339,45 @@ HRESULT wave_download_to_port(IUnknown *iface, IDirectMusicPortDownload *port, D return hr; }
+HRESULT wave_download_to_dsound(IUnknown *iface, IDirectSound *dsound, IDirectSoundBuffer **ret_iface) +{ + struct wave *This = impl_from_IUnknown(iface); + DSBUFFERDESC desc = + { + .dwSize = sizeof(desc), + .dwBufferBytes = This->data_size, + .lpwfxFormat = This->format, + }; + IDirectSoundBuffer *buffer; + HRESULT hr; + void *data; + DWORD size; + + TRACE("%p, %p, %p\n", This, dsound, ret_iface); + + if (FAILED(hr = IDirectSound_CreateSoundBuffer(dsound, &desc, &buffer, NULL))) + { + WARN("Failed to create direct sound buffer, hr %#lx\n", hr); + return hr; + } + + if (SUCCEEDED(hr = IDirectSoundBuffer_Lock(buffer, 0, This->data_size, &data, &size, NULL, 0, 0))) + { + memcpy(data, This->data, This->data_size); + hr = IDirectSoundBuffer_Unlock(buffer, data, This->data_size, NULL, 0); + } + + if (FAILED(hr)) + { + WARN("Failed to download wave to dsound, hr %#lx\n", hr); + IDirectSoundBuffer_Release(buffer); + return hr; + } + + *ret_iface = buffer; + return S_OK; +} + HRESULT wave_get_duration(IUnknown *iface, REFERENCE_TIME *duration) { struct wave *This = impl_from_IUnknown(iface);
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=9027 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=34751 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45135 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48220 --- dlls/dmime/performance.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index 84b4b4b8575..2018fa013de 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -1631,6 +1631,7 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, { struct performance *This = impl_from_IDirectMusicTool(iface); struct message *message = message_from_DMUS_PMSG(msg); + HRESULT hr;
FIXME("(%p, %p, %p): semi-stub\n", This, performance, msg);
@@ -1641,7 +1642,6 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, DMUS_NOTIFICATION_PMSG *notif = (DMUS_NOTIFICATION_PMSG *)msg; struct message *previous; BOOL enabled = FALSE; - HRESULT hr;
if (IsEqualGUID(¬if->guidNotificationType, &GUID_NOTIFICATION_SEGMENT) && notif->dwNotificationOption == DMUS_NOTIFICATION_SEGEND) @@ -1671,6 +1671,11 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, return S_OK; }
+ case DMUS_PMSGT_WAVE: + if (FAILED(hr = IDirectSoundBuffer_Play((IDirectSoundBuffer *)msg->punkUser, 0, 0, 0))) + WARN("Failed to play wave buffer, hr %#lx\n", hr); + break; + default: FIXME("Unhandled message type %#lx\n", msg->dwType); break;
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=9027 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=34751 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45135 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48220 --- dlls/dmime/tests/dmime.c | 8 +---- dlls/dmime/wavetrack.c | 68 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 13 deletions(-)
diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index 8468ee50dda..fff9cc4e601 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -3320,8 +3320,6 @@ static void test_wave_pmsg(void)
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&wave); ok(!ret, "got %#lx\n", ret); - if (wave->dwType == DMUS_PMSGT_WAVE) - { ok(wave->dwType == DMUS_PMSGT_WAVE, "got %p\n", wave); ok(!!wave->punkUser, "got %p\n", wave->punkUser); ok(wave->rtStartOffset == 0, "got %I64d\n", wave->rtStartOffset); @@ -3330,18 +3328,14 @@ static void test_wave_pmsg(void) ok(wave->lVolume == 0, "got %lu\n", wave->lVolume); ok(wave->lPitch == 0, "got %lu\n", wave->lPitch); ok(wave->bFlags == 0, "got %#x\n", wave->bFlags); - } hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)wave); 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 %p\n", msg); hr = IDirectMusicPerformance_FreePMsg(performance, msg); ok(hr == S_OK, "got %#lx\n", hr); - }
hr = IDirectMusicSegment8_Unload((IDirectMusicSegment8 *)segment, (IUnknown *)performance); ok(hr == S_OK, "got %#lx\n", hr); diff --git a/dlls/dmime/wavetrack.c b/dlls/dmime/wavetrack.c index 7c72065520a..def1e59fb23 100644 --- a/dlls/dmime/wavetrack.c +++ b/dlls/dmime/wavetrack.c @@ -143,14 +143,70 @@ static HRESULT WINAPI wave_track_EndPlay(IDirectMusicTrack8 *iface, void *pState return S_OK; }
-static HRESULT WINAPI wave_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 wave_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 wave_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; + LONG volume = This->header.lVolume; + IDirectMusicGraph *graph; + struct wave_part *part; + struct wave_item *item; + HRESULT hr; + + 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; + + LIST_FOR_EACH_ENTRY(part, &This->parts, struct wave_part, entry) + { + volume += part->header.lVolume; + + LIST_FOR_EACH_ENTRY(item, &part->items, struct wave_item, entry) + { + DMUS_WAVE_PMSG *msg; + + if (!item->buffer) continue; + + if (FAILED(hr = IDirectMusicPerformance_AllocPMsg(performance, sizeof(*msg), + (DMUS_PMSG **)&msg))) + break; + + msg->mtTime = item->header.rtTime; + msg->dwFlags = DMUS_PMSGF_MUSICTIME; + msg->dwPChannel = part->header.dwPChannel; + msg->dwVirtualTrackID = track_id; + msg->dwType = DMUS_PMSGT_WAVE; + msg->punkUser = (IUnknown *)item->buffer; + IDirectSoundBuffer_AddRef(item->buffer); + + msg->rtStartOffset = item->header.rtStartOffset; + msg->rtDuration = item->header.rtDuration; + msg->lVolume = volume + item->header.lVolume; + msg->lPitch = item->header.lPitch; + + if (FAILED(hr = IDirectMusicGraph_StampPMsg(graph, (DMUS_PMSG *)msg)) + || FAILED(hr = IDirectMusicPerformance_SendPMsg(performance, (DMUS_PMSG *)msg))) + { + IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)msg); + break; + } + } + + volume -= part->header.lVolume; + } + + IDirectMusicGraph_Release(graph); + return hr; }
static HRESULT WINAPI wave_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time,
This merge request was approved by Michael Stefaniuc.