2 * Implementation of IMediaStream Interfaces
4 * Copyright 2005, 2008, 2012 Christian Costa
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/debug.h"
28 #include "amstream_private.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(amstream
);
36 IDirectDrawMediaStream IDirectDrawMediaStream_iface
;
38 IMultiMediaStream
* Parent
;
40 STREAM_TYPE StreamType
;
41 } IDirectDrawMediaStreamImpl
;
43 static inline IDirectDrawMediaStreamImpl
*impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream
*iface
)
45 return CONTAINING_RECORD(iface
, IDirectDrawMediaStreamImpl
, IDirectDrawMediaStream_iface
);
48 /*** IUnknown methods ***/
49 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream
*iface
,
50 REFIID riid
, void **ppv
)
52 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
54 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppv
);
56 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
57 IsEqualGUID(riid
, &IID_IMediaStream
) ||
58 IsEqualGUID(riid
, &IID_IDirectDrawMediaStream
))
60 IUnknown_AddRef(iface
);
65 ERR("(%p)->(%s,%p),not found\n", This
, debugstr_guid(riid
), ppv
);
69 static ULONG WINAPI
IDirectDrawMediaStreamImpl_AddRef(IDirectDrawMediaStream
*iface
)
71 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
73 TRACE("(%p/%p)\n", iface
, This
);
75 return InterlockedIncrement(&This
->ref
);
78 static ULONG WINAPI
IDirectDrawMediaStreamImpl_Release(IDirectDrawMediaStream
*iface
)
80 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
81 ULONG ref
= InterlockedDecrement(&This
->ref
);
83 TRACE("(%p/%p)\n", iface
, This
);
86 HeapFree(GetProcessHeap(), 0, This
);
91 /*** IMediaStream methods ***/
92 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetMultiMediaStream(IDirectDrawMediaStream
*iface
,
93 IMultiMediaStream
** ppMultiMediaStream
)
95 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
97 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppMultiMediaStream
);
102 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetInformation(IDirectDrawMediaStream
*iface
,
103 MSPID
*pPurposeId
, STREAM_TYPE
*pType
)
105 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
107 TRACE("(%p/%p)->(%p,%p)\n", This
, iface
, pPurposeId
, pType
);
110 *pPurposeId
= This
->PurposeId
;
112 *pType
= This
->StreamType
;
117 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_SetSameFormat(IDirectDrawMediaStream
*iface
,
118 IMediaStream
*pStreamThatHasDesiredFormat
, DWORD dwFlags
)
120 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
122 FIXME("(%p/%p)->(%p,%x) stub!\n", This
, iface
, pStreamThatHasDesiredFormat
, dwFlags
);
127 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_AllocateSample(IDirectDrawMediaStream
*iface
,
128 DWORD dwFlags
, IStreamSample
**ppSample
)
130 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
132 FIXME("(%p/%p)->(%x,%p) stub!\n", This
, iface
, dwFlags
, ppSample
);
137 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_CreateSharedSample(IDirectDrawMediaStream
*iface
,
138 IStreamSample
*pExistingSample
, DWORD dwFlags
, IStreamSample
**ppSample
)
140 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
142 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This
, iface
, pExistingSample
, dwFlags
, ppSample
);
147 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_SendEndOfStream(IDirectDrawMediaStream
*iface
,
150 IDirectDrawMediaStreamImpl
*This
= impl_from_IDirectDrawMediaStream(iface
);
152 FIXME("(%p/%p)->(%x) stub!\n", This
, iface
, dwFlags
);
157 /*** IDirectDrawMediaStream methods ***/
158 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream
*iface
,
159 DDSURFACEDESC
*pDDSDCurrent
, IDirectDrawPalette
**ppDirectDrawPalette
,
160 DDSURFACEDESC
*pDDSDDesired
, DWORD
*pdwFlags
)
162 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface
, pDDSDCurrent
, ppDirectDrawPalette
, pDDSDDesired
,
169 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream
*iface
,
170 const DDSURFACEDESC
*pDDSurfaceDesc
, IDirectDrawPalette
*pDirectDrawPalette
)
172 FIXME("(%p)->(%p,%p) stub!\n", iface
, pDDSurfaceDesc
, pDirectDrawPalette
);
177 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream
*iface
,
178 IDirectDraw
**ppDirectDraw
)
180 FIXME("(%p)->(%p) stub!\n", iface
, ppDirectDraw
);
185 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream
*iface
,
186 IDirectDraw
*pDirectDraw
)
188 FIXME("(%p)->(%p) stub!\n", iface
, pDirectDraw
);
193 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream
*iface
,
194 IDirectDrawSurface
*pSurface
, const RECT
*pRect
, DWORD dwFlags
,
195 IDirectDrawStreamSample
**ppSample
)
197 FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface
, pSurface
, pRect
, dwFlags
, ppSample
);
202 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream
*iface
,
203 STREAM_TIME
*pFrameTime
)
205 FIXME("(%p)->(%p) stub!\n", iface
, pFrameTime
);
210 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl
=
212 /*** IUnknown methods ***/
213 IDirectDrawMediaStreamImpl_QueryInterface
,
214 IDirectDrawMediaStreamImpl_AddRef
,
215 IDirectDrawMediaStreamImpl_Release
,
216 /*** IMediaStream methods ***/
217 IDirectDrawMediaStreamImpl_GetMultiMediaStream
,
218 IDirectDrawMediaStreamImpl_GetInformation
,
219 IDirectDrawMediaStreamImpl_SetSameFormat
,
220 IDirectDrawMediaStreamImpl_AllocateSample
,
221 IDirectDrawMediaStreamImpl_CreateSharedSample
,
222 IDirectDrawMediaStreamImpl_SendEndOfStream
,
223 /*** IDirectDrawMediaStream methods ***/
224 IDirectDrawMediaStreamImpl_GetFormat
,
225 IDirectDrawMediaStreamImpl_SetFormat
,
226 IDirectDrawMediaStreamImpl_GetDirectDraw
,
227 IDirectDrawMediaStreamImpl_SetDirectDraw
,
228 IDirectDrawMediaStreamImpl_CreateSample
,
229 IDirectDrawMediaStreamImpl_GetTimePerFrame
232 HRESULT
ddrawmediastream_create(IMultiMediaStream
*Parent
, const MSPID
*pPurposeId
,
233 STREAM_TYPE StreamType
, IMediaStream
**ppMediaStream
)
235 IDirectDrawMediaStreamImpl
*object
;
237 TRACE("(%p,%s,%p)\n", Parent
, debugstr_guid(pPurposeId
), ppMediaStream
);
239 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectDrawMediaStreamImpl
));
242 ERR("Out of memory\n");
243 return E_OUTOFMEMORY
;
246 object
->IDirectDrawMediaStream_iface
.lpVtbl
= &DirectDrawMediaStream_Vtbl
;
249 object
->Parent
= Parent
;
250 object
->PurposeId
= *pPurposeId
;
251 object
->StreamType
= StreamType
;
253 *ppMediaStream
= (IMediaStream
*)&object
->IDirectDrawMediaStream_iface
;
259 IAudioMediaStream IAudioMediaStream_iface
;
261 IMultiMediaStream
* parent
;
263 STREAM_TYPE stream_type
;
264 } IAudioMediaStreamImpl
;
266 static inline IAudioMediaStreamImpl
*impl_from_IAudioMediaStream(IAudioMediaStream
*iface
)
268 return CONTAINING_RECORD(iface
, IAudioMediaStreamImpl
, IAudioMediaStream_iface
);
271 /*** IUnknown methods ***/
272 static HRESULT WINAPI
IAudioMediaStreamImpl_QueryInterface(IAudioMediaStream
*iface
,
273 REFIID riid
, void **ret_iface
)
275 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
277 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ret_iface
);
279 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
280 IsEqualGUID(riid
, &IID_IMediaStream
) ||
281 IsEqualGUID(riid
, &IID_IAudioMediaStream
))
283 IAudioMediaStream_AddRef(iface
);
290 ERR("(%p/%p)->(%s,%p),not found\n", iface
, This
, debugstr_guid(riid
), ret_iface
);
291 return E_NOINTERFACE
;
294 static ULONG WINAPI
IAudioMediaStreamImpl_AddRef(IAudioMediaStream
*iface
)
296 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
297 ULONG ref
= InterlockedIncrement(&This
->ref
);
299 TRACE("(%p/%p): new ref = %u\n", iface
, This
, ref
);
304 static ULONG WINAPI
IAudioMediaStreamImpl_Release(IAudioMediaStream
*iface
)
306 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
307 ULONG ref
= InterlockedDecrement(&This
->ref
);
309 TRACE("(%p/%p): new ref = %u\n", iface
, This
, ref
);
312 HeapFree(GetProcessHeap(), 0, This
);
317 /*** IMediaStream methods ***/
318 static HRESULT WINAPI
IAudioMediaStreamImpl_GetMultiMediaStream(IAudioMediaStream
*iface
,
319 IMultiMediaStream
** multimedia_stream
)
321 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
323 FIXME("(%p/%p)->(%p) stub!\n", iface
, This
, multimedia_stream
);
328 static HRESULT WINAPI
IAudioMediaStreamImpl_GetInformation(IAudioMediaStream
*iface
,
329 MSPID
*purpose_id
, STREAM_TYPE
*type
)
331 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
333 TRACE("(%p/%p)->(%p,%p)\n", iface
, This
, purpose_id
, type
);
336 *purpose_id
= This
->purpose_id
;
338 *type
= This
->stream_type
;
343 static HRESULT WINAPI
IAudioMediaStreamImpl_SetSameFormat(IAudioMediaStream
*iface
,
344 IMediaStream
*stream_format
, DWORD flags
)
346 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
348 FIXME("(%p/%p)->(%p,%x) stub!\n", iface
, This
, stream_format
, flags
);
353 static HRESULT WINAPI
IAudioMediaStreamImpl_AllocateSample(IAudioMediaStream
*iface
,
354 DWORD flags
, IStreamSample
**sample
)
356 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
358 FIXME("(%p/%p)->(%x,%p) stub!\n", iface
, This
, flags
, sample
);
363 static HRESULT WINAPI
IAudioMediaStreamImpl_CreateSharedSample(IAudioMediaStream
*iface
,
364 IStreamSample
*existing_sample
, DWORD flags
, IStreamSample
**sample
)
366 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
368 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface
, This
, existing_sample
, flags
, sample
);
373 static HRESULT WINAPI
IAudioMediaStreamImpl_SendEndOfStream(IAudioMediaStream
*iface
,
376 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
378 FIXME("(%p/%p)->(%x) stub!\n", iface
, This
, flags
);
383 /*** IAudioMediaStream methods ***/
384 static HRESULT WINAPI
IAudioMediaStreamImpl_GetFormat(IAudioMediaStream
*iface
, WAVEFORMATEX
*wave_format_current
)
386 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
388 FIXME("(%p/%p)->(%p) stub!\n", iface
, This
, wave_format_current
);
394 static HRESULT WINAPI
IAudioMediaStreamImpl_SetFormat(IAudioMediaStream
*iface
, const WAVEFORMATEX
*wave_format
)
396 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
398 FIXME("(%p/%p)->(%p) stub!\n", iface
, This
, wave_format
);
403 static HRESULT WINAPI
IAudioMediaStreamImpl_CreateSample(IAudioMediaStream
*iface
, IAudioData
*audio_data
,
404 DWORD flags
, IAudioStreamSample
**sample
)
406 IAudioMediaStreamImpl
*This
= impl_from_IAudioMediaStream(iface
);
408 FIXME("(%p/%p)->(%p,%u,%p) stub!\n", iface
, This
, audio_data
, flags
, sample
);
413 static const struct IAudioMediaStreamVtbl AudioMediaStream_Vtbl
=
415 /*** IUnknown methods ***/
416 IAudioMediaStreamImpl_QueryInterface
,
417 IAudioMediaStreamImpl_AddRef
,
418 IAudioMediaStreamImpl_Release
,
419 /*** IMediaStream methods ***/
420 IAudioMediaStreamImpl_GetMultiMediaStream
,
421 IAudioMediaStreamImpl_GetInformation
,
422 IAudioMediaStreamImpl_SetSameFormat
,
423 IAudioMediaStreamImpl_AllocateSample
,
424 IAudioMediaStreamImpl_CreateSharedSample
,
425 IAudioMediaStreamImpl_SendEndOfStream
,
426 /*** IAudioMediaStream methods ***/
427 IAudioMediaStreamImpl_GetFormat
,
428 IAudioMediaStreamImpl_SetFormat
,
429 IAudioMediaStreamImpl_CreateSample
432 HRESULT
audiomediastream_create(IMultiMediaStream
*parent
, const MSPID
*purpose_id
,
433 STREAM_TYPE stream_type
, IMediaStream
**media_stream
)
435 IAudioMediaStreamImpl
*object
;
437 TRACE("(%p,%s,%p)\n", parent
, debugstr_guid(purpose_id
), media_stream
);
439 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IAudioMediaStreamImpl
));
442 ERR("Out of memory\n");
443 return E_OUTOFMEMORY
;
446 object
->IAudioMediaStream_iface
.lpVtbl
= &AudioMediaStream_Vtbl
;
449 object
->parent
= parent
;
450 object
->purpose_id
= *purpose_id
;
451 object
->stream_type
= stream_type
;
453 *media_stream
= (IMediaStream
*)&object
->IAudioMediaStream_iface
;