Updated.
[wine/multimedia.git] / dlls / dmstyle / mutetrack.c
blobc580fe02119c936598faaaaf337d059824be6ec1
1 /* IDirectMusicMuteTrack Implementation
3 * Copyright (C) 2003 Rok Mandeljc
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (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
13 * GNU Library General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #include <stdarg.h>
22 #include "windef.h"
23 #include "winbase.h"
24 #include "winuser.h"
25 #include "wingdi.h"
26 #include "wine/debug.h"
28 #include "dmstyle_private.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(dmstyle);
31 WINE_DECLARE_DEBUG_CHANNEL(dmfile);
33 /*****************************************************************************
34 * IDirectMusicMuteTrack implementation
36 /* IDirectMusicMuteTrack IUnknown part: */
37 HRESULT WINAPI IDirectMusicMuteTrack_QueryInterface (LPDIRECTMUSICTRACK8 iface, REFIID riid, LPVOID *ppobj)
39 ICOM_THIS(IDirectMusicMuteTrack,iface);
41 if (IsEqualIID (riid, &IID_IUnknown) ||
42 IsEqualIID (riid, &IID_IDirectMusicTrack) ||
43 IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
44 IDirectMusicMuteTrack_AddRef(iface);
45 *ppobj = This;
46 return S_OK;
47 } else if (IsEqualIID (riid, &IID_IPersistStream)) {
48 IDirectMusicMuteTrackStream_AddRef ((LPPERSISTSTREAM)This->pStream);
49 *ppobj = This->pStream;
50 return S_OK;
53 WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
54 return E_NOINTERFACE;
57 ULONG WINAPI IDirectMusicMuteTrack_AddRef (LPDIRECTMUSICTRACK8 iface)
59 ICOM_THIS(IDirectMusicMuteTrack,iface);
60 TRACE("(%p) : AddRef from %ld\n", This, This->ref);
61 return ++(This->ref);
64 ULONG WINAPI IDirectMusicMuteTrack_Release (LPDIRECTMUSICTRACK8 iface)
66 ICOM_THIS(IDirectMusicMuteTrack,iface);
67 ULONG ref = --This->ref;
68 TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
69 if (ref == 0) {
70 HeapFree(GetProcessHeap(), 0, This);
72 return ref;
75 /* IDirectMusicMuteTrack IDirectMusicTrack part: */
76 HRESULT WINAPI IDirectMusicMuteTrack_Init (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegment* pSegment)
78 ICOM_THIS(IDirectMusicMuteTrack,iface);
80 FIXME("(%p, %p): stub\n", This, pSegment);
82 return S_OK;
85 HRESULT WINAPI IDirectMusicMuteTrack_InitPlay (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegmentState* pSegmentState, IDirectMusicPerformance* pPerformance, void** ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
87 ICOM_THIS(IDirectMusicMuteTrack,iface);
89 FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
91 return S_OK;
94 HRESULT WINAPI IDirectMusicMuteTrack_EndPlay (LPDIRECTMUSICTRACK8 iface, void* pStateData)
96 ICOM_THIS(IDirectMusicMuteTrack,iface);
98 FIXME("(%p, %p): stub\n", This, pStateData);
100 return S_OK;
103 HRESULT WINAPI IDirectMusicMuteTrack_Play (LPDIRECTMUSICTRACK8 iface, void* pStateData, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt, DWORD dwVirtualID)
105 ICOM_THIS(IDirectMusicMuteTrack,iface);
107 FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
109 return S_OK;
112 HRESULT WINAPI IDirectMusicMuteTrack_GetParam (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, MUSIC_TIME mtTime, MUSIC_TIME* pmtNext, void* pParam)
114 ICOM_THIS(IDirectMusicMuteTrack,iface);
116 FIXME("(%p, %s, %ld, %p, %p): stub\n", This, debugstr_guid(rguidType), mtTime, pmtNext, pParam);
118 return S_OK;
121 HRESULT WINAPI IDirectMusicMuteTrack_SetParam (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, MUSIC_TIME mtTime, void* pParam)
123 ICOM_THIS(IDirectMusicMuteTrack,iface);
125 FIXME("(%p, %s, %ld, %p): stub\n", This, debugstr_guid(rguidType), mtTime, pParam);
127 return S_OK;
130 HRESULT WINAPI IDirectMusicMuteTrack_IsParamSupported (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType)
132 ICOM_THIS(IDirectMusicMuteTrack,iface);
134 TRACE("(%p, %s): ", This, debugstr_guid(rguidType));
135 if (IsEqualGUID (rguidType, &GUID_MuteParam)) {
136 TRACE("param supported\n");
137 return S_OK;
140 TRACE("param unsupported\n");
141 return DMUS_E_TYPE_UNSUPPORTED;
144 HRESULT WINAPI IDirectMusicMuteTrack_AddNotificationType (LPDIRECTMUSICTRACK8 iface, REFGUID rguidNotificationType)
146 ICOM_THIS(IDirectMusicMuteTrack,iface);
148 FIXME("(%p, %s): stub\n", This, debugstr_guid(rguidNotificationType));
150 return S_OK;
153 HRESULT WINAPI IDirectMusicMuteTrack_RemoveNotificationType (LPDIRECTMUSICTRACK8 iface, REFGUID rguidNotificationType)
155 ICOM_THIS(IDirectMusicMuteTrack,iface);
157 FIXME("(%p, %s): stub\n", This, debugstr_guid(rguidNotificationType));
159 return S_OK;
162 HRESULT WINAPI IDirectMusicMuteTrack_Clone (LPDIRECTMUSICTRACK8 iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack** ppTrack)
164 ICOM_THIS(IDirectMusicMuteTrack,iface);
166 FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
168 return S_OK;
171 /* IDirectMusicMuteTrack IDirectMusicTrack8 part: */
172 HRESULT WINAPI IDirectMusicMuteTrack_PlayEx (LPDIRECTMUSICTRACK8 iface, void* pStateData, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt, DWORD dwVirtualID)
174 ICOM_THIS(IDirectMusicMuteTrack,iface);
176 FIXME("(%p, %p, %lli, %lli, %lli, %ld, %p, %p, %ld): stub\n", This, pStateData, rtStart, rtEnd, rtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
178 return S_OK;
181 HRESULT WINAPI IDirectMusicMuteTrack_GetParamEx (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME* prtNext, void* pParam, void* pStateData, DWORD dwFlags)
183 ICOM_THIS(IDirectMusicMuteTrack,iface);
185 FIXME("(%p, %s, %lli, %p, %p, %p, %ld): stub\n", This, debugstr_guid(rguidType), rtTime, prtNext, pParam, pStateData, dwFlags);
187 return S_OK;
190 HRESULT WINAPI IDirectMusicMuteTrack_SetParamEx (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, REFERENCE_TIME rtTime, void* pParam, void* pStateData, DWORD dwFlags)
192 ICOM_THIS(IDirectMusicMuteTrack,iface);
194 FIXME("(%p, %s, %lli, %p, %p, %ld): stub\n", This, debugstr_guid(rguidType), rtTime, pParam, pStateData, dwFlags);
196 return S_OK;
199 HRESULT WINAPI IDirectMusicMuteTrack_Compose (LPDIRECTMUSICTRACK8 iface, IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack)
201 ICOM_THIS(IDirectMusicMuteTrack,iface);
203 FIXME("(%p, %p, %ld, %p): stub\n", This, pContext, dwTrackGroup, ppResultTrack);
205 return S_OK;
208 HRESULT WINAPI IDirectMusicMuteTrack_Join (LPDIRECTMUSICTRACK8 iface, IDirectMusicTrack* pNewTrack, MUSIC_TIME mtJoin, IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack)
210 ICOM_THIS(IDirectMusicMuteTrack,iface);
212 FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack);
214 return S_OK;
217 ICOM_VTABLE(IDirectMusicTrack8) DirectMusicMuteTrack_Vtbl =
219 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
220 IDirectMusicMuteTrack_QueryInterface,
221 IDirectMusicMuteTrack_AddRef,
222 IDirectMusicMuteTrack_Release,
223 IDirectMusicMuteTrack_Init,
224 IDirectMusicMuteTrack_InitPlay,
225 IDirectMusicMuteTrack_EndPlay,
226 IDirectMusicMuteTrack_Play,
227 IDirectMusicMuteTrack_GetParam,
228 IDirectMusicMuteTrack_SetParam,
229 IDirectMusicMuteTrack_IsParamSupported,
230 IDirectMusicMuteTrack_AddNotificationType,
231 IDirectMusicMuteTrack_RemoveNotificationType,
232 IDirectMusicMuteTrack_Clone,
233 IDirectMusicMuteTrack_PlayEx,
234 IDirectMusicMuteTrack_GetParamEx,
235 IDirectMusicMuteTrack_SetParamEx,
236 IDirectMusicMuteTrack_Compose,
237 IDirectMusicMuteTrack_Join
240 /* for ClassFactory */
241 HRESULT WINAPI DMUSIC_CreateDirectMusicMuteTrack (LPCGUID lpcGUID, LPDIRECTMUSICTRACK8 *ppTrack, LPUNKNOWN pUnkOuter)
243 IDirectMusicMuteTrack* track;
245 if (IsEqualIID (lpcGUID, &IID_IDirectMusicTrack)
246 || IsEqualIID (lpcGUID, &IID_IDirectMusicTrack8)) {
247 track = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicMuteTrack));
248 if (NULL == track) {
249 *ppTrack = (LPDIRECTMUSICTRACK8) NULL;
250 return E_OUTOFMEMORY;
252 track->lpVtbl = &DirectMusicMuteTrack_Vtbl;
253 track->ref = 1;
254 track->pStream = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(IDirectMusicMuteTrackStream));
255 track->pStream->lpVtbl = &DirectMusicMuteTrackStream_Vtbl;
256 track->pStream->ref = 1;
257 track->pStream->pParentTrack = track;
258 *ppTrack = (LPDIRECTMUSICTRACK8) track;
259 return S_OK;
261 WARN("No interface found\n");
263 return E_NOINTERFACE;
267 /*****************************************************************************
268 * IDirectMusicMuteTrackStream implementation
270 /* IDirectMusicMuteTrackStream IUnknown part follow: */
271 HRESULT WINAPI IDirectMusicMuteTrackStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj)
273 ICOM_THIS(IDirectMusicMuteTrackStream,iface);
275 if (IsEqualIID (riid, &IID_IUnknown)
276 || IsEqualIID (riid, &IID_IPersistStream)) {
277 IDirectMusicMuteTrackStream_AddRef(iface);
278 *ppobj = This;
279 return S_OK;
282 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
283 return E_NOINTERFACE;
286 ULONG WINAPI IDirectMusicMuteTrackStream_AddRef (LPPERSISTSTREAM iface)
288 ICOM_THIS(IDirectMusicMuteTrackStream,iface);
289 TRACE("(%p) : AddRef from %ld\n", This, This->ref);
290 return ++(This->ref);
293 ULONG WINAPI IDirectMusicMuteTrackStream_Release (LPPERSISTSTREAM iface)
295 ICOM_THIS(IDirectMusicMuteTrackStream,iface);
296 ULONG ref = --This->ref;
297 TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
298 if (ref == 0) {
299 HeapFree(GetProcessHeap(), 0, This);
301 return ref;
304 /* IDirectMusicMuteTrackStream IPersist part: */
305 HRESULT WINAPI IDirectMusicMuteTrackStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID)
307 return E_NOTIMPL;
310 /* IDirectMusicMuteTrackStream IPersistStream part: */
311 HRESULT WINAPI IDirectMusicMuteTrackStream_IsDirty (LPPERSISTSTREAM iface)
313 return E_NOTIMPL;
316 HRESULT WINAPI IDirectMusicMuteTrackStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
318 ICOM_THIS(IDirectMusicMuteTrackStream,iface);
319 FOURCC chunkID;
320 DWORD chunkSize, dwSizeOfStruct;
321 LARGE_INTEGER liMove; /* used when skipping chunks */
322 IDirectMusicMuteTrack* pTrack = This->pParentTrack; /* that's where we load data to */
324 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
325 IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
326 TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
327 switch (chunkID) {
328 case DMUS_FOURCC_MUTE_CHUNK: {
329 TRACE_(dmfile)(": mute track chunk\n");
330 IStream_Read (pStm, &dwSizeOfStruct, sizeof(DWORD), NULL);
331 if (dwSizeOfStruct != sizeof(DMUS_IO_MUTE)) {
332 TRACE_(dmfile)(": declared size of struct (=%ld) != actual size (=%i); loading failed\n", dwSizeOfStruct, sizeof(DMUS_IO_MUTE));
333 liMove.QuadPart = chunkSize - sizeof(DWORD);
334 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
335 return E_FAIL;
337 chunkSize -= sizeof(DWORD); /* now chunk size is one DWORD shorter */
338 pTrack->pMutes = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, chunkSize);
339 IStream_Read (pStm, pTrack->pMutes, chunkSize, NULL);
340 pTrack->dwMutes = chunkSize/dwSizeOfStruct;
341 /* in the end, let's see what we got */
342 TRACE_(dmfile)(": reading finished\n");
343 if (TRACE_ON(dmfile)) {
344 int i;
345 TRACE_(dmfile)(": (READ): number of mutes in track = %ld\n", pTrack->dwMutes);
346 for (i = 0; i < pTrack->dwMutes; i++) {
347 TRACE_(dmfile)(": (READ): mute[%i]: mtTime = %li; dwPChannel = %ld; dwPChannelMap = %ld\n", \
348 i, pTrack->pMutes[i].mtTime, pTrack->pMutes[i].dwPChannel, pTrack->pMutes[i].dwPChannelMap);
352 TRACE_(dmfile)(": reading finished\n");
353 break;
354 default: {
355 TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
356 liMove.QuadPart = chunkSize;
357 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
358 return E_FAIL;
362 return S_OK;
365 HRESULT WINAPI IDirectMusicMuteTrackStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)
367 return E_NOTIMPL;
370 HRESULT WINAPI IDirectMusicMuteTrackStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize)
372 return E_NOTIMPL;
375 ICOM_VTABLE(IPersistStream) DirectMusicMuteTrackStream_Vtbl =
377 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
378 IDirectMusicMuteTrackStream_QueryInterface,
379 IDirectMusicMuteTrackStream_AddRef,
380 IDirectMusicMuteTrackStream_Release,
381 IDirectMusicMuteTrackStream_GetClassID,
382 IDirectMusicMuteTrackStream_IsDirty,
383 IDirectMusicMuteTrackStream_Load,
384 IDirectMusicMuteTrackStream_Save,
385 IDirectMusicMuteTrackStream_GetSizeMax