reg/tests: Test import with non-standard registry file headers.
[wine.git] / dlls / amstream / mediastream.c
blob188ab884d7214b0caf37a4aaac54be2fe7c2af61
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 #include "wine/debug.h"
23 #define COBJMACROS
25 #include "winbase.h"
26 #include "wingdi.h"
28 #include "amstream_private.h"
30 #include "ddstream.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
34 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface,
35 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample);
36 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample);
38 typedef struct {
39 IAMMediaStream IAMMediaStream_iface;
40 IDirectDrawMediaStream IDirectDrawMediaStream_iface;
41 LONG ref;
42 IMultiMediaStream* parent;
43 MSPID purpose_id;
44 STREAM_TYPE stream_type;
45 IDirectDraw7 *ddraw;
46 } DirectDrawMediaStreamImpl;
48 static inline DirectDrawMediaStreamImpl *impl_from_DirectDrawMediaStream_IAMMediaStream(IAMMediaStream *iface)
50 return CONTAINING_RECORD(iface, DirectDrawMediaStreamImpl, IAMMediaStream_iface);
53 /*** IUnknown methods ***/
54 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
55 REFIID riid, void **ret_iface)
57 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
59 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
61 if (IsEqualGUID(riid, &IID_IUnknown) ||
62 IsEqualGUID(riid, &IID_IMediaStream) ||
63 IsEqualGUID(riid, &IID_IAMMediaStream))
65 IAMMediaStream_AddRef(iface);
66 *ret_iface = iface;
67 return S_OK;
69 else if (IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
71 IAMMediaStream_AddRef(iface);
72 *ret_iface = &This->IDirectDrawMediaStream_iface;
73 return S_OK;
76 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
77 return E_NOINTERFACE;
80 static ULONG WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
82 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
83 ULONG ref = InterlockedIncrement(&This->ref);
85 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
87 return ref;
90 static ULONG WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
92 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
93 ULONG ref = InterlockedDecrement(&This->ref);
95 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
97 if (!ref)
99 if (This->ddraw)
100 IDirectDraw7_Release(This->ddraw);
101 HeapFree(GetProcessHeap(), 0, This);
104 return ref;
107 /*** IMediaStream methods ***/
108 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
109 IMultiMediaStream** multi_media_stream)
111 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
113 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
115 if (!multi_media_stream)
116 return E_POINTER;
118 IMultiMediaStream_AddRef(This->parent);
119 *multi_media_stream = This->parent;
121 return S_OK;
124 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
125 MSPID *purpose_id, STREAM_TYPE *type)
127 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
129 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
131 if (purpose_id)
132 *purpose_id = This->purpose_id;
133 if (type)
134 *type = This->stream_type;
136 return S_OK;
139 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
140 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
142 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
144 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
146 return S_FALSE;
149 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
150 DWORD flags, IStreamSample **sample)
152 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
154 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
156 return S_FALSE;
159 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
160 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
162 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
164 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
166 return S_FALSE;
169 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
171 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
173 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
175 return S_FALSE;
178 /*** IAMMediaStream methods ***/
179 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
180 REFMSPID purpose_id, const STREAM_TYPE stream_type)
182 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
184 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
186 return S_FALSE;
189 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
191 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
193 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
195 return S_FALSE;
198 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
200 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
202 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
204 return S_FALSE;
207 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
209 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
211 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
213 return S_FALSE;
216 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
218 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
220 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
222 return S_FALSE;
225 static const struct IAMMediaStreamVtbl DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl =
227 /*** IUnknown methods ***/
228 DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface,
229 DirectDrawMediaStreamImpl_IAMMediaStream_AddRef,
230 DirectDrawMediaStreamImpl_IAMMediaStream_Release,
231 /*** IMediaStream methods ***/
232 DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
233 DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation,
234 DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat,
235 DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample,
236 DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample,
237 DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream,
238 /*** IAMMediaStream methods ***/
239 DirectDrawMediaStreamImpl_IAMMediaStream_Initialize,
240 DirectDrawMediaStreamImpl_IAMMediaStream_SetState,
241 DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
242 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter,
243 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph
246 static inline DirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
248 return CONTAINING_RECORD(iface, DirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
251 /*** IUnknown methods ***/
252 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface(IDirectDrawMediaStream *iface,
253 REFIID riid, void **ret_iface)
255 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
256 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
257 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
260 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef(IDirectDrawMediaStream *iface)
262 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
263 TRACE("(%p/%p)\n", iface, This);
264 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
267 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release(IDirectDrawMediaStream *iface)
269 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
270 TRACE("(%p/%p)\n", iface, This);
271 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
274 /*** IMediaStream methods ***/
275 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream(IDirectDrawMediaStream *iface,
276 IMultiMediaStream **multi_media_stream)
278 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
280 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
282 if (!multi_media_stream)
283 return E_POINTER;
285 IMultiMediaStream_AddRef(This->parent);
286 *multi_media_stream = This->parent;
288 return S_OK;
291 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation(IDirectDrawMediaStream *iface,
292 MSPID *purpose_id, STREAM_TYPE *type)
294 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
296 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
298 if (purpose_id)
299 *purpose_id = This->purpose_id;
300 if (type)
301 *type = This->stream_type;
303 return S_OK;
306 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat(IDirectDrawMediaStream *iface,
307 IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
309 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
311 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
313 return S_FALSE;
316 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample(IDirectDrawMediaStream *iface,
317 DWORD dwFlags, IStreamSample **ppSample)
319 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
321 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
323 return S_FALSE;
326 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample(IDirectDrawMediaStream *iface,
327 IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
329 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
331 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
333 return S_FALSE;
336 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream(IDirectDrawMediaStream *iface,
337 DWORD dwFlags)
339 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
341 FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
343 return S_FALSE;
346 /*** IDirectDrawMediaStream methods ***/
347 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat(IDirectDrawMediaStream *iface,
348 DDSURFACEDESC *current_format, IDirectDrawPalette **palette,
349 DDSURFACEDESC *desired_format, DWORD *flags)
351 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, current_format, palette, desired_format,
352 flags);
354 return MS_E_NOSTREAM;
358 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream *iface,
359 const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
361 FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
363 return E_NOTIMPL;
366 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw(IDirectDrawMediaStream *iface,
367 IDirectDraw **ddraw)
369 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
371 TRACE("(%p)->(%p)\n", iface, ddraw);
373 *ddraw = NULL;
374 if (!This->ddraw)
376 HRESULT hr = DirectDrawCreateEx(NULL, (void**)&This->ddraw, &IID_IDirectDraw7, NULL);
377 if (FAILED(hr))
378 return hr;
379 IDirectDraw7_SetCooperativeLevel(This->ddraw, NULL, DDSCL_NORMAL);
382 return IDirectDraw7_QueryInterface(This->ddraw, &IID_IDirectDraw, (void**)ddraw);
385 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw(IDirectDrawMediaStream *iface,
386 IDirectDraw *pDirectDraw)
388 FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
390 return E_NOTIMPL;
393 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample(IDirectDrawMediaStream *iface,
394 IDirectDrawSurface *surface, const RECT *rect, DWORD dwFlags,
395 IDirectDrawStreamSample **ppSample)
397 TRACE("(%p)->(%p,%s,%x,%p)\n", iface, surface, wine_dbgstr_rect(rect), dwFlags, ppSample);
399 return ddrawstreamsample_create(iface, surface, rect, ppSample);
402 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame(IDirectDrawMediaStream *iface,
403 STREAM_TIME *pFrameTime)
405 FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
407 return E_NOTIMPL;
410 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl =
412 /*** IUnknown methods ***/
413 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface,
414 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef,
415 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release,
416 /*** IMediaStream methods ***/
417 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream,
418 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation,
419 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat,
420 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample,
421 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample,
422 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream,
423 /*** IDirectDrawMediaStream methods ***/
424 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat,
425 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat,
426 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw,
427 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw,
428 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample,
429 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame
432 HRESULT ddrawmediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
433 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
435 DirectDrawMediaStreamImpl *object;
437 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
439 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectDrawMediaStreamImpl));
440 if (!object)
441 return E_OUTOFMEMORY;
443 object->IAMMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl;
444 object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl;
445 object->ref = 1;
447 object->parent = parent;
448 object->purpose_id = *purpose_id;
449 object->stream_type = stream_type;
451 *media_stream = &object->IAMMediaStream_iface;
453 return S_OK;
456 typedef struct {
457 IAMMediaStream IAMMediaStream_iface;
458 IAudioMediaStream IAudioMediaStream_iface;
459 LONG ref;
460 IMultiMediaStream* parent;
461 MSPID purpose_id;
462 STREAM_TYPE stream_type;
463 } AudioMediaStreamImpl;
465 static inline AudioMediaStreamImpl *impl_from_AudioMediaStream_IAMMediaStream(IAMMediaStream *iface)
467 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAMMediaStream_iface);
470 /*** IUnknown methods ***/
471 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
472 REFIID riid, void **ret_iface)
474 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
476 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
478 if (IsEqualGUID(riid, &IID_IUnknown) ||
479 IsEqualGUID(riid, &IID_IMediaStream) ||
480 IsEqualGUID(riid, &IID_IAMMediaStream))
482 IAMMediaStream_AddRef(iface);
483 *ret_iface = iface;
484 return S_OK;
486 else if (IsEqualGUID(riid, &IID_IAudioMediaStream))
488 IAMMediaStream_AddRef(iface);
489 *ret_iface = &This->IAudioMediaStream_iface;
490 return S_OK;
493 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
494 return E_NOINTERFACE;
497 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
499 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
500 ULONG ref = InterlockedIncrement(&This->ref);
502 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
504 return ref;
507 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
509 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
510 ULONG ref = InterlockedDecrement(&This->ref);
512 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
514 if (!ref)
515 HeapFree(GetProcessHeap(), 0, This);
517 return ref;
520 /*** IMediaStream methods ***/
521 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
522 IMultiMediaStream** multi_media_stream)
524 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
526 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
528 if (!multi_media_stream)
529 return E_POINTER;
531 IMultiMediaStream_AddRef(This->parent);
532 *multi_media_stream = This->parent;
534 return S_OK;
537 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
538 MSPID *purpose_id, STREAM_TYPE *type)
540 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
542 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
544 if (purpose_id)
545 *purpose_id = This->purpose_id;
546 if (type)
547 *type = This->stream_type;
549 return S_OK;
552 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
553 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
555 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
557 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
559 return S_FALSE;
562 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
563 DWORD flags, IStreamSample **sample)
565 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
567 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
569 return S_FALSE;
572 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
573 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
575 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
577 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
579 return S_FALSE;
582 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
584 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
586 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
588 return S_FALSE;
591 /*** IAMMediaStream methods ***/
592 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
593 REFMSPID purpose_id, const STREAM_TYPE stream_type)
595 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
597 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
599 return S_FALSE;
602 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
604 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
606 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
608 return S_FALSE;
611 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
613 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
615 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
617 return S_FALSE;
620 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
622 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
624 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
626 return S_FALSE;
629 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
631 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
633 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
635 return S_FALSE;
638 static const struct IAMMediaStreamVtbl AudioMediaStreamImpl_IAMMediaStream_Vtbl =
640 /*** IUnknown methods ***/
641 AudioMediaStreamImpl_IAMMediaStream_QueryInterface,
642 AudioMediaStreamImpl_IAMMediaStream_AddRef,
643 AudioMediaStreamImpl_IAMMediaStream_Release,
644 /*** IMediaStream methods ***/
645 AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
646 AudioMediaStreamImpl_IAMMediaStream_GetInformation,
647 AudioMediaStreamImpl_IAMMediaStream_SetSameFormat,
648 AudioMediaStreamImpl_IAMMediaStream_AllocateSample,
649 AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample,
650 AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream,
651 /*** IAMMediaStream methods ***/
652 AudioMediaStreamImpl_IAMMediaStream_Initialize,
653 AudioMediaStreamImpl_IAMMediaStream_SetState,
654 AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
655 AudioMediaStreamImpl_IAMMediaStream_JoinFilter,
656 AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph
659 static inline AudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
661 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAudioMediaStream_iface);
664 /*** IUnknown methods ***/
665 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_QueryInterface(IAudioMediaStream *iface,
666 REFIID riid, void **ret_iface)
668 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
669 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
670 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
673 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_AddRef(IAudioMediaStream *iface)
675 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
676 TRACE("(%p/%p)\n", iface, This);
677 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
680 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_Release(IAudioMediaStream *iface)
682 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
683 TRACE("(%p/%p)\n", iface, This);
684 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
687 /*** IMediaStream methods ***/
688 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream(IAudioMediaStream *iface,
689 IMultiMediaStream **multi_media_stream)
691 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
693 TRACE("(%p/%p)->(%p)\n", iface, This, multi_media_stream);
695 if (!multi_media_stream)
696 return E_POINTER;
698 IMultiMediaStream_AddRef(This->parent);
699 *multi_media_stream = This->parent;
701 return S_OK;
704 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetInformation(IAudioMediaStream *iface,
705 MSPID *purpose_id, STREAM_TYPE *type)
707 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
709 TRACE("(%p/%p)->(%p,%p)\n", iface, This, purpose_id, type);
711 if (purpose_id)
712 *purpose_id = This->purpose_id;
713 if (type)
714 *type = This->stream_type;
716 return S_OK;
719 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat(IAudioMediaStream *iface,
720 IMediaStream *stream_format, DWORD flags)
722 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
724 FIXME("(%p/%p)->(%p,%x) stub!\n", iface, This, stream_format, flags);
726 return S_FALSE;
729 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_AllocateSample(IAudioMediaStream *iface,
730 DWORD flags, IStreamSample **sample)
732 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
734 FIXME("(%p/%p)->(%x,%p) stub!\n", iface, This, flags, sample);
736 return S_FALSE;
739 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample(IAudioMediaStream *iface,
740 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
742 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
744 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface, This, existing_sample, flags, sample);
746 return S_FALSE;
749 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream(IAudioMediaStream *iface,
750 DWORD flags)
752 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
754 FIXME("(%p/%p)->(%x) stub!\n", iface, This, flags);
756 return S_FALSE;
759 /*** IAudioMediaStream methods ***/
760 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetFormat(IAudioMediaStream *iface, WAVEFORMATEX *wave_format_current)
762 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
764 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format_current);
766 if (!wave_format_current)
767 return E_POINTER;
769 return MS_E_NOSTREAM;
773 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetFormat(IAudioMediaStream *iface, const WAVEFORMATEX *wave_format)
775 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
777 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format);
779 return E_NOTIMPL;
782 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSample(IAudioMediaStream *iface, IAudioData *audio_data,
783 DWORD flags, IAudioStreamSample **sample)
785 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
787 TRACE("(%p/%p)->(%p,%u,%p)\n", iface, This, audio_data, flags, sample);
789 if (!audio_data)
790 return E_POINTER;
792 return audiostreamsample_create(iface, audio_data, sample);
795 static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_IAudioMediaStream_Vtbl =
797 /*** IUnknown methods ***/
798 AudioMediaStreamImpl_IAudioMediaStream_QueryInterface,
799 AudioMediaStreamImpl_IAudioMediaStream_AddRef,
800 AudioMediaStreamImpl_IAudioMediaStream_Release,
801 /*** IMediaStream methods ***/
802 AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream,
803 AudioMediaStreamImpl_IAudioMediaStream_GetInformation,
804 AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat,
805 AudioMediaStreamImpl_IAudioMediaStream_AllocateSample,
806 AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample,
807 AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream,
808 /*** IAudioMediaStream methods ***/
809 AudioMediaStreamImpl_IAudioMediaStream_GetFormat,
810 AudioMediaStreamImpl_IAudioMediaStream_SetFormat,
811 AudioMediaStreamImpl_IAudioMediaStream_CreateSample
814 HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
815 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
817 AudioMediaStreamImpl *object;
819 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
821 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AudioMediaStreamImpl));
822 if (!object)
823 return E_OUTOFMEMORY;
825 object->IAMMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAMMediaStream_Vtbl;
826 object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAudioMediaStream_Vtbl;
827 object->ref = 1;
829 object->parent = parent;
830 object->purpose_id = *purpose_id;
831 object->stream_type = stream_type;
833 *media_stream = &object->IAMMediaStream_iface;
835 return S_OK;
838 typedef struct {
839 IDirectDrawStreamSample IDirectDrawStreamSample_iface;
840 LONG ref;
841 IMediaStream *parent;
842 IDirectDrawSurface *surface;
843 RECT rect;
844 } IDirectDrawStreamSampleImpl;
846 static inline IDirectDrawStreamSampleImpl *impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample *iface)
848 return CONTAINING_RECORD(iface, IDirectDrawStreamSampleImpl, IDirectDrawStreamSample_iface);
851 /*** IUnknown methods ***/
852 static HRESULT WINAPI IDirectDrawStreamSampleImpl_QueryInterface(IDirectDrawStreamSample *iface,
853 REFIID riid, void **ret_iface)
855 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
857 if (IsEqualGUID(riid, &IID_IUnknown) ||
858 IsEqualGUID(riid, &IID_IStreamSample) ||
859 IsEqualGUID(riid, &IID_IDirectDrawStreamSample))
861 IDirectDrawStreamSample_AddRef(iface);
862 *ret_iface = iface;
863 return S_OK;
866 *ret_iface = NULL;
868 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
869 return E_NOINTERFACE;
872 static ULONG WINAPI IDirectDrawStreamSampleImpl_AddRef(IDirectDrawStreamSample *iface)
874 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
875 ULONG ref = InterlockedIncrement(&This->ref);
877 TRACE("(%p)->(): new ref = %u\n", iface, ref);
879 return ref;
882 static ULONG WINAPI IDirectDrawStreamSampleImpl_Release(IDirectDrawStreamSample *iface)
884 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
885 ULONG ref = InterlockedDecrement(&This->ref);
887 TRACE("(%p)->(): new ref = %u\n", iface, ref);
889 if (!ref)
891 if (This->surface)
892 IDirectDrawSurface_Release(This->surface);
893 IMediaStream_Release(This->parent);
894 HeapFree(GetProcessHeap(), 0, This);
897 return ref;
900 /*** IStreamSample methods ***/
901 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetMediaStream(IDirectDrawStreamSample *iface, IMediaStream **media_stream)
903 FIXME("(%p)->(%p): stub\n", iface, media_stream);
905 return E_NOTIMPL;
908 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSampleTimes(IDirectDrawStreamSample *iface, STREAM_TIME *start_time,
909 STREAM_TIME *end_time, STREAM_TIME *current_time)
911 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
913 return E_NOTIMPL;
916 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetSampleTimes(IDirectDrawStreamSample *iface, const STREAM_TIME *start_time,
917 const STREAM_TIME *end_time)
919 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
921 return E_NOTIMPL;
924 static HRESULT WINAPI IDirectDrawStreamSampleImpl_Update(IDirectDrawStreamSample *iface, DWORD flags, HANDLE event,
925 PAPCFUNC func_APC, DWORD APC_data)
927 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
929 return E_NOTIMPL;
932 static HRESULT WINAPI IDirectDrawStreamSampleImpl_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
934 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
936 return E_NOTIMPL;
939 /*** IDirectDrawStreamSample methods ***/
940 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSurface(IDirectDrawStreamSample *iface, IDirectDrawSurface **ddraw_surface,
941 RECT *rect)
943 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
945 TRACE("(%p)->(%p,%p)\n", iface, ddraw_surface, rect);
947 if (ddraw_surface)
949 *ddraw_surface = This->surface;
950 if (*ddraw_surface)
951 IDirectDrawSurface_AddRef(*ddraw_surface);
954 if (rect)
955 *rect = This->rect;
957 return S_OK;
960 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetRect(IDirectDrawStreamSample *iface, const RECT *rect)
962 FIXME("(%p)->(%p): stub\n", iface, rect);
964 return E_NOTIMPL;
967 static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl =
969 /*** IUnknown methods ***/
970 IDirectDrawStreamSampleImpl_QueryInterface,
971 IDirectDrawStreamSampleImpl_AddRef,
972 IDirectDrawStreamSampleImpl_Release,
973 /*** IStreamSample methods ***/
974 IDirectDrawStreamSampleImpl_GetMediaStream,
975 IDirectDrawStreamSampleImpl_GetSampleTimes,
976 IDirectDrawStreamSampleImpl_SetSampleTimes,
977 IDirectDrawStreamSampleImpl_Update,
978 IDirectDrawStreamSampleImpl_CompletionStatus,
979 /*** IDirectDrawStreamSample methods ***/
980 IDirectDrawStreamSampleImpl_GetSurface,
981 IDirectDrawStreamSampleImpl_SetRect
984 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface,
985 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample)
987 IDirectDrawStreamSampleImpl *object;
988 HRESULT hr;
990 TRACE("(%p)\n", ddraw_stream_sample);
992 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
993 if (!object)
994 return E_OUTOFMEMORY;
996 object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
997 object->ref = 1;
998 object->parent = (IMediaStream*)parent;
999 IMediaStream_AddRef(object->parent);
1001 if (surface)
1003 object->surface = surface;
1004 IDirectDrawSurface_AddRef(surface);
1006 else
1008 DDSURFACEDESC desc;
1009 IDirectDraw *ddraw;
1011 hr = IDirectDrawMediaStream_GetDirectDraw(parent, &ddraw);
1012 if (FAILED(hr))
1014 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1015 return hr;
1018 desc.dwSize = sizeof(desc);
1019 desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
1020 desc.dwHeight = 100;
1021 desc.dwWidth = 100;
1022 desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
1023 desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
1024 desc.ddpfPixelFormat.dwRGBBitCount = 32;
1025 desc.ddpfPixelFormat.dwRBitMask = 0xff0000;
1026 desc.ddpfPixelFormat.dwGBitMask = 0x00ff00;
1027 desc.ddpfPixelFormat.dwBBitMask = 0x0000ff;
1028 desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0;
1029 desc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN;
1030 desc.lpSurface = NULL;
1032 hr = IDirectDraw_CreateSurface(ddraw, &desc, &object->surface, NULL);
1033 IDirectDraw_Release(ddraw);
1034 if (FAILED(hr))
1036 ERR("failed to create surface, 0x%08x\n", hr);
1037 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1038 return hr;
1042 if (rect)
1043 object->rect = *rect;
1044 else if (object->surface)
1046 DDSURFACEDESC desc = { sizeof(desc) };
1047 hr = IDirectDrawSurface_GetSurfaceDesc(object->surface, &desc);
1048 if (hr == S_OK)
1049 SetRect(&object->rect, 0, 0, desc.dwWidth, desc.dwHeight);
1052 *ddraw_stream_sample = &object->IDirectDrawStreamSample_iface;
1054 return S_OK;
1057 typedef struct {
1058 IAudioStreamSample IAudioStreamSample_iface;
1059 LONG ref;
1060 IMediaStream *parent;
1061 IAudioData *audio_data;
1062 } IAudioStreamSampleImpl;
1064 static inline IAudioStreamSampleImpl *impl_from_IAudioStreamSample(IAudioStreamSample *iface)
1066 return CONTAINING_RECORD(iface, IAudioStreamSampleImpl, IAudioStreamSample_iface);
1069 /*** IUnknown methods ***/
1070 static HRESULT WINAPI IAudioStreamSampleImpl_QueryInterface(IAudioStreamSample *iface,
1071 REFIID riid, void **ret_iface)
1073 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
1075 if (IsEqualGUID(riid, &IID_IUnknown) ||
1076 IsEqualGUID(riid, &IID_IStreamSample) ||
1077 IsEqualGUID(riid, &IID_IAudioStreamSample))
1079 IAudioStreamSample_AddRef(iface);
1080 *ret_iface = iface;
1081 return S_OK;
1084 *ret_iface = NULL;
1086 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
1087 return E_NOINTERFACE;
1090 static ULONG WINAPI IAudioStreamSampleImpl_AddRef(IAudioStreamSample *iface)
1092 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1093 ULONG ref = InterlockedIncrement(&This->ref);
1095 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1097 return ref;
1100 static ULONG WINAPI IAudioStreamSampleImpl_Release(IAudioStreamSample *iface)
1102 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1103 ULONG ref = InterlockedDecrement(&This->ref);
1105 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1107 if (!ref)
1108 HeapFree(GetProcessHeap(), 0, This);
1110 return ref;
1113 /*** IStreamSample methods ***/
1114 static HRESULT WINAPI IAudioStreamSampleImpl_GetMediaStream(IAudioStreamSample *iface, IMediaStream **media_stream)
1116 FIXME("(%p)->(%p): stub\n", iface, media_stream);
1118 return E_NOTIMPL;
1121 static HRESULT WINAPI IAudioStreamSampleImpl_GetSampleTimes(IAudioStreamSample *iface, STREAM_TIME *start_time,
1122 STREAM_TIME *end_time, STREAM_TIME *current_time)
1124 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
1126 return E_NOTIMPL;
1129 static HRESULT WINAPI IAudioStreamSampleImpl_SetSampleTimes(IAudioStreamSample *iface, const STREAM_TIME *start_time,
1130 const STREAM_TIME *end_time)
1132 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
1134 return E_NOTIMPL;
1137 static HRESULT WINAPI IAudioStreamSampleImpl_Update(IAudioStreamSample *iface, DWORD flags, HANDLE event,
1138 PAPCFUNC func_APC, DWORD APC_data)
1140 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
1142 return E_NOTIMPL;
1145 static HRESULT WINAPI IAudioStreamSampleImpl_CompletionStatus(IAudioStreamSample *iface, DWORD flags, DWORD milliseconds)
1147 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
1149 return E_NOTIMPL;
1152 /*** IAudioStreamSample methods ***/
1153 static HRESULT WINAPI IAudioStreamSampleImpl_GetAudioData(IAudioStreamSample *iface, IAudioData **audio_data)
1155 FIXME("(%p)->(%p): stub\n", iface, audio_data);
1157 return E_NOTIMPL;
1160 static const struct IAudioStreamSampleVtbl AudioStreamSample_Vtbl =
1162 /*** IUnknown methods ***/
1163 IAudioStreamSampleImpl_QueryInterface,
1164 IAudioStreamSampleImpl_AddRef,
1165 IAudioStreamSampleImpl_Release,
1166 /*** IStreamSample methods ***/
1167 IAudioStreamSampleImpl_GetMediaStream,
1168 IAudioStreamSampleImpl_GetSampleTimes,
1169 IAudioStreamSampleImpl_SetSampleTimes,
1170 IAudioStreamSampleImpl_Update,
1171 IAudioStreamSampleImpl_CompletionStatus,
1172 /*** IAudioStreamSample methods ***/
1173 IAudioStreamSampleImpl_GetAudioData
1176 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample)
1178 IAudioStreamSampleImpl *object;
1180 TRACE("(%p)\n", audio_stream_sample);
1182 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioStreamSampleImpl));
1183 if (!object)
1184 return E_OUTOFMEMORY;
1186 object->IAudioStreamSample_iface.lpVtbl = &AudioStreamSample_Vtbl;
1187 object->ref = 1;
1188 object->parent = (IMediaStream*)parent;
1189 object->audio_data = audio_data;
1191 *audio_stream_sample = (IAudioStreamSample*)&object->IAudioStreamSample_iface;
1193 return S_OK;