amstream: Fix compilation on systems that don't support nameless unions.
[wine.git] / dlls / amstream / mediastream.c
blob53556afe35de06b1f979ad9d6901e6f9807f5c4a
1 /*
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 #define NONAMELESSUNION
22 #define NONAMELESSSTRUCT
23 #define COBJMACROS
25 #include <stdarg.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
30 #include "amstream_private.h"
32 #include "ddstream.h"
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
37 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface,
38 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample);
39 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample);
41 typedef struct {
42 IAMMediaStream IAMMediaStream_iface;
43 IDirectDrawMediaStream IDirectDrawMediaStream_iface;
44 LONG ref;
45 IMultiMediaStream* parent;
46 MSPID purpose_id;
47 STREAM_TYPE stream_type;
48 IDirectDraw7 *ddraw;
49 } DirectDrawMediaStreamImpl;
51 static inline DirectDrawMediaStreamImpl *impl_from_DirectDrawMediaStream_IAMMediaStream(IAMMediaStream *iface)
53 return CONTAINING_RECORD(iface, DirectDrawMediaStreamImpl, IAMMediaStream_iface);
56 /*** IUnknown methods ***/
57 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
58 REFIID riid, void **ret_iface)
60 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
62 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
64 if (IsEqualGUID(riid, &IID_IUnknown) ||
65 IsEqualGUID(riid, &IID_IMediaStream) ||
66 IsEqualGUID(riid, &IID_IAMMediaStream))
68 IAMMediaStream_AddRef(iface);
69 *ret_iface = iface;
70 return S_OK;
72 else if (IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
74 IAMMediaStream_AddRef(iface);
75 *ret_iface = &This->IDirectDrawMediaStream_iface;
76 return S_OK;
79 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
80 return E_NOINTERFACE;
83 static ULONG WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
85 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
86 ULONG ref = InterlockedIncrement(&This->ref);
88 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
90 return ref;
93 static ULONG WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
95 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
96 ULONG ref = InterlockedDecrement(&This->ref);
98 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
100 if (!ref)
102 if (This->ddraw)
103 IDirectDraw7_Release(This->ddraw);
104 HeapFree(GetProcessHeap(), 0, This);
107 return ref;
110 /*** IMediaStream methods ***/
111 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
112 IMultiMediaStream** multi_media_stream)
114 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
116 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
118 if (!multi_media_stream)
119 return E_POINTER;
121 IMultiMediaStream_AddRef(This->parent);
122 *multi_media_stream = This->parent;
124 return S_OK;
127 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
128 MSPID *purpose_id, STREAM_TYPE *type)
130 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
132 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
134 if (purpose_id)
135 *purpose_id = This->purpose_id;
136 if (type)
137 *type = This->stream_type;
139 return S_OK;
142 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
143 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
145 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
147 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
149 return S_FALSE;
152 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
153 DWORD flags, IStreamSample **sample)
155 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
157 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
159 return S_FALSE;
162 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
163 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
165 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
167 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
169 return S_FALSE;
172 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
174 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
176 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
178 return S_FALSE;
181 /*** IAMMediaStream methods ***/
182 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
183 REFMSPID purpose_id, const STREAM_TYPE stream_type)
185 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
187 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
189 return S_FALSE;
192 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
194 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
196 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
198 return S_FALSE;
201 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
203 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
205 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
207 return S_FALSE;
210 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
212 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
214 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
216 return S_FALSE;
219 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
221 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
223 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
225 return S_FALSE;
228 static const struct IAMMediaStreamVtbl DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl =
230 /*** IUnknown methods ***/
231 DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface,
232 DirectDrawMediaStreamImpl_IAMMediaStream_AddRef,
233 DirectDrawMediaStreamImpl_IAMMediaStream_Release,
234 /*** IMediaStream methods ***/
235 DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
236 DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation,
237 DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat,
238 DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample,
239 DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample,
240 DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream,
241 /*** IAMMediaStream methods ***/
242 DirectDrawMediaStreamImpl_IAMMediaStream_Initialize,
243 DirectDrawMediaStreamImpl_IAMMediaStream_SetState,
244 DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
245 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter,
246 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph
249 static inline DirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
251 return CONTAINING_RECORD(iface, DirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
254 /*** IUnknown methods ***/
255 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface(IDirectDrawMediaStream *iface,
256 REFIID riid, void **ret_iface)
258 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
259 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
260 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
263 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef(IDirectDrawMediaStream *iface)
265 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
266 TRACE("(%p/%p)\n", iface, This);
267 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
270 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release(IDirectDrawMediaStream *iface)
272 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
273 TRACE("(%p/%p)\n", iface, This);
274 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
277 /*** IMediaStream methods ***/
278 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream(IDirectDrawMediaStream *iface,
279 IMultiMediaStream **multi_media_stream)
281 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
283 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
285 if (!multi_media_stream)
286 return E_POINTER;
288 IMultiMediaStream_AddRef(This->parent);
289 *multi_media_stream = This->parent;
291 return S_OK;
294 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation(IDirectDrawMediaStream *iface,
295 MSPID *purpose_id, STREAM_TYPE *type)
297 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
299 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
301 if (purpose_id)
302 *purpose_id = This->purpose_id;
303 if (type)
304 *type = This->stream_type;
306 return S_OK;
309 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat(IDirectDrawMediaStream *iface,
310 IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
312 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
314 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
316 return S_FALSE;
319 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample(IDirectDrawMediaStream *iface,
320 DWORD dwFlags, IStreamSample **ppSample)
322 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
324 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
326 return S_FALSE;
329 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample(IDirectDrawMediaStream *iface,
330 IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
332 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
334 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
336 return S_FALSE;
339 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream(IDirectDrawMediaStream *iface,
340 DWORD dwFlags)
342 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
344 FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
346 return S_FALSE;
349 /*** IDirectDrawMediaStream methods ***/
350 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat(IDirectDrawMediaStream *iface,
351 DDSURFACEDESC *current_format, IDirectDrawPalette **palette,
352 DDSURFACEDESC *desired_format, DWORD *flags)
354 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, current_format, palette, desired_format,
355 flags);
357 return MS_E_NOSTREAM;
361 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream *iface,
362 const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
364 FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
366 return E_NOTIMPL;
369 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw(IDirectDrawMediaStream *iface,
370 IDirectDraw **ddraw)
372 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
374 TRACE("(%p)->(%p)\n", iface, ddraw);
376 *ddraw = NULL;
377 if (!This->ddraw)
379 HRESULT hr = DirectDrawCreateEx(NULL, (void**)&This->ddraw, &IID_IDirectDraw7, NULL);
380 if (FAILED(hr))
381 return hr;
382 IDirectDraw7_SetCooperativeLevel(This->ddraw, NULL, DDSCL_NORMAL);
385 return IDirectDraw7_QueryInterface(This->ddraw, &IID_IDirectDraw, (void**)ddraw);
388 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw(IDirectDrawMediaStream *iface,
389 IDirectDraw *pDirectDraw)
391 FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
393 return E_NOTIMPL;
396 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample(IDirectDrawMediaStream *iface,
397 IDirectDrawSurface *surface, const RECT *rect, DWORD dwFlags,
398 IDirectDrawStreamSample **ppSample)
400 TRACE("(%p)->(%p,%s,%x,%p)\n", iface, surface, wine_dbgstr_rect(rect), dwFlags, ppSample);
402 return ddrawstreamsample_create(iface, surface, rect, ppSample);
405 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame(IDirectDrawMediaStream *iface,
406 STREAM_TIME *pFrameTime)
408 FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
410 return E_NOTIMPL;
413 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl =
415 /*** IUnknown methods ***/
416 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface,
417 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef,
418 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release,
419 /*** IMediaStream methods ***/
420 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream,
421 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation,
422 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat,
423 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample,
424 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample,
425 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream,
426 /*** IDirectDrawMediaStream methods ***/
427 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat,
428 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat,
429 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw,
430 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw,
431 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample,
432 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame
435 HRESULT ddrawmediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
436 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
438 DirectDrawMediaStreamImpl *object;
440 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
442 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectDrawMediaStreamImpl));
443 if (!object)
444 return E_OUTOFMEMORY;
446 object->IAMMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl;
447 object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl;
448 object->ref = 1;
450 object->parent = parent;
451 object->purpose_id = *purpose_id;
452 object->stream_type = stream_type;
454 *media_stream = &object->IAMMediaStream_iface;
456 return S_OK;
459 typedef struct {
460 IAMMediaStream IAMMediaStream_iface;
461 IAudioMediaStream IAudioMediaStream_iface;
462 LONG ref;
463 IMultiMediaStream* parent;
464 MSPID purpose_id;
465 STREAM_TYPE stream_type;
466 } AudioMediaStreamImpl;
468 static inline AudioMediaStreamImpl *impl_from_AudioMediaStream_IAMMediaStream(IAMMediaStream *iface)
470 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAMMediaStream_iface);
473 /*** IUnknown methods ***/
474 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
475 REFIID riid, void **ret_iface)
477 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
479 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
481 if (IsEqualGUID(riid, &IID_IUnknown) ||
482 IsEqualGUID(riid, &IID_IMediaStream) ||
483 IsEqualGUID(riid, &IID_IAMMediaStream))
485 IAMMediaStream_AddRef(iface);
486 *ret_iface = iface;
487 return S_OK;
489 else if (IsEqualGUID(riid, &IID_IAudioMediaStream))
491 IAMMediaStream_AddRef(iface);
492 *ret_iface = &This->IAudioMediaStream_iface;
493 return S_OK;
496 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
497 return E_NOINTERFACE;
500 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
502 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
503 ULONG ref = InterlockedIncrement(&This->ref);
505 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
507 return ref;
510 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
512 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
513 ULONG ref = InterlockedDecrement(&This->ref);
515 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
517 if (!ref)
518 HeapFree(GetProcessHeap(), 0, This);
520 return ref;
523 /*** IMediaStream methods ***/
524 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
525 IMultiMediaStream** multi_media_stream)
527 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
529 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
531 if (!multi_media_stream)
532 return E_POINTER;
534 IMultiMediaStream_AddRef(This->parent);
535 *multi_media_stream = This->parent;
537 return S_OK;
540 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
541 MSPID *purpose_id, STREAM_TYPE *type)
543 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
545 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
547 if (purpose_id)
548 *purpose_id = This->purpose_id;
549 if (type)
550 *type = This->stream_type;
552 return S_OK;
555 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
556 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
558 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
560 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
562 return S_FALSE;
565 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
566 DWORD flags, IStreamSample **sample)
568 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
570 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
572 return S_FALSE;
575 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
576 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
578 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
580 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
582 return S_FALSE;
585 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
587 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
589 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
591 return S_FALSE;
594 /*** IAMMediaStream methods ***/
595 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
596 REFMSPID purpose_id, const STREAM_TYPE stream_type)
598 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
600 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
602 return S_FALSE;
605 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
607 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
609 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
611 return S_FALSE;
614 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
616 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
618 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
620 return S_FALSE;
623 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
625 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
627 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
629 return S_FALSE;
632 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
634 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
636 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
638 return S_FALSE;
641 static const struct IAMMediaStreamVtbl AudioMediaStreamImpl_IAMMediaStream_Vtbl =
643 /*** IUnknown methods ***/
644 AudioMediaStreamImpl_IAMMediaStream_QueryInterface,
645 AudioMediaStreamImpl_IAMMediaStream_AddRef,
646 AudioMediaStreamImpl_IAMMediaStream_Release,
647 /*** IMediaStream methods ***/
648 AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
649 AudioMediaStreamImpl_IAMMediaStream_GetInformation,
650 AudioMediaStreamImpl_IAMMediaStream_SetSameFormat,
651 AudioMediaStreamImpl_IAMMediaStream_AllocateSample,
652 AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample,
653 AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream,
654 /*** IAMMediaStream methods ***/
655 AudioMediaStreamImpl_IAMMediaStream_Initialize,
656 AudioMediaStreamImpl_IAMMediaStream_SetState,
657 AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
658 AudioMediaStreamImpl_IAMMediaStream_JoinFilter,
659 AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph
662 static inline AudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
664 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAudioMediaStream_iface);
667 /*** IUnknown methods ***/
668 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_QueryInterface(IAudioMediaStream *iface,
669 REFIID riid, void **ret_iface)
671 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
672 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
673 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
676 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_AddRef(IAudioMediaStream *iface)
678 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
679 TRACE("(%p/%p)\n", iface, This);
680 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
683 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_Release(IAudioMediaStream *iface)
685 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
686 TRACE("(%p/%p)\n", iface, This);
687 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
690 /*** IMediaStream methods ***/
691 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream(IAudioMediaStream *iface,
692 IMultiMediaStream **multi_media_stream)
694 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
696 TRACE("(%p/%p)->(%p)\n", iface, This, multi_media_stream);
698 if (!multi_media_stream)
699 return E_POINTER;
701 IMultiMediaStream_AddRef(This->parent);
702 *multi_media_stream = This->parent;
704 return S_OK;
707 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetInformation(IAudioMediaStream *iface,
708 MSPID *purpose_id, STREAM_TYPE *type)
710 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
712 TRACE("(%p/%p)->(%p,%p)\n", iface, This, purpose_id, type);
714 if (purpose_id)
715 *purpose_id = This->purpose_id;
716 if (type)
717 *type = This->stream_type;
719 return S_OK;
722 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat(IAudioMediaStream *iface,
723 IMediaStream *stream_format, DWORD flags)
725 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
727 FIXME("(%p/%p)->(%p,%x) stub!\n", iface, This, stream_format, flags);
729 return S_FALSE;
732 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_AllocateSample(IAudioMediaStream *iface,
733 DWORD flags, IStreamSample **sample)
735 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
737 FIXME("(%p/%p)->(%x,%p) stub!\n", iface, This, flags, sample);
739 return S_FALSE;
742 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample(IAudioMediaStream *iface,
743 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
745 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
747 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface, This, existing_sample, flags, sample);
749 return S_FALSE;
752 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream(IAudioMediaStream *iface,
753 DWORD flags)
755 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
757 FIXME("(%p/%p)->(%x) stub!\n", iface, This, flags);
759 return S_FALSE;
762 /*** IAudioMediaStream methods ***/
763 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetFormat(IAudioMediaStream *iface, WAVEFORMATEX *wave_format_current)
765 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
767 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format_current);
769 if (!wave_format_current)
770 return E_POINTER;
772 return MS_E_NOSTREAM;
776 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetFormat(IAudioMediaStream *iface, const WAVEFORMATEX *wave_format)
778 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
780 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format);
782 return E_NOTIMPL;
785 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSample(IAudioMediaStream *iface, IAudioData *audio_data,
786 DWORD flags, IAudioStreamSample **sample)
788 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
790 TRACE("(%p/%p)->(%p,%u,%p)\n", iface, This, audio_data, flags, sample);
792 if (!audio_data)
793 return E_POINTER;
795 return audiostreamsample_create(iface, audio_data, sample);
798 static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_IAudioMediaStream_Vtbl =
800 /*** IUnknown methods ***/
801 AudioMediaStreamImpl_IAudioMediaStream_QueryInterface,
802 AudioMediaStreamImpl_IAudioMediaStream_AddRef,
803 AudioMediaStreamImpl_IAudioMediaStream_Release,
804 /*** IMediaStream methods ***/
805 AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream,
806 AudioMediaStreamImpl_IAudioMediaStream_GetInformation,
807 AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat,
808 AudioMediaStreamImpl_IAudioMediaStream_AllocateSample,
809 AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample,
810 AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream,
811 /*** IAudioMediaStream methods ***/
812 AudioMediaStreamImpl_IAudioMediaStream_GetFormat,
813 AudioMediaStreamImpl_IAudioMediaStream_SetFormat,
814 AudioMediaStreamImpl_IAudioMediaStream_CreateSample
817 HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
818 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
820 AudioMediaStreamImpl *object;
822 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
824 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AudioMediaStreamImpl));
825 if (!object)
826 return E_OUTOFMEMORY;
828 object->IAMMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAMMediaStream_Vtbl;
829 object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAudioMediaStream_Vtbl;
830 object->ref = 1;
832 object->parent = parent;
833 object->purpose_id = *purpose_id;
834 object->stream_type = stream_type;
836 *media_stream = &object->IAMMediaStream_iface;
838 return S_OK;
841 typedef struct {
842 IDirectDrawStreamSample IDirectDrawStreamSample_iface;
843 LONG ref;
844 IMediaStream *parent;
845 IDirectDrawSurface *surface;
846 RECT rect;
847 } IDirectDrawStreamSampleImpl;
849 static inline IDirectDrawStreamSampleImpl *impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample *iface)
851 return CONTAINING_RECORD(iface, IDirectDrawStreamSampleImpl, IDirectDrawStreamSample_iface);
854 /*** IUnknown methods ***/
855 static HRESULT WINAPI IDirectDrawStreamSampleImpl_QueryInterface(IDirectDrawStreamSample *iface,
856 REFIID riid, void **ret_iface)
858 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
860 if (IsEqualGUID(riid, &IID_IUnknown) ||
861 IsEqualGUID(riid, &IID_IStreamSample) ||
862 IsEqualGUID(riid, &IID_IDirectDrawStreamSample))
864 IDirectDrawStreamSample_AddRef(iface);
865 *ret_iface = iface;
866 return S_OK;
869 *ret_iface = NULL;
871 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
872 return E_NOINTERFACE;
875 static ULONG WINAPI IDirectDrawStreamSampleImpl_AddRef(IDirectDrawStreamSample *iface)
877 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
878 ULONG ref = InterlockedIncrement(&This->ref);
880 TRACE("(%p)->(): new ref = %u\n", iface, ref);
882 return ref;
885 static ULONG WINAPI IDirectDrawStreamSampleImpl_Release(IDirectDrawStreamSample *iface)
887 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
888 ULONG ref = InterlockedDecrement(&This->ref);
890 TRACE("(%p)->(): new ref = %u\n", iface, ref);
892 if (!ref)
894 if (This->surface)
895 IDirectDrawSurface_Release(This->surface);
896 IMediaStream_Release(This->parent);
897 HeapFree(GetProcessHeap(), 0, This);
900 return ref;
903 /*** IStreamSample methods ***/
904 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetMediaStream(IDirectDrawStreamSample *iface, IMediaStream **media_stream)
906 FIXME("(%p)->(%p): stub\n", iface, media_stream);
908 return E_NOTIMPL;
911 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSampleTimes(IDirectDrawStreamSample *iface, STREAM_TIME *start_time,
912 STREAM_TIME *end_time, STREAM_TIME *current_time)
914 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
916 return E_NOTIMPL;
919 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetSampleTimes(IDirectDrawStreamSample *iface, const STREAM_TIME *start_time,
920 const STREAM_TIME *end_time)
922 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
924 return E_NOTIMPL;
927 static HRESULT WINAPI IDirectDrawStreamSampleImpl_Update(IDirectDrawStreamSample *iface, DWORD flags, HANDLE event,
928 PAPCFUNC func_APC, DWORD APC_data)
930 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
932 return E_NOTIMPL;
935 static HRESULT WINAPI IDirectDrawStreamSampleImpl_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
937 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
939 return E_NOTIMPL;
942 /*** IDirectDrawStreamSample methods ***/
943 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSurface(IDirectDrawStreamSample *iface, IDirectDrawSurface **ddraw_surface,
944 RECT *rect)
946 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
948 TRACE("(%p)->(%p,%p)\n", iface, ddraw_surface, rect);
950 if (ddraw_surface)
952 *ddraw_surface = This->surface;
953 if (*ddraw_surface)
954 IDirectDrawSurface_AddRef(*ddraw_surface);
957 if (rect)
958 *rect = This->rect;
960 return S_OK;
963 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetRect(IDirectDrawStreamSample *iface, const RECT *rect)
965 FIXME("(%p)->(%p): stub\n", iface, rect);
967 return E_NOTIMPL;
970 static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl =
972 /*** IUnknown methods ***/
973 IDirectDrawStreamSampleImpl_QueryInterface,
974 IDirectDrawStreamSampleImpl_AddRef,
975 IDirectDrawStreamSampleImpl_Release,
976 /*** IStreamSample methods ***/
977 IDirectDrawStreamSampleImpl_GetMediaStream,
978 IDirectDrawStreamSampleImpl_GetSampleTimes,
979 IDirectDrawStreamSampleImpl_SetSampleTimes,
980 IDirectDrawStreamSampleImpl_Update,
981 IDirectDrawStreamSampleImpl_CompletionStatus,
982 /*** IDirectDrawStreamSample methods ***/
983 IDirectDrawStreamSampleImpl_GetSurface,
984 IDirectDrawStreamSampleImpl_SetRect
987 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface,
988 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample)
990 IDirectDrawStreamSampleImpl *object;
991 HRESULT hr;
993 TRACE("(%p)\n", ddraw_stream_sample);
995 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
996 if (!object)
997 return E_OUTOFMEMORY;
999 object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
1000 object->ref = 1;
1001 object->parent = (IMediaStream*)parent;
1002 IMediaStream_AddRef(object->parent);
1004 if (surface)
1006 object->surface = surface;
1007 IDirectDrawSurface_AddRef(surface);
1009 else
1011 DDSURFACEDESC desc;
1012 IDirectDraw *ddraw;
1014 hr = IDirectDrawMediaStream_GetDirectDraw(parent, &ddraw);
1015 if (FAILED(hr))
1017 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1018 return hr;
1021 desc.dwSize = sizeof(desc);
1022 desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
1023 desc.dwHeight = 100;
1024 desc.dwWidth = 100;
1025 desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
1026 desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
1027 desc.ddpfPixelFormat.u1.dwRGBBitCount = 32;
1028 desc.ddpfPixelFormat.u2.dwRBitMask = 0xff0000;
1029 desc.ddpfPixelFormat.u3.dwGBitMask = 0x00ff00;
1030 desc.ddpfPixelFormat.u4.dwBBitMask = 0x0000ff;
1031 desc.ddpfPixelFormat.u5.dwRGBAlphaBitMask = 0;
1032 desc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN;
1033 desc.lpSurface = NULL;
1035 hr = IDirectDraw_CreateSurface(ddraw, &desc, &object->surface, NULL);
1036 IDirectDraw_Release(ddraw);
1037 if (FAILED(hr))
1039 ERR("failed to create surface, 0x%08x\n", hr);
1040 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1041 return hr;
1045 if (rect)
1046 object->rect = *rect;
1047 else if (object->surface)
1049 DDSURFACEDESC desc = { sizeof(desc) };
1050 hr = IDirectDrawSurface_GetSurfaceDesc(object->surface, &desc);
1051 if (hr == S_OK)
1052 SetRect(&object->rect, 0, 0, desc.dwWidth, desc.dwHeight);
1055 *ddraw_stream_sample = &object->IDirectDrawStreamSample_iface;
1057 return S_OK;
1060 typedef struct {
1061 IAudioStreamSample IAudioStreamSample_iface;
1062 LONG ref;
1063 IMediaStream *parent;
1064 IAudioData *audio_data;
1065 } IAudioStreamSampleImpl;
1067 static inline IAudioStreamSampleImpl *impl_from_IAudioStreamSample(IAudioStreamSample *iface)
1069 return CONTAINING_RECORD(iface, IAudioStreamSampleImpl, IAudioStreamSample_iface);
1072 /*** IUnknown methods ***/
1073 static HRESULT WINAPI IAudioStreamSampleImpl_QueryInterface(IAudioStreamSample *iface,
1074 REFIID riid, void **ret_iface)
1076 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
1078 if (IsEqualGUID(riid, &IID_IUnknown) ||
1079 IsEqualGUID(riid, &IID_IStreamSample) ||
1080 IsEqualGUID(riid, &IID_IAudioStreamSample))
1082 IAudioStreamSample_AddRef(iface);
1083 *ret_iface = iface;
1084 return S_OK;
1087 *ret_iface = NULL;
1089 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
1090 return E_NOINTERFACE;
1093 static ULONG WINAPI IAudioStreamSampleImpl_AddRef(IAudioStreamSample *iface)
1095 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1096 ULONG ref = InterlockedIncrement(&This->ref);
1098 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1100 return ref;
1103 static ULONG WINAPI IAudioStreamSampleImpl_Release(IAudioStreamSample *iface)
1105 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1106 ULONG ref = InterlockedDecrement(&This->ref);
1108 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1110 if (!ref)
1111 HeapFree(GetProcessHeap(), 0, This);
1113 return ref;
1116 /*** IStreamSample methods ***/
1117 static HRESULT WINAPI IAudioStreamSampleImpl_GetMediaStream(IAudioStreamSample *iface, IMediaStream **media_stream)
1119 FIXME("(%p)->(%p): stub\n", iface, media_stream);
1121 return E_NOTIMPL;
1124 static HRESULT WINAPI IAudioStreamSampleImpl_GetSampleTimes(IAudioStreamSample *iface, STREAM_TIME *start_time,
1125 STREAM_TIME *end_time, STREAM_TIME *current_time)
1127 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
1129 return E_NOTIMPL;
1132 static HRESULT WINAPI IAudioStreamSampleImpl_SetSampleTimes(IAudioStreamSample *iface, const STREAM_TIME *start_time,
1133 const STREAM_TIME *end_time)
1135 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
1137 return E_NOTIMPL;
1140 static HRESULT WINAPI IAudioStreamSampleImpl_Update(IAudioStreamSample *iface, DWORD flags, HANDLE event,
1141 PAPCFUNC func_APC, DWORD APC_data)
1143 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
1145 return E_NOTIMPL;
1148 static HRESULT WINAPI IAudioStreamSampleImpl_CompletionStatus(IAudioStreamSample *iface, DWORD flags, DWORD milliseconds)
1150 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
1152 return E_NOTIMPL;
1155 /*** IAudioStreamSample methods ***/
1156 static HRESULT WINAPI IAudioStreamSampleImpl_GetAudioData(IAudioStreamSample *iface, IAudioData **audio_data)
1158 FIXME("(%p)->(%p): stub\n", iface, audio_data);
1160 return E_NOTIMPL;
1163 static const struct IAudioStreamSampleVtbl AudioStreamSample_Vtbl =
1165 /*** IUnknown methods ***/
1166 IAudioStreamSampleImpl_QueryInterface,
1167 IAudioStreamSampleImpl_AddRef,
1168 IAudioStreamSampleImpl_Release,
1169 /*** IStreamSample methods ***/
1170 IAudioStreamSampleImpl_GetMediaStream,
1171 IAudioStreamSampleImpl_GetSampleTimes,
1172 IAudioStreamSampleImpl_SetSampleTimes,
1173 IAudioStreamSampleImpl_Update,
1174 IAudioStreamSampleImpl_CompletionStatus,
1175 /*** IAudioStreamSample methods ***/
1176 IAudioStreamSampleImpl_GetAudioData
1179 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample)
1181 IAudioStreamSampleImpl *object;
1183 TRACE("(%p)\n", audio_stream_sample);
1185 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioStreamSampleImpl));
1186 if (!object)
1187 return E_OUTOFMEMORY;
1189 object->IAudioStreamSample_iface.lpVtbl = &AudioStreamSample_Vtbl;
1190 object->ref = 1;
1191 object->parent = (IMediaStream*)parent;
1192 object->audio_data = audio_data;
1194 *audio_stream_sample = (IAudioStreamSample*)&object->IAudioStreamSample_iface;
1196 return S_OK;