TESTING -- override pthreads to fix gstreamer v5
[wine/multimedia.git] / dlls / amstream / mediastream.c
blob79f9822e874834ecdfea8709ace66af2ad58632f
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 FIXME("(%p/%p)->(%p) stub!\n", This, iface, multi_media_stream);
115 return S_FALSE;
118 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
119 MSPID *purpose_id, STREAM_TYPE *type)
121 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
123 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
125 if (purpose_id)
126 *purpose_id = This->purpose_id;
127 if (type)
128 *type = This->stream_type;
130 return S_OK;
133 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
134 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
136 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
138 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
140 return S_FALSE;
143 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
144 DWORD flags, IStreamSample **sample)
146 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
148 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
150 return S_FALSE;
153 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
154 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
156 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
158 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
160 return S_FALSE;
163 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
165 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
167 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
169 return S_FALSE;
172 /*** IAMMediaStream methods ***/
173 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
174 REFMSPID purpose_id, const STREAM_TYPE stream_type)
176 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
178 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
180 return S_FALSE;
183 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
185 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
187 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
189 return S_FALSE;
192 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
194 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
196 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
198 return S_FALSE;
201 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
203 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
205 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
207 return S_FALSE;
210 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
212 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
214 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
216 return S_FALSE;
219 static const struct IAMMediaStreamVtbl DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl =
221 /*** IUnknown methods ***/
222 DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface,
223 DirectDrawMediaStreamImpl_IAMMediaStream_AddRef,
224 DirectDrawMediaStreamImpl_IAMMediaStream_Release,
225 /*** IMediaStream methods ***/
226 DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
227 DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation,
228 DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat,
229 DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample,
230 DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample,
231 DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream,
232 /*** IAMMediaStream methods ***/
233 DirectDrawMediaStreamImpl_IAMMediaStream_Initialize,
234 DirectDrawMediaStreamImpl_IAMMediaStream_SetState,
235 DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
236 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter,
237 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph
240 static inline DirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
242 return CONTAINING_RECORD(iface, DirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
245 /*** IUnknown methods ***/
246 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface(IDirectDrawMediaStream *iface,
247 REFIID riid, void **ret_iface)
249 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
250 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
251 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
254 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef(IDirectDrawMediaStream *iface)
256 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
257 TRACE("(%p/%p)\n", iface, This);
258 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
261 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release(IDirectDrawMediaStream *iface)
263 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
264 TRACE("(%p/%p)\n", iface, This);
265 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
268 /*** IMediaStream methods ***/
269 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream(IDirectDrawMediaStream *iface,
270 IMultiMediaStream** ppMultiMediaStream)
272 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
274 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppMultiMediaStream);
276 return S_FALSE;
279 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation(IDirectDrawMediaStream *iface,
280 MSPID *purpose_id, STREAM_TYPE *type)
282 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
284 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
286 if (purpose_id)
287 *purpose_id = This->purpose_id;
288 if (type)
289 *type = This->stream_type;
291 return S_OK;
294 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat(IDirectDrawMediaStream *iface,
295 IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
297 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
299 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
301 return S_FALSE;
304 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample(IDirectDrawMediaStream *iface,
305 DWORD dwFlags, IStreamSample **ppSample)
307 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
309 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
311 return S_FALSE;
314 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample(IDirectDrawMediaStream *iface,
315 IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
317 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
319 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
321 return S_FALSE;
324 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream(IDirectDrawMediaStream *iface,
325 DWORD dwFlags)
327 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
329 FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
331 return S_FALSE;
334 /*** IDirectDrawMediaStream methods ***/
335 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat(IDirectDrawMediaStream *iface,
336 DDSURFACEDESC *current_format, IDirectDrawPalette **palette,
337 DDSURFACEDESC *desired_format, DWORD *flags)
339 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, current_format, palette, desired_format,
340 flags);
342 return MS_E_NOSTREAM;
346 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream *iface,
347 const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
349 FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
351 return E_NOTIMPL;
354 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw(IDirectDrawMediaStream *iface,
355 IDirectDraw **ddraw)
357 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
359 TRACE("(%p)->(%p)\n", iface, ddraw);
361 *ddraw = NULL;
362 if (!This->ddraw)
364 HRESULT hr = DirectDrawCreateEx(NULL, (void**)&This->ddraw, &IID_IDirectDraw7, NULL);
365 if (FAILED(hr))
366 return hr;
367 IDirectDraw7_SetCooperativeLevel(This->ddraw, NULL, DDSCL_NORMAL);
370 return IDirectDraw7_QueryInterface(This->ddraw, &IID_IDirectDraw, (void**)ddraw);
373 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw(IDirectDrawMediaStream *iface,
374 IDirectDraw *pDirectDraw)
376 FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
378 return E_NOTIMPL;
381 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample(IDirectDrawMediaStream *iface,
382 IDirectDrawSurface *surface, const RECT *rect, DWORD dwFlags,
383 IDirectDrawStreamSample **ppSample)
385 TRACE("(%p)->(%p,%s,%x,%p)\n", iface, surface, wine_dbgstr_rect(rect), dwFlags, ppSample);
387 return ddrawstreamsample_create(iface, surface, rect, ppSample);
390 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame(IDirectDrawMediaStream *iface,
391 STREAM_TIME *pFrameTime)
393 FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
395 return E_NOTIMPL;
398 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl =
400 /*** IUnknown methods ***/
401 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface,
402 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef,
403 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release,
404 /*** IMediaStream methods ***/
405 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream,
406 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation,
407 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat,
408 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample,
409 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample,
410 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream,
411 /*** IDirectDrawMediaStream methods ***/
412 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat,
413 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat,
414 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw,
415 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw,
416 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample,
417 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame
420 HRESULT ddrawmediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
421 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
423 DirectDrawMediaStreamImpl *object;
425 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
427 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectDrawMediaStreamImpl));
428 if (!object)
429 return E_OUTOFMEMORY;
431 object->IAMMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl;
432 object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl;
433 object->ref = 1;
435 object->parent = parent;
436 object->purpose_id = *purpose_id;
437 object->stream_type = stream_type;
439 *media_stream = &object->IAMMediaStream_iface;
441 return S_OK;
444 typedef struct {
445 IAMMediaStream IAMMediaStream_iface;
446 IAudioMediaStream IAudioMediaStream_iface;
447 LONG ref;
448 IMultiMediaStream* parent;
449 MSPID purpose_id;
450 STREAM_TYPE stream_type;
451 } AudioMediaStreamImpl;
453 static inline AudioMediaStreamImpl *impl_from_AudioMediaStream_IAMMediaStream(IAMMediaStream *iface)
455 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAMMediaStream_iface);
458 /*** IUnknown methods ***/
459 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
460 REFIID riid, void **ret_iface)
462 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
464 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
466 if (IsEqualGUID(riid, &IID_IUnknown) ||
467 IsEqualGUID(riid, &IID_IMediaStream) ||
468 IsEqualGUID(riid, &IID_IAMMediaStream))
470 IAMMediaStream_AddRef(iface);
471 *ret_iface = iface;
472 return S_OK;
474 else if (IsEqualGUID(riid, &IID_IAudioMediaStream))
476 IAMMediaStream_AddRef(iface);
477 *ret_iface = &This->IAudioMediaStream_iface;
478 return S_OK;
481 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
482 return E_NOINTERFACE;
485 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
487 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
488 ULONG ref = InterlockedIncrement(&This->ref);
490 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
492 return ref;
495 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
497 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
498 ULONG ref = InterlockedDecrement(&This->ref);
500 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
502 if (!ref)
503 HeapFree(GetProcessHeap(), 0, This);
505 return ref;
508 /*** IMediaStream methods ***/
509 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
510 IMultiMediaStream** multi_media_stream)
512 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
514 FIXME("(%p/%p)->(%p) stub!\n", This, iface, multi_media_stream);
516 return S_FALSE;
519 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
520 MSPID *purpose_id, STREAM_TYPE *type)
522 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
524 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
526 if (purpose_id)
527 *purpose_id = This->purpose_id;
528 if (type)
529 *type = This->stream_type;
531 return S_OK;
534 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
535 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
537 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
539 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
541 return S_FALSE;
544 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
545 DWORD flags, IStreamSample **sample)
547 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
549 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
551 return S_FALSE;
554 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
555 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
557 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
559 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
561 return S_FALSE;
564 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
566 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
568 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
570 return S_FALSE;
573 /*** IAMMediaStream methods ***/
574 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
575 REFMSPID purpose_id, const STREAM_TYPE stream_type)
577 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
579 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
581 return S_FALSE;
584 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
586 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
588 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
590 return S_FALSE;
593 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
595 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
597 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
599 return S_FALSE;
602 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
604 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
606 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
608 return S_FALSE;
611 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
613 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
615 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
617 return S_FALSE;
620 static const struct IAMMediaStreamVtbl AudioMediaStreamImpl_IAMMediaStream_Vtbl =
622 /*** IUnknown methods ***/
623 AudioMediaStreamImpl_IAMMediaStream_QueryInterface,
624 AudioMediaStreamImpl_IAMMediaStream_AddRef,
625 AudioMediaStreamImpl_IAMMediaStream_Release,
626 /*** IMediaStream methods ***/
627 AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
628 AudioMediaStreamImpl_IAMMediaStream_GetInformation,
629 AudioMediaStreamImpl_IAMMediaStream_SetSameFormat,
630 AudioMediaStreamImpl_IAMMediaStream_AllocateSample,
631 AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample,
632 AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream,
633 /*** IAMMediaStream methods ***/
634 AudioMediaStreamImpl_IAMMediaStream_Initialize,
635 AudioMediaStreamImpl_IAMMediaStream_SetState,
636 AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
637 AudioMediaStreamImpl_IAMMediaStream_JoinFilter,
638 AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph
641 static inline AudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
643 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAudioMediaStream_iface);
646 /*** IUnknown methods ***/
647 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_QueryInterface(IAudioMediaStream *iface,
648 REFIID riid, void **ret_iface)
650 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
651 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
652 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
655 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_AddRef(IAudioMediaStream *iface)
657 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
658 TRACE("(%p/%p)\n", iface, This);
659 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
662 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_Release(IAudioMediaStream *iface)
664 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
665 TRACE("(%p/%p)\n", iface, This);
666 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
669 /*** IMediaStream methods ***/
670 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream(IAudioMediaStream *iface,
671 IMultiMediaStream** multimedia_stream)
673 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
675 FIXME("(%p/%p)->(%p) stub!\n", iface, This, multimedia_stream);
677 return S_FALSE;
680 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetInformation(IAudioMediaStream *iface,
681 MSPID *purpose_id, STREAM_TYPE *type)
683 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
685 TRACE("(%p/%p)->(%p,%p)\n", iface, This, purpose_id, type);
687 if (purpose_id)
688 *purpose_id = This->purpose_id;
689 if (type)
690 *type = This->stream_type;
692 return S_OK;
695 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat(IAudioMediaStream *iface,
696 IMediaStream *stream_format, DWORD flags)
698 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
700 FIXME("(%p/%p)->(%p,%x) stub!\n", iface, This, stream_format, flags);
702 return S_FALSE;
705 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_AllocateSample(IAudioMediaStream *iface,
706 DWORD flags, IStreamSample **sample)
708 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
710 FIXME("(%p/%p)->(%x,%p) stub!\n", iface, This, flags, sample);
712 return S_FALSE;
715 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample(IAudioMediaStream *iface,
716 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
718 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
720 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface, This, existing_sample, flags, sample);
722 return S_FALSE;
725 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream(IAudioMediaStream *iface,
726 DWORD flags)
728 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
730 FIXME("(%p/%p)->(%x) stub!\n", iface, This, flags);
732 return S_FALSE;
735 /*** IAudioMediaStream methods ***/
736 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetFormat(IAudioMediaStream *iface, WAVEFORMATEX *wave_format_current)
738 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
740 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format_current);
742 if (!wave_format_current)
743 return E_POINTER;
745 return MS_E_NOSTREAM;
749 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetFormat(IAudioMediaStream *iface, const WAVEFORMATEX *wave_format)
751 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
753 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format);
755 return E_NOTIMPL;
758 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSample(IAudioMediaStream *iface, IAudioData *audio_data,
759 DWORD flags, IAudioStreamSample **sample)
761 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
763 TRACE("(%p/%p)->(%p,%u,%p)\n", iface, This, audio_data, flags, sample);
765 if (!audio_data)
766 return E_POINTER;
768 return audiostreamsample_create(iface, audio_data, sample);
771 static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_IAudioMediaStream_Vtbl =
773 /*** IUnknown methods ***/
774 AudioMediaStreamImpl_IAudioMediaStream_QueryInterface,
775 AudioMediaStreamImpl_IAudioMediaStream_AddRef,
776 AudioMediaStreamImpl_IAudioMediaStream_Release,
777 /*** IMediaStream methods ***/
778 AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream,
779 AudioMediaStreamImpl_IAudioMediaStream_GetInformation,
780 AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat,
781 AudioMediaStreamImpl_IAudioMediaStream_AllocateSample,
782 AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample,
783 AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream,
784 /*** IAudioMediaStream methods ***/
785 AudioMediaStreamImpl_IAudioMediaStream_GetFormat,
786 AudioMediaStreamImpl_IAudioMediaStream_SetFormat,
787 AudioMediaStreamImpl_IAudioMediaStream_CreateSample
790 HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
791 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
793 AudioMediaStreamImpl *object;
795 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
797 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AudioMediaStreamImpl));
798 if (!object)
799 return E_OUTOFMEMORY;
801 object->IAMMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAMMediaStream_Vtbl;
802 object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAudioMediaStream_Vtbl;
803 object->ref = 1;
805 object->parent = parent;
806 object->purpose_id = *purpose_id;
807 object->stream_type = stream_type;
809 *media_stream = &object->IAMMediaStream_iface;
811 return S_OK;
814 typedef struct {
815 IDirectDrawStreamSample IDirectDrawStreamSample_iface;
816 LONG ref;
817 IMediaStream *parent;
818 IDirectDrawSurface *surface;
819 RECT rect;
820 } IDirectDrawStreamSampleImpl;
822 static inline IDirectDrawStreamSampleImpl *impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample *iface)
824 return CONTAINING_RECORD(iface, IDirectDrawStreamSampleImpl, IDirectDrawStreamSample_iface);
827 /*** IUnknown methods ***/
828 static HRESULT WINAPI IDirectDrawStreamSampleImpl_QueryInterface(IDirectDrawStreamSample *iface,
829 REFIID riid, void **ret_iface)
831 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
833 if (IsEqualGUID(riid, &IID_IUnknown) ||
834 IsEqualGUID(riid, &IID_IStreamSample) ||
835 IsEqualGUID(riid, &IID_IDirectDrawStreamSample))
837 IDirectDrawStreamSample_AddRef(iface);
838 *ret_iface = iface;
839 return S_OK;
842 *ret_iface = NULL;
844 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
845 return E_NOINTERFACE;
848 static ULONG WINAPI IDirectDrawStreamSampleImpl_AddRef(IDirectDrawStreamSample *iface)
850 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
851 ULONG ref = InterlockedIncrement(&This->ref);
853 TRACE("(%p)->(): new ref = %u\n", iface, ref);
855 return ref;
858 static ULONG WINAPI IDirectDrawStreamSampleImpl_Release(IDirectDrawStreamSample *iface)
860 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
861 ULONG ref = InterlockedDecrement(&This->ref);
863 TRACE("(%p)->(): new ref = %u\n", iface, ref);
865 if (!ref)
867 if (This->surface)
868 IDirectDrawSurface_Release(This->surface);
869 IMediaStream_Release(This->parent);
870 HeapFree(GetProcessHeap(), 0, This);
873 return ref;
876 /*** IStreamSample methods ***/
877 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetMediaStream(IDirectDrawStreamSample *iface, IMediaStream **media_stream)
879 FIXME("(%p)->(%p): stub\n", iface, media_stream);
881 return E_NOTIMPL;
884 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSampleTimes(IDirectDrawStreamSample *iface, STREAM_TIME *start_time,
885 STREAM_TIME *end_time, STREAM_TIME *current_time)
887 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
889 return E_NOTIMPL;
892 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetSampleTimes(IDirectDrawStreamSample *iface, const STREAM_TIME *start_time,
893 const STREAM_TIME *end_time)
895 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
897 return E_NOTIMPL;
900 static HRESULT WINAPI IDirectDrawStreamSampleImpl_Update(IDirectDrawStreamSample *iface, DWORD flags, HANDLE event,
901 PAPCFUNC func_APC, DWORD APC_data)
903 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
905 return E_NOTIMPL;
908 static HRESULT WINAPI IDirectDrawStreamSampleImpl_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
910 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
912 return E_NOTIMPL;
915 /*** IDirectDrawStreamSample methods ***/
916 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSurface(IDirectDrawStreamSample *iface, IDirectDrawSurface **ddraw_surface,
917 RECT *rect)
919 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
921 TRACE("(%p)->(%p,%p)\n", iface, ddraw_surface, rect);
923 if (ddraw_surface)
925 *ddraw_surface = This->surface;
926 if (*ddraw_surface)
927 IDirectDrawSurface_AddRef(*ddraw_surface);
930 if (rect)
931 *rect = This->rect;
933 return S_OK;
936 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetRect(IDirectDrawStreamSample *iface, const RECT *rect)
938 FIXME("(%p)->(%p): stub\n", iface, rect);
940 return E_NOTIMPL;
943 static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl =
945 /*** IUnknown methods ***/
946 IDirectDrawStreamSampleImpl_QueryInterface,
947 IDirectDrawStreamSampleImpl_AddRef,
948 IDirectDrawStreamSampleImpl_Release,
949 /*** IStreamSample methods ***/
950 IDirectDrawStreamSampleImpl_GetMediaStream,
951 IDirectDrawStreamSampleImpl_GetSampleTimes,
952 IDirectDrawStreamSampleImpl_SetSampleTimes,
953 IDirectDrawStreamSampleImpl_Update,
954 IDirectDrawStreamSampleImpl_CompletionStatus,
955 /*** IDirectDrawStreamSample methods ***/
956 IDirectDrawStreamSampleImpl_GetSurface,
957 IDirectDrawStreamSampleImpl_SetRect
960 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface,
961 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample)
963 IDirectDrawStreamSampleImpl *object;
964 HRESULT hr;
966 TRACE("(%p)\n", ddraw_stream_sample);
968 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
969 if (!object)
970 return E_OUTOFMEMORY;
972 object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
973 object->ref = 1;
974 object->parent = (IMediaStream*)parent;
975 IMediaStream_AddRef(object->parent);
977 if (surface)
979 object->surface = surface;
980 IDirectDrawSurface_AddRef(surface);
982 else
984 DDSURFACEDESC desc;
985 IDirectDraw *ddraw;
987 hr = IDirectDrawMediaStream_GetDirectDraw(parent, &ddraw);
988 if (FAILED(hr))
990 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
991 return hr;
994 desc.dwSize = sizeof(desc);
995 desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
996 desc.dwHeight = 100;
997 desc.dwWidth = 100;
998 desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
999 desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
1000 desc.ddpfPixelFormat.dwRGBBitCount = 32;
1001 desc.ddpfPixelFormat.dwRBitMask = 0xff0000;
1002 desc.ddpfPixelFormat.dwGBitMask = 0x00ff00;
1003 desc.ddpfPixelFormat.dwBBitMask = 0x0000ff;
1004 desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0;
1005 desc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN;
1006 desc.lpSurface = NULL;
1008 hr = IDirectDraw_CreateSurface(ddraw, &desc, &object->surface, NULL);
1009 IDirectDraw_Release(ddraw);
1010 if (FAILED(hr))
1012 ERR("failed to create surface, 0x%08x\n", hr);
1013 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1014 return hr;
1018 if (rect)
1019 object->rect = *rect;
1020 else if (object->surface)
1022 DDSURFACEDESC desc = { sizeof(desc) };
1023 hr = IDirectDrawSurface_GetSurfaceDesc(object->surface, &desc);
1024 if (hr == S_OK)
1026 object->rect.left = object->rect.top = 0;
1027 object->rect.right = desc.dwWidth;
1028 object->rect.bottom = desc.dwHeight;
1032 *ddraw_stream_sample = &object->IDirectDrawStreamSample_iface;
1034 return S_OK;
1037 typedef struct {
1038 IAudioStreamSample IAudioStreamSample_iface;
1039 LONG ref;
1040 IMediaStream *parent;
1041 IAudioData *audio_data;
1042 } IAudioStreamSampleImpl;
1044 static inline IAudioStreamSampleImpl *impl_from_IAudioStreamSample(IAudioStreamSample *iface)
1046 return CONTAINING_RECORD(iface, IAudioStreamSampleImpl, IAudioStreamSample_iface);
1049 /*** IUnknown methods ***/
1050 static HRESULT WINAPI IAudioStreamSampleImpl_QueryInterface(IAudioStreamSample *iface,
1051 REFIID riid, void **ret_iface)
1053 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
1055 if (IsEqualGUID(riid, &IID_IUnknown) ||
1056 IsEqualGUID(riid, &IID_IStreamSample) ||
1057 IsEqualGUID(riid, &IID_IAudioStreamSample))
1059 IAudioStreamSample_AddRef(iface);
1060 *ret_iface = iface;
1061 return S_OK;
1064 *ret_iface = NULL;
1066 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
1067 return E_NOINTERFACE;
1070 static ULONG WINAPI IAudioStreamSampleImpl_AddRef(IAudioStreamSample *iface)
1072 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1073 ULONG ref = InterlockedIncrement(&This->ref);
1075 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1077 return ref;
1080 static ULONG WINAPI IAudioStreamSampleImpl_Release(IAudioStreamSample *iface)
1082 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1083 ULONG ref = InterlockedDecrement(&This->ref);
1085 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1087 if (!ref)
1088 HeapFree(GetProcessHeap(), 0, This);
1090 return ref;
1093 /*** IStreamSample methods ***/
1094 static HRESULT WINAPI IAudioStreamSampleImpl_GetMediaStream(IAudioStreamSample *iface, IMediaStream **media_stream)
1096 FIXME("(%p)->(%p): stub\n", iface, media_stream);
1098 return E_NOTIMPL;
1101 static HRESULT WINAPI IAudioStreamSampleImpl_GetSampleTimes(IAudioStreamSample *iface, STREAM_TIME *start_time,
1102 STREAM_TIME *end_time, STREAM_TIME *current_time)
1104 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
1106 return E_NOTIMPL;
1109 static HRESULT WINAPI IAudioStreamSampleImpl_SetSampleTimes(IAudioStreamSample *iface, const STREAM_TIME *start_time,
1110 const STREAM_TIME *end_time)
1112 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
1114 return E_NOTIMPL;
1117 static HRESULT WINAPI IAudioStreamSampleImpl_Update(IAudioStreamSample *iface, DWORD flags, HANDLE event,
1118 PAPCFUNC func_APC, DWORD APC_data)
1120 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
1122 return E_NOTIMPL;
1125 static HRESULT WINAPI IAudioStreamSampleImpl_CompletionStatus(IAudioStreamSample *iface, DWORD flags, DWORD milliseconds)
1127 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
1129 return E_NOTIMPL;
1132 /*** IAudioStreamSample methods ***/
1133 static HRESULT WINAPI IAudioStreamSampleImpl_GetAudioData(IAudioStreamSample *iface, IAudioData **audio_data)
1135 FIXME("(%p)->(%p): stub\n", iface, audio_data);
1137 return E_NOTIMPL;
1140 static const struct IAudioStreamSampleVtbl AudioStreamSample_Vtbl =
1142 /*** IUnknown methods ***/
1143 IAudioStreamSampleImpl_QueryInterface,
1144 IAudioStreamSampleImpl_AddRef,
1145 IAudioStreamSampleImpl_Release,
1146 /*** IStreamSample methods ***/
1147 IAudioStreamSampleImpl_GetMediaStream,
1148 IAudioStreamSampleImpl_GetSampleTimes,
1149 IAudioStreamSampleImpl_SetSampleTimes,
1150 IAudioStreamSampleImpl_Update,
1151 IAudioStreamSampleImpl_CompletionStatus,
1152 /*** IAudioStreamSample methods ***/
1153 IAudioStreamSampleImpl_GetAudioData
1156 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample)
1158 IAudioStreamSampleImpl *object;
1160 TRACE("(%p)\n", audio_stream_sample);
1162 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioStreamSampleImpl));
1163 if (!object)
1164 return E_OUTOFMEMORY;
1166 object->IAudioStreamSample_iface.lpVtbl = &AudioStreamSample_Vtbl;
1167 object->ref = 1;
1168 object->parent = (IMediaStream*)parent;
1169 object->audio_data = audio_data;
1171 *audio_stream_sample = (IAudioStreamSample*)&object->IAudioStreamSample_iface;
1173 return S_OK;