mfplat/sample: Optimize copying to 2d buffer.
[wine.git] / dlls / dmime / paramcontroltrack.c
blob4abcf614c3adcdb07be94d880f0ef1505cd636bc
1 /* IDirectMusicParamControlTrack Implementation
3 * Copyright (C) 2003-2004 Rok Mandeljc
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.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
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
20 #include "dmime_private.h"
22 WINE_DEFAULT_DEBUG_CHANNEL(dmime);
24 /*****************************************************************************
25 * IDirectMusicParamControlTrack implementation
27 typedef struct IDirectMusicParamControlTrack {
28 IDirectMusicTrack8 IDirectMusicTrack8_iface;
29 struct dmobject dmobj; /* IPersistStream only */
30 LONG ref;
31 } IDirectMusicParamControlTrack;
33 /* IDirectMusicParamControlTrack IDirectMusicTrack8 part: */
34 static inline IDirectMusicParamControlTrack *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
36 return CONTAINING_RECORD(iface, IDirectMusicParamControlTrack, IDirectMusicTrack8_iface);
39 static HRESULT WINAPI paramcontrol_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid,
40 void **ret_iface)
42 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
44 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
46 *ret_iface = NULL;
48 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicTrack) ||
49 IsEqualIID(riid, &IID_IDirectMusicTrack8))
50 *ret_iface = iface;
51 else if (IsEqualIID(riid, &IID_IPersistStream))
52 *ret_iface = &This->dmobj.IPersistStream_iface;
53 else {
54 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
55 return E_NOINTERFACE;
58 IUnknown_AddRef((IUnknown*)*ret_iface);
59 return S_OK;
62 static ULONG WINAPI paramcontrol_track_AddRef(IDirectMusicTrack8 *iface)
64 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
65 LONG ref = InterlockedIncrement(&This->ref);
67 TRACE("(%p) ref=%ld\n", This, ref);
69 return ref;
72 static ULONG WINAPI paramcontrol_track_Release(IDirectMusicTrack8 *iface)
74 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
75 LONG ref = InterlockedDecrement(&This->ref);
77 TRACE("(%p) ref=%ld\n", This, ref);
79 if (!ref) {
80 free(This);
83 return ref;
86 static HRESULT WINAPI paramcontrol_track_Init(IDirectMusicTrack8 *iface,
87 IDirectMusicSegment *pSegment)
89 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
90 FIXME("(%p, %p): stub\n", This, pSegment);
91 return S_OK;
94 static HRESULT WINAPI paramcontrol_track_InitPlay(IDirectMusicTrack8 *iface,
95 IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance,
96 void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
98 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
99 FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
100 return S_OK;
103 static HRESULT WINAPI paramcontrol_track_EndPlay(IDirectMusicTrack8 *iface, void *pStateData)
105 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
106 FIXME("(%p, %p): stub\n", This, pStateData);
107 return S_OK;
110 static HRESULT WINAPI paramcontrol_track_Play(IDirectMusicTrack8 *iface, void *pStateData,
111 MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags,
112 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
114 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
115 FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
116 return S_OK;
119 static HRESULT WINAPI paramcontrol_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type,
120 MUSIC_TIME time, MUSIC_TIME *next, void *param)
122 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
124 TRACE("(%p, %s, %ld, %p, %p): not supported\n", This, debugstr_dmguid(type), time, next, param);
125 return DMUS_E_GET_UNSUPPORTED;
128 static HRESULT WINAPI paramcontrol_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type,
129 MUSIC_TIME time, void *param)
131 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
133 TRACE("(%p, %s, %ld, %p): not supported\n", This, debugstr_dmguid(type), time, param);
134 return DMUS_E_SET_UNSUPPORTED;
137 static HRESULT WINAPI paramcontrol_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID type)
139 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
141 TRACE("(%p, %s): param type not supported\n", This, debugstr_dmguid(type));
142 return DMUS_E_TYPE_UNSUPPORTED;
145 static HRESULT WINAPI paramcontrol_track_AddNotificationType(IDirectMusicTrack8 *iface,
146 REFGUID notiftype)
148 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
150 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
151 return E_NOTIMPL;
154 static HRESULT WINAPI paramcontrol_track_RemoveNotificationType(IDirectMusicTrack8 *iface,
155 REFGUID notiftype)
157 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
159 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
160 return E_NOTIMPL;
163 static HRESULT WINAPI paramcontrol_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart,
164 MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
166 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
167 FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
168 return S_OK;
171 static HRESULT WINAPI paramcontrol_track_PlayEx(IDirectMusicTrack8 *iface, void *pStateData,
172 REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags,
173 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
175 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
176 FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %ld, %p, %p, %ld): stub\n", This, pStateData, wine_dbgstr_longlong(rtStart),
177 wine_dbgstr_longlong(rtEnd), wine_dbgstr_longlong(rtOffset), dwFlags, pPerf, pSegSt, dwVirtualID);
178 return S_OK;
181 static HRESULT WINAPI paramcontrol_track_GetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType,
182 REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam, void *pStateData,
183 DWORD dwFlags)
185 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
186 FIXME("(%p, %s, 0x%s, %p, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType),
187 wine_dbgstr_longlong(rtTime), prtNext, pParam, pStateData, dwFlags);
188 return S_OK;
191 static HRESULT WINAPI paramcontrol_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType,
192 REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags)
194 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
195 FIXME("(%p, %s, 0x%s, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType),
196 wine_dbgstr_longlong(rtTime), pParam, pStateData, dwFlags);
197 return S_OK;
200 static HRESULT WINAPI paramcontrol_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context,
201 DWORD trackgroup, IDirectMusicTrack **track)
203 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
205 TRACE("(%p, %p, %ld, %p): method not implemented\n", This, context, trackgroup, track);
206 return E_NOTIMPL;
209 static HRESULT WINAPI paramcontrol_track_Join(IDirectMusicTrack8 *iface,
210 IDirectMusicTrack *newtrack, MUSIC_TIME join, IUnknown *context, DWORD trackgroup,
211 IDirectMusicTrack **resulttrack)
213 IDirectMusicParamControlTrack *This = impl_from_IDirectMusicTrack8(iface);
214 TRACE("(%p, %p, %ld, %p, %ld, %p): method not implemented\n", This, newtrack, join, context,
215 trackgroup, resulttrack);
216 return E_NOTIMPL;
219 static const IDirectMusicTrack8Vtbl dmtrack8_vtbl = {
220 paramcontrol_track_QueryInterface,
221 paramcontrol_track_AddRef,
222 paramcontrol_track_Release,
223 paramcontrol_track_Init,
224 paramcontrol_track_InitPlay,
225 paramcontrol_track_EndPlay,
226 paramcontrol_track_Play,
227 paramcontrol_track_GetParam,
228 paramcontrol_track_SetParam,
229 paramcontrol_track_IsParamSupported,
230 paramcontrol_track_AddNotificationType,
231 paramcontrol_track_RemoveNotificationType,
232 paramcontrol_track_Clone,
233 paramcontrol_track_PlayEx,
234 paramcontrol_track_GetParamEx,
235 paramcontrol_track_SetParamEx,
236 paramcontrol_track_Compose,
237 paramcontrol_track_Join
240 static HRESULT WINAPI param_IPersistStream_Load(IPersistStream *iface, IStream *stream)
242 FIXME(": Loading not implemented yet\n");
243 return S_OK;
246 static const IPersistStreamVtbl persiststream_vtbl = {
247 dmobj_IPersistStream_QueryInterface,
248 dmobj_IPersistStream_AddRef,
249 dmobj_IPersistStream_Release,
250 dmobj_IPersistStream_GetClassID,
251 unimpl_IPersistStream_IsDirty,
252 param_IPersistStream_Load,
253 unimpl_IPersistStream_Save,
254 unimpl_IPersistStream_GetSizeMax
257 /* for ClassFactory */
258 HRESULT create_dmparamcontroltrack(REFIID lpcGUID, void **ppobj)
260 IDirectMusicParamControlTrack *track;
261 HRESULT hr;
263 *ppobj = NULL;
264 if (!(track = calloc(1, sizeof(*track)))) return E_OUTOFMEMORY;
265 track->IDirectMusicTrack8_iface.lpVtbl = &dmtrack8_vtbl;
266 track->ref = 1;
267 dmobject_init(&track->dmobj, &CLSID_DirectMusicParamControlTrack,
268 (IUnknown *)&track->IDirectMusicTrack8_iface);
269 track->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl;
271 hr = IDirectMusicTrack8_QueryInterface(&track->IDirectMusicTrack8_iface, lpcGUID, ppobj);
272 IDirectMusicTrack8_Release(&track->IDirectMusicTrack8_iface);
274 return hr;