server: Define a generic context structure instead of using the platform-specific...
[wine] / dlls / dmime / wavetrack.c
CommitLineData
df167d17
RM
1/* IDirectMusicWaveTrack Implementation
2 *
0382ea1d 3 * Copyright (C) 2003-2004 Rok Mandeljc
df167d17 4 *
7718d2bd
AJ
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
df167d17
RM
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7718d2bd
AJ
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
df167d17 14 *
7718d2bd
AJ
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
df167d17
RM
18 */
19
df167d17
RM
20#include "dmime_private.h"
21
22WINE_DEFAULT_DEBUG_CHANNEL(dmime);
df167d17
RM
23
24/*****************************************************************************
25 * IDirectMusicWaveTrack implementation
26 */
27/* IDirectMusicWaveTrack IUnknown part: */
06e23dad 28static HRESULT WINAPI IDirectMusicWaveTrack_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) {
0382ea1d 29 ICOM_THIS_MULTI(IDirectMusicWaveTrack, UnknownVtbl, iface);
b26d65bb 30 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
df167d17 31
0382ea1d 32 if (IsEqualIID (riid, &IID_IUnknown)) {
49177a09 33 *ppobj = &This->UnknownVtbl;
06e23dad 34 IUnknown_AddRef (iface);
0382ea1d
RM
35 return S_OK;
36 } else if (IsEqualIID (riid, &IID_IDirectMusicTrack)
37 || IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
38 *ppobj = (LPDIRECTMUSICTRACK8)&This->TrackVtbl;
06e23dad 39 IUnknown_AddRef (iface);
df167d17
RM
40 return S_OK;
41 } else if (IsEqualIID (riid, &IID_IPersistStream)) {
49177a09 42 *ppobj = &This->PersistStreamVtbl;
06e23dad 43 IUnknown_AddRef (iface);
df167d17
RM
44 return S_OK;
45 }
46
b26d65bb 47 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj);
df167d17
RM
48 return E_NOINTERFACE;
49}
50
06e23dad 51static ULONG WINAPI IDirectMusicWaveTrack_IUnknown_AddRef (LPUNKNOWN iface) {
0382ea1d 52 ICOM_THIS_MULTI(IDirectMusicWaveTrack, UnknownVtbl, iface);
3da8524b
PV
53 ULONG ref = InterlockedIncrement(&This->ref);
54
891e0166 55 TRACE("(%p) : AddRef from %d\n", This, ref - 1);
3da8524b 56
1727eb48
JH
57 DMIME_LockModule();
58
3da8524b 59 return ref;
df167d17
RM
60}
61
ff536fbe 62static ULONG WINAPI IDirectMusicWaveTrack_IUnknown_Release (LPUNKNOWN iface) {
0382ea1d 63 ICOM_THIS_MULTI(IDirectMusicWaveTrack, UnknownVtbl, iface);
3da8524b 64 ULONG ref = InterlockedDecrement(&This->ref);
891e0166 65 TRACE("(%p) : ReleaseRef to %d\n", This, ref);
1727eb48 66
df167d17
RM
67 if (ref == 0) {
68 HeapFree(GetProcessHeap(), 0, This);
69 }
1727eb48
JH
70
71 DMIME_UnlockModule();
72
df167d17
RM
73 return ref;
74}
75
247246ed 76static const IUnknownVtbl DirectMusicWaveTrack_Unknown_Vtbl = {
0382ea1d
RM
77 IDirectMusicWaveTrack_IUnknown_QueryInterface,
78 IDirectMusicWaveTrack_IUnknown_AddRef,
79 IDirectMusicWaveTrack_IUnknown_Release
80};
df167d17 81
0382ea1d 82/* IDirectMusicWaveTrack IDirectMusicTrack8 part: */
06e23dad 83static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_QueryInterface (LPDIRECTMUSICTRACK8 iface, REFIID riid, LPVOID *ppobj) {
0382ea1d 84 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
06e23dad 85 return IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
0382ea1d 86}
df167d17 87
06e23dad 88static ULONG WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_AddRef (LPDIRECTMUSICTRACK8 iface) {
0382ea1d 89 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
06e23dad 90 return IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
df167d17
RM
91}
92
ff536fbe 93static ULONG WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_Release (LPDIRECTMUSICTRACK8 iface) {
0382ea1d 94 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
06e23dad 95 return IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
0382ea1d
RM
96}
97
ff536fbe 98static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_Init (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegment* pSegment)
df167d17 99{
0382ea1d
RM
100 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
101 FIXME("(%p, %p): stub\n", This, pSegment);
102 return S_OK;
103}
df167d17 104
ff536fbe 105static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_InitPlay (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegmentState* pSegmentState, IDirectMusicPerformance* pPerformance, void** ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
0382ea1d
RM
106{
107 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
891e0166 108 FIXME("(%p, %p, %p, %p, %d, %d): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
df167d17
RM
109 return S_OK;
110}
111
ff536fbe 112static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_EndPlay (LPDIRECTMUSICTRACK8 iface, void* pStateData)
df167d17 113{
0382ea1d 114 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
df167d17 115 FIXME("(%p, %p): stub\n", This, pStateData);
df167d17
RM
116 return S_OK;
117}
118
ff536fbe 119static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_Play (LPDIRECTMUSICTRACK8 iface, void* pStateData, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt, DWORD dwVirtualID)
df167d17 120{
0382ea1d 121 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
4bfb33ec 122 FIXME("(%p, %p, %d, %d, %d, %d, %p, %p, %d): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
df167d17
RM
123 return S_OK;
124}
125
ff536fbe 126static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_GetParam (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, MUSIC_TIME mtTime, MUSIC_TIME* pmtNext, void* pParam) {
0382ea1d 127 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
4bfb33ec 128 FIXME("(%p, %s, %d, %p, %p): stub\n", This, debugstr_dmguid(rguidType), mtTime, pmtNext, pParam);
df167d17
RM
129 return S_OK;
130}
131
ff536fbe 132static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_SetParam (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, MUSIC_TIME mtTime, void* pParam) {
0382ea1d 133 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
4bfb33ec 134 FIXME("(%p, %s, %d, %p): stub\n", This, debugstr_dmguid(rguidType), mtTime, pParam);
df167d17
RM
135 return S_OK;
136}
137
ff536fbe 138static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_IsParamSupported (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType) {
0382ea1d 139 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
df167d17 140
3f191fda 141 TRACE("(%p, %s)\n", This, debugstr_dmguid(rguidType));
df167d17
RM
142 if (IsEqualGUID (rguidType, &GUID_Disable_Auto_Download)
143 || IsEqualGUID (rguidType, &GUID_Download)
144 || IsEqualGUID (rguidType, &GUID_DownloadToAudioPath)
145 || IsEqualGUID (rguidType, &GUID_Enable_Auto_Download)) {
146 TRACE("param supported\n");
147 return S_OK;
0382ea1d 148 }
df167d17
RM
149 TRACE("param unsupported\n");
150 return DMUS_E_TYPE_UNSUPPORTED;
151}
152
ff536fbe 153static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_AddNotificationType (LPDIRECTMUSICTRACK8 iface, REFGUID rguidNotificationType) {
0382ea1d 154 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
b26d65bb 155 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
df167d17
RM
156 return S_OK;
157}
158
ff536fbe 159static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_RemoveNotificationType (LPDIRECTMUSICTRACK8 iface, REFGUID rguidNotificationType) {
0382ea1d 160 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
b26d65bb 161 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
df167d17
RM
162 return S_OK;
163}
164
ff536fbe 165static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_Clone (LPDIRECTMUSICTRACK8 iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack** ppTrack) {
0382ea1d 166 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
4bfb33ec 167 FIXME("(%p, %d, %d, %p): stub\n", This, mtStart, mtEnd, ppTrack);
df167d17
RM
168 return S_OK;
169}
170
ff536fbe 171static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_PlayEx (LPDIRECTMUSICTRACK8 iface, void* pStateData, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt, DWORD dwVirtualID) {
0382ea1d 172 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
891e0166 173 FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %d, %p, %p, %d): stub\n", This, pStateData, wine_dbgstr_longlong(rtStart),
7262a86c 174 wine_dbgstr_longlong(rtEnd), wine_dbgstr_longlong(rtOffset), dwFlags, pPerf, pSegSt, dwVirtualID);
df167d17
RM
175 return S_OK;
176}
177
ff536fbe 178static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_GetParamEx (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME* prtNext, void* pParam, void* pStateData, DWORD dwFlags) {
0382ea1d 179 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
891e0166 180 FIXME("(%p, %s, 0x%s, %p, %p, %p, %d): stub\n", This, debugstr_dmguid(rguidType),
7262a86c 181 wine_dbgstr_longlong(rtTime), prtNext, pParam, pStateData, dwFlags);
df167d17
RM
182 return S_OK;
183}
184
ff536fbe 185static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_SetParamEx (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, REFERENCE_TIME rtTime, void* pParam, void* pStateData, DWORD dwFlags) {
0382ea1d 186 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
891e0166 187 FIXME("(%p, %s, 0x%s, %p, %p, %d): stub\n", This, debugstr_dmguid(rguidType),
7262a86c 188 wine_dbgstr_longlong(rtTime), pParam, pStateData, dwFlags);
df167d17
RM
189 return S_OK;
190}
191
ff536fbe 192static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_Compose (LPDIRECTMUSICTRACK8 iface, IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack) {
0382ea1d 193 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
891e0166 194 FIXME("(%p, %p, %d, %p): stub\n", This, pContext, dwTrackGroup, ppResultTrack);
df167d17
RM
195 return S_OK;
196}
197
ff536fbe 198static HRESULT WINAPI IDirectMusicWaveTrack_IDirectMusicTrack_Join (LPDIRECTMUSICTRACK8 iface, IDirectMusicTrack* pNewTrack, MUSIC_TIME mtJoin, IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack) {
0382ea1d 199 ICOM_THIS_MULTI(IDirectMusicWaveTrack, TrackVtbl, iface);
4bfb33ec 200 FIXME("(%p, %p, %d, %p, %d, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack);
df167d17
RM
201 return S_OK;
202}
203
247246ed 204static const IDirectMusicTrack8Vtbl DirectMusicWaveTrack_Track_Vtbl = {
0382ea1d
RM
205 IDirectMusicWaveTrack_IDirectMusicTrack_QueryInterface,
206 IDirectMusicWaveTrack_IDirectMusicTrack_AddRef,
207 IDirectMusicWaveTrack_IDirectMusicTrack_Release,
208 IDirectMusicWaveTrack_IDirectMusicTrack_Init,
209 IDirectMusicWaveTrack_IDirectMusicTrack_InitPlay,
210 IDirectMusicWaveTrack_IDirectMusicTrack_EndPlay,
211 IDirectMusicWaveTrack_IDirectMusicTrack_Play,
212 IDirectMusicWaveTrack_IDirectMusicTrack_GetParam,
213 IDirectMusicWaveTrack_IDirectMusicTrack_SetParam,
214 IDirectMusicWaveTrack_IDirectMusicTrack_IsParamSupported,
215 IDirectMusicWaveTrack_IDirectMusicTrack_AddNotificationType,
216 IDirectMusicWaveTrack_IDirectMusicTrack_RemoveNotificationType,
217 IDirectMusicWaveTrack_IDirectMusicTrack_Clone,
218 IDirectMusicWaveTrack_IDirectMusicTrack_PlayEx,
219 IDirectMusicWaveTrack_IDirectMusicTrack_GetParamEx,
220 IDirectMusicWaveTrack_IDirectMusicTrack_SetParamEx,
221 IDirectMusicWaveTrack_IDirectMusicTrack_Compose,
222 IDirectMusicWaveTrack_IDirectMusicTrack_Join
df167d17
RM
223};
224
0382ea1d 225/* IDirectMusicWaveTrack IPersistStream part: */
06e23dad 226static HRESULT WINAPI IDirectMusicWaveTrack_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) {
0382ea1d 227 ICOM_THIS_MULTI(IDirectMusicWaveTrack, PersistStreamVtbl, iface);
06e23dad 228 return IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
df167d17
RM
229}
230
06e23dad 231static ULONG WINAPI IDirectMusicWaveTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface) {
0382ea1d 232 ICOM_THIS_MULTI(IDirectMusicWaveTrack, PersistStreamVtbl, iface);
06e23dad 233 return IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
df167d17
RM
234}
235
ff536fbe 236static ULONG WINAPI IDirectMusicWaveTrack_IPersistStream_Release (LPPERSISTSTREAM iface) {
0382ea1d 237 ICOM_THIS_MULTI(IDirectMusicWaveTrack, PersistStreamVtbl, iface);
06e23dad 238 return IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
df167d17
RM
239}
240
ff536fbe 241static HRESULT WINAPI IDirectMusicWaveTrack_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) {
df167d17
RM
242 return E_NOTIMPL;
243}
244
ff536fbe 245static HRESULT WINAPI IDirectMusicWaveTrack_IPersistStream_IsDirty (LPPERSISTSTREAM iface) {
df167d17
RM
246 return E_NOTIMPL;
247}
248
ff536fbe 249static HRESULT WINAPI IDirectMusicWaveTrack_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) {
df167d17
RM
250 FIXME(": Loading not implemented yet\n");
251 return S_OK;
252}
253
ff536fbe 254static HRESULT WINAPI IDirectMusicWaveTrack_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) {
df167d17
RM
255 return E_NOTIMPL;
256}
257
ff536fbe 258static HRESULT WINAPI IDirectMusicWaveTrack_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) {
df167d17
RM
259 return E_NOTIMPL;
260}
261
247246ed 262static const IPersistStreamVtbl DirectMusicWaveTrack_PersistStream_Vtbl = {
0382ea1d
RM
263 IDirectMusicWaveTrack_IPersistStream_QueryInterface,
264 IDirectMusicWaveTrack_IPersistStream_AddRef,
265 IDirectMusicWaveTrack_IPersistStream_Release,
266 IDirectMusicWaveTrack_IPersistStream_GetClassID,
267 IDirectMusicWaveTrack_IPersistStream_IsDirty,
268 IDirectMusicWaveTrack_IPersistStream_Load,
269 IDirectMusicWaveTrack_IPersistStream_Save,
270 IDirectMusicWaveTrack_IPersistStream_GetSizeMax
df167d17 271};
0382ea1d
RM
272
273/* for ClassFactory */
274HRESULT WINAPI DMUSIC_CreateDirectMusicWaveTrack (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter) {
275 IDirectMusicWaveTrack* track;
276
277 track = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicWaveTrack));
278 if (NULL == track) {
ee0344a4 279 *ppobj = NULL;
0382ea1d
RM
280 return E_OUTOFMEMORY;
281 }
282 track->UnknownVtbl = &DirectMusicWaveTrack_Unknown_Vtbl;
283 track->TrackVtbl = &DirectMusicWaveTrack_Track_Vtbl;
284 track->PersistStreamVtbl = &DirectMusicWaveTrack_PersistStream_Vtbl;
285 track->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC));
286 DM_STRUCT_INIT(track->pDesc);
287 track->pDesc->dwValidData |= DMUS_OBJ_CLASS;
be2f48cd 288 track->pDesc->guidClass = CLSID_DirectMusicWaveTrack;
0382ea1d 289 track->ref = 0; /* will be inited by QueryInterface */
be2f48cd 290
0382ea1d
RM
291 return IDirectMusicWaveTrack_IUnknown_QueryInterface ((LPUNKNOWN)&track->UnknownVtbl, lpcGUID, ppobj);
292}