wininet: Fix the spelling of an InternetQueryDataAvailable() parameter.
[wine] / dlls / amstream / mediastream.c
1 /*
2  * Implementation of IMediaStream Interfaces
3  *
4  * Copyright 2005, 2008, 2012 Christian Costa
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include "wine/debug.h"
22
23 #define COBJMACROS
24
25 #include "winbase.h"
26 #include "wingdi.h"
27
28 #include "amstream_private.h"
29 #include "amstream.h"
30
31 #include "ddstream.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
34
35 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawStreamSample **ddraw_stream_sample);
36 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample);
37
38 typedef struct {
39     IDirectDrawMediaStream IDirectDrawMediaStream_iface;
40     LONG ref;
41     IMultiMediaStream* Parent;
42     MSPID PurposeId;
43     STREAM_TYPE StreamType;
44 } IDirectDrawMediaStreamImpl;
45
46 static inline IDirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
47 {
48     return CONTAINING_RECORD(iface, IDirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
49 }
50
51 /*** IUnknown methods ***/
52 static HRESULT WINAPI IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream *iface,
53         REFIID riid, void **ppv)
54 {
55     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
56
57     TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppv);
58
59     if (IsEqualGUID(riid, &IID_IUnknown) ||
60         IsEqualGUID(riid, &IID_IMediaStream) ||
61         IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
62     {
63         IUnknown_AddRef(iface);
64         *ppv = This;
65         return S_OK;
66     }
67
68     ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv);
69     return E_NOINTERFACE;
70 }
71
72 static ULONG WINAPI IDirectDrawMediaStreamImpl_AddRef(IDirectDrawMediaStream *iface)
73 {
74     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
75
76     TRACE("(%p/%p)\n", iface, This);
77
78     return InterlockedIncrement(&This->ref);
79 }
80
81 static ULONG WINAPI IDirectDrawMediaStreamImpl_Release(IDirectDrawMediaStream *iface)
82 {
83     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
84     ULONG ref = InterlockedDecrement(&This->ref);
85
86     TRACE("(%p/%p)\n", iface, This);
87
88     if (!ref)
89         HeapFree(GetProcessHeap(), 0, This);
90
91     return ref;
92 }
93
94 /*** IMediaStream methods ***/
95 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetMultiMediaStream(IDirectDrawMediaStream *iface,
96         IMultiMediaStream** ppMultiMediaStream)
97 {
98     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
99
100     FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppMultiMediaStream);
101
102     return S_FALSE;
103 }
104
105 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetInformation(IDirectDrawMediaStream *iface,
106         MSPID *pPurposeId, STREAM_TYPE *pType)
107 {
108     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
109
110     TRACE("(%p/%p)->(%p,%p)\n", This, iface, pPurposeId, pType);
111
112     if (pPurposeId)
113         *pPurposeId = This->PurposeId;
114     if (pType)
115         *pType = This->StreamType;
116
117     return S_OK;
118 }
119
120 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetSameFormat(IDirectDrawMediaStream *iface,
121         IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
122 {
123     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
124
125     FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
126
127     return S_FALSE;
128 }
129
130 static HRESULT WINAPI IDirectDrawMediaStreamImpl_AllocateSample(IDirectDrawMediaStream *iface,
131         DWORD dwFlags, IStreamSample **ppSample)
132 {
133     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
134
135     FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
136
137     return S_FALSE;
138 }
139
140 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSharedSample(IDirectDrawMediaStream *iface,
141         IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
142 {
143     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
144
145     FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
146
147     return S_FALSE;
148 }
149
150 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SendEndOfStream(IDirectDrawMediaStream *iface,
151         DWORD dwFlags)
152 {
153     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
154
155     FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
156
157     return S_FALSE;
158 }
159
160 /*** IDirectDrawMediaStream methods ***/
161 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream *iface,
162         DDSURFACEDESC *current_format, IDirectDrawPalette **palette,
163         DDSURFACEDESC *desired_format, DWORD *flags)
164 {
165     FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, current_format, palette, desired_format,
166             flags);
167
168     return MS_E_NOSTREAM;
169
170 }
171
172 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream *iface,
173         const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
174 {
175     FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
176
177     return E_NOTIMPL;
178 }
179
180 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream *iface,
181         IDirectDraw **ppDirectDraw)
182 {
183     FIXME("(%p)->(%p) stub!\n", iface, ppDirectDraw);
184
185     return E_NOTIMPL;
186 }
187
188 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream *iface,
189         IDirectDraw *pDirectDraw)
190 {
191     FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
192
193     return E_NOTIMPL;
194 }
195
196 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream *iface,
197         IDirectDrawSurface *pSurface, const RECT *pRect, DWORD dwFlags,
198         IDirectDrawStreamSample **ppSample)
199 {
200     TRACE("(%p)->(%p,%p,%x,%p)\n", iface, pSurface, pRect, dwFlags, ppSample);
201
202     return ddrawstreamsample_create(iface, ppSample);
203 }
204
205 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream *iface,
206         STREAM_TIME *pFrameTime)
207 {
208     FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
209
210     return E_NOTIMPL;
211 }
212
213 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl =
214 {
215     /*** IUnknown methods ***/
216     IDirectDrawMediaStreamImpl_QueryInterface,
217     IDirectDrawMediaStreamImpl_AddRef,
218     IDirectDrawMediaStreamImpl_Release,
219     /*** IMediaStream methods ***/
220     IDirectDrawMediaStreamImpl_GetMultiMediaStream,
221     IDirectDrawMediaStreamImpl_GetInformation,
222     IDirectDrawMediaStreamImpl_SetSameFormat,
223     IDirectDrawMediaStreamImpl_AllocateSample,
224     IDirectDrawMediaStreamImpl_CreateSharedSample,
225     IDirectDrawMediaStreamImpl_SendEndOfStream,
226     /*** IDirectDrawMediaStream methods ***/
227     IDirectDrawMediaStreamImpl_GetFormat,
228     IDirectDrawMediaStreamImpl_SetFormat,
229     IDirectDrawMediaStreamImpl_GetDirectDraw,
230     IDirectDrawMediaStreamImpl_SetDirectDraw,
231     IDirectDrawMediaStreamImpl_CreateSample,
232     IDirectDrawMediaStreamImpl_GetTimePerFrame
233 };
234
235 HRESULT ddrawmediastream_create(IMultiMediaStream *Parent, const MSPID *pPurposeId,
236         STREAM_TYPE StreamType, IMediaStream **ppMediaStream)
237 {
238     IDirectDrawMediaStreamImpl *object;
239
240     TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
241
242     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawMediaStreamImpl));
243     if (!object)
244     {
245         ERR("Out of memory\n");
246         return E_OUTOFMEMORY;
247     }
248
249     object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStream_Vtbl;
250     object->ref = 1;
251
252     object->Parent = Parent;
253     object->PurposeId = *pPurposeId;
254     object->StreamType = StreamType;
255
256     *ppMediaStream = (IMediaStream*)&object->IDirectDrawMediaStream_iface;
257
258     return S_OK;
259 }
260
261 typedef struct {
262     IAudioMediaStream IAudioMediaStream_iface;
263     LONG ref;
264     IMultiMediaStream* parent;
265     MSPID purpose_id;
266     STREAM_TYPE stream_type;
267 } IAudioMediaStreamImpl;
268
269 static inline IAudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
270 {
271     return CONTAINING_RECORD(iface, IAudioMediaStreamImpl, IAudioMediaStream_iface);
272 }
273
274 /*** IUnknown methods ***/
275 static HRESULT WINAPI IAudioMediaStreamImpl_QueryInterface(IAudioMediaStream *iface,
276         REFIID riid, void **ret_iface)
277 {
278     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
279
280     TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
281
282     if (IsEqualGUID(riid, &IID_IUnknown) ||
283         IsEqualGUID(riid, &IID_IMediaStream) ||
284         IsEqualGUID(riid, &IID_IAudioMediaStream))
285     {
286         IAudioMediaStream_AddRef(iface);
287         *ret_iface = iface;
288         return S_OK;
289     }
290
291     *ret_iface = NULL;
292
293     ERR("(%p/%p)->(%s,%p),not found\n", iface, This, debugstr_guid(riid), ret_iface);
294     return E_NOINTERFACE;
295 }
296
297 static ULONG WINAPI IAudioMediaStreamImpl_AddRef(IAudioMediaStream *iface)
298 {
299     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
300     ULONG ref = InterlockedIncrement(&This->ref);
301
302     TRACE("(%p/%p): new ref = %u\n", iface, This, ref);
303
304     return ref;
305 }
306
307 static ULONG WINAPI IAudioMediaStreamImpl_Release(IAudioMediaStream *iface)
308 {
309     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
310     ULONG ref = InterlockedDecrement(&This->ref);
311
312     TRACE("(%p/%p): new ref = %u\n", iface, This, ref);
313
314     if (!ref)
315         HeapFree(GetProcessHeap(), 0, This);
316
317     return ref;
318 }
319
320 /*** IMediaStream methods ***/
321 static HRESULT WINAPI IAudioMediaStreamImpl_GetMultiMediaStream(IAudioMediaStream *iface,
322         IMultiMediaStream** multimedia_stream)
323 {
324     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
325
326     FIXME("(%p/%p)->(%p) stub!\n", iface, This, multimedia_stream);
327
328     return S_FALSE;
329 }
330
331 static HRESULT WINAPI IAudioMediaStreamImpl_GetInformation(IAudioMediaStream *iface,
332         MSPID *purpose_id, STREAM_TYPE *type)
333 {
334     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
335
336     TRACE("(%p/%p)->(%p,%p)\n", iface, This, purpose_id, type);
337
338     if (purpose_id)
339         *purpose_id = This->purpose_id;
340     if (type)
341         *type = This->stream_type;
342
343     return S_OK;
344 }
345
346 static HRESULT WINAPI IAudioMediaStreamImpl_SetSameFormat(IAudioMediaStream *iface,
347         IMediaStream *stream_format, DWORD flags)
348 {
349     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
350
351     FIXME("(%p/%p)->(%p,%x) stub!\n", iface, This, stream_format, flags);
352
353     return S_FALSE;
354 }
355
356 static HRESULT WINAPI IAudioMediaStreamImpl_AllocateSample(IAudioMediaStream *iface,
357         DWORD flags, IStreamSample **sample)
358 {
359     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
360
361     FIXME("(%p/%p)->(%x,%p) stub!\n", iface, This, flags, sample);
362
363     return S_FALSE;
364 }
365
366 static HRESULT WINAPI IAudioMediaStreamImpl_CreateSharedSample(IAudioMediaStream *iface,
367         IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
368 {
369     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
370
371     FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface, This, existing_sample, flags, sample);
372
373     return S_FALSE;
374 }
375
376 static HRESULT WINAPI IAudioMediaStreamImpl_SendEndOfStream(IAudioMediaStream *iface,
377         DWORD flags)
378 {
379     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
380
381     FIXME("(%p/%p)->(%x) stub!\n", iface, This, flags);
382
383     return S_FALSE;
384 }
385
386 /*** IAudioMediaStream methods ***/
387 static HRESULT WINAPI IAudioMediaStreamImpl_GetFormat(IAudioMediaStream *iface, WAVEFORMATEX *wave_format_current)
388 {
389     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
390
391     FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format_current);
392
393     if (!wave_format_current)
394         return E_POINTER;
395
396     return MS_E_NOSTREAM;
397
398 }
399
400 static HRESULT WINAPI IAudioMediaStreamImpl_SetFormat(IAudioMediaStream *iface, const WAVEFORMATEX *wave_format)
401 {
402     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
403
404     FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format);
405
406     return E_NOTIMPL;
407 }
408
409 static HRESULT WINAPI IAudioMediaStreamImpl_CreateSample(IAudioMediaStream *iface, IAudioData *audio_data,
410                                                          DWORD flags, IAudioStreamSample **sample)
411 {
412     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
413
414     TRACE("(%p/%p)->(%p,%u,%p)\n", iface, This, audio_data, flags, sample);
415
416     if (!audio_data)
417         return E_POINTER;
418
419     return audiostreamsample_create(iface, audio_data, sample);
420 }
421
422 static const struct IAudioMediaStreamVtbl AudioMediaStream_Vtbl =
423 {
424     /*** IUnknown methods ***/
425     IAudioMediaStreamImpl_QueryInterface,
426     IAudioMediaStreamImpl_AddRef,
427     IAudioMediaStreamImpl_Release,
428     /*** IMediaStream methods ***/
429     IAudioMediaStreamImpl_GetMultiMediaStream,
430     IAudioMediaStreamImpl_GetInformation,
431     IAudioMediaStreamImpl_SetSameFormat,
432     IAudioMediaStreamImpl_AllocateSample,
433     IAudioMediaStreamImpl_CreateSharedSample,
434     IAudioMediaStreamImpl_SendEndOfStream,
435     /*** IAudioMediaStream methods ***/
436     IAudioMediaStreamImpl_GetFormat,
437     IAudioMediaStreamImpl_SetFormat,
438     IAudioMediaStreamImpl_CreateSample
439 };
440
441 HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
442         STREAM_TYPE stream_type, IMediaStream **media_stream)
443 {
444     IAudioMediaStreamImpl *object;
445
446     TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
447
448     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioMediaStreamImpl));
449     if (!object)
450     {
451         ERR("Out of memory\n");
452         return E_OUTOFMEMORY;
453     }
454
455     object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStream_Vtbl;
456     object->ref = 1;
457
458     object->parent = parent;
459     object->purpose_id = *purpose_id;
460     object->stream_type = stream_type;
461
462     *media_stream = (IMediaStream*)&object->IAudioMediaStream_iface;
463
464     return S_OK;
465 }
466
467 typedef struct {
468     IDirectDrawStreamSample IDirectDrawStreamSample_iface;
469     LONG ref;
470     IMediaStream *parent;
471 } IDirectDrawStreamSampleImpl;
472
473 static inline IDirectDrawStreamSampleImpl *impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample *iface)
474 {
475     return CONTAINING_RECORD(iface, IDirectDrawStreamSampleImpl, IDirectDrawStreamSample_iface);
476 }
477
478 /*** IUnknown methods ***/
479 static HRESULT WINAPI IDirectDrawStreamSampleImpl_QueryInterface(IDirectDrawStreamSample *iface,
480         REFIID riid, void **ret_iface)
481 {
482     TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
483
484     if (IsEqualGUID(riid, &IID_IUnknown) ||
485         IsEqualGUID(riid, &IID_IStreamSample) ||
486         IsEqualGUID(riid, &IID_IDirectDrawStreamSample))
487     {
488         IDirectDrawStreamSample_AddRef(iface);
489         *ret_iface = iface;
490         return S_OK;
491     }
492
493     *ret_iface = NULL;
494
495     ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
496     return E_NOINTERFACE;
497 }
498
499 static ULONG WINAPI IDirectDrawStreamSampleImpl_AddRef(IDirectDrawStreamSample *iface)
500 {
501     IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
502     ULONG ref = InterlockedIncrement(&This->ref);
503
504     TRACE("(%p)->(): new ref = %u\n", iface, ref);
505
506     return ref;
507 }
508
509 static ULONG WINAPI IDirectDrawStreamSampleImpl_Release(IDirectDrawStreamSample *iface)
510 {
511     IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
512     ULONG ref = InterlockedDecrement(&This->ref);
513
514     TRACE("(%p)->(): new ref = %u\n", iface, ref);
515
516     if (!ref)
517         HeapFree(GetProcessHeap(), 0, This);
518
519     return ref;
520 }
521
522 /*** IStreamSample methods ***/
523 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetMediaStream(IDirectDrawStreamSample *iface, IMediaStream **media_stream)
524 {
525     FIXME("(%p)->(%p): stub\n", iface, media_stream);
526
527     return E_NOTIMPL;
528 }
529
530 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSampleTimes(IDirectDrawStreamSample *iface, STREAM_TIME *start_time,
531                                                                  STREAM_TIME *end_time, STREAM_TIME *current_time)
532 {
533     FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
534
535     return E_NOTIMPL;
536 }
537
538 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetSampleTimes(IDirectDrawStreamSample *iface, const STREAM_TIME *start_time,
539                                                                  const STREAM_TIME *end_time)
540 {
541     FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
542
543     return E_NOTIMPL;
544 }
545
546 static HRESULT WINAPI IDirectDrawStreamSampleImpl_Update(IDirectDrawStreamSample *iface, DWORD flags, HANDLE event,
547                                                          PAPCFUNC func_APC, DWORD APC_data)
548 {
549     FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
550
551     return E_NOTIMPL;
552 }
553
554 static HRESULT WINAPI IDirectDrawStreamSampleImpl_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
555 {
556     FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
557
558     return E_NOTIMPL;
559 }
560
561 /*** IDirectDrawStreamSample methods ***/
562 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSurface(IDirectDrawStreamSample *iface, IDirectDrawSurface **ddraw_surface,
563                                                              RECT *rect)
564 {
565     FIXME("(%p)->(%p,%p): stub\n", iface, ddraw_surface, rect);
566
567     return E_NOTIMPL;
568 }
569
570 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetRect(IDirectDrawStreamSample *iface, const RECT *rect)
571 {
572     FIXME("(%p)->(%p): stub\n", iface, rect);
573
574     return E_NOTIMPL;
575 }
576
577 static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl =
578 {
579     /*** IUnknown methods ***/
580     IDirectDrawStreamSampleImpl_QueryInterface,
581     IDirectDrawStreamSampleImpl_AddRef,
582     IDirectDrawStreamSampleImpl_Release,
583     /*** IStreamSample methods ***/
584     IDirectDrawStreamSampleImpl_GetMediaStream,
585     IDirectDrawStreamSampleImpl_GetSampleTimes,
586     IDirectDrawStreamSampleImpl_SetSampleTimes,
587     IDirectDrawStreamSampleImpl_Update,
588     IDirectDrawStreamSampleImpl_CompletionStatus,
589     /*** IDirectDrawStreamSample methods ***/
590     IDirectDrawStreamSampleImpl_GetSurface,
591     IDirectDrawStreamSampleImpl_SetRect
592 };
593
594 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawStreamSample **ddraw_stream_sample)
595 {
596     IDirectDrawStreamSampleImpl *object;
597
598     TRACE("(%p)\n", ddraw_stream_sample);
599
600     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawStreamSampleImpl));
601     if (!object)
602     {
603         ERR("Out of memory\n");
604         return E_OUTOFMEMORY;
605     }
606
607     object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
608     object->ref = 1;
609     object->parent = (IMediaStream*)parent;
610
611     *ddraw_stream_sample = (IDirectDrawStreamSample*)&object->IDirectDrawStreamSample_iface;
612
613     return S_OK;
614 }
615
616 typedef struct {
617     IAudioStreamSample IAudioStreamSample_iface;
618     LONG ref;
619     IMediaStream *parent;
620     IAudioData *audio_data;
621 } IAudioStreamSampleImpl;
622
623 static inline IAudioStreamSampleImpl *impl_from_IAudioStreamSample(IAudioStreamSample *iface)
624 {
625     return CONTAINING_RECORD(iface, IAudioStreamSampleImpl, IAudioStreamSample_iface);
626 }
627
628 /*** IUnknown methods ***/
629 static HRESULT WINAPI IAudioStreamSampleImpl_QueryInterface(IAudioStreamSample *iface,
630         REFIID riid, void **ret_iface)
631 {
632     TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
633
634     if (IsEqualGUID(riid, &IID_IUnknown) ||
635         IsEqualGUID(riid, &IID_IStreamSample) ||
636         IsEqualGUID(riid, &IID_IAudioStreamSample))
637     {
638         IAudioStreamSample_AddRef(iface);
639         *ret_iface = iface;
640         return S_OK;
641     }
642
643     *ret_iface = NULL;
644
645     ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
646     return E_NOINTERFACE;
647 }
648
649 static ULONG WINAPI IAudioStreamSampleImpl_AddRef(IAudioStreamSample *iface)
650 {
651     IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
652     ULONG ref = InterlockedIncrement(&This->ref);
653
654     TRACE("(%p)->(): new ref = %u\n", iface, ref);
655
656     return ref;
657 }
658
659 static ULONG WINAPI IAudioStreamSampleImpl_Release(IAudioStreamSample *iface)
660 {
661     IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
662     ULONG ref = InterlockedDecrement(&This->ref);
663
664     TRACE("(%p)->(): new ref = %u\n", iface, ref);
665
666     if (!ref)
667         HeapFree(GetProcessHeap(), 0, This);
668
669     return ref;
670 }
671
672 /*** IStreamSample methods ***/
673 static HRESULT WINAPI IAudioStreamSampleImpl_GetMediaStream(IAudioStreamSample *iface, IMediaStream **media_stream)
674 {
675     FIXME("(%p)->(%p): stub\n", iface, media_stream);
676
677     return E_NOTIMPL;
678 }
679
680 static HRESULT WINAPI IAudioStreamSampleImpl_GetSampleTimes(IAudioStreamSample *iface, STREAM_TIME *start_time,
681                                                                  STREAM_TIME *end_time, STREAM_TIME *current_time)
682 {
683     FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
684
685     return E_NOTIMPL;
686 }
687
688 static HRESULT WINAPI IAudioStreamSampleImpl_SetSampleTimes(IAudioStreamSample *iface, const STREAM_TIME *start_time,
689                                                                  const STREAM_TIME *end_time)
690 {
691     FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
692
693     return E_NOTIMPL;
694 }
695
696 static HRESULT WINAPI IAudioStreamSampleImpl_Update(IAudioStreamSample *iface, DWORD flags, HANDLE event,
697                                                          PAPCFUNC func_APC, DWORD APC_data)
698 {
699     FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
700
701     return E_NOTIMPL;
702 }
703
704 static HRESULT WINAPI IAudioStreamSampleImpl_CompletionStatus(IAudioStreamSample *iface, DWORD flags, DWORD milliseconds)
705 {
706     FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
707
708     return E_NOTIMPL;
709 }
710
711 /*** IAudioStreamSample methods ***/
712 static HRESULT WINAPI IAudioStreamSampleImpl_GetAudioData(IAudioStreamSample *iface, IAudioData **audio_data)
713 {
714     FIXME("(%p)->(%p): stub\n", iface, audio_data);
715
716     return E_NOTIMPL;
717 }
718
719 static const struct IAudioStreamSampleVtbl AudioStreamSample_Vtbl =
720 {
721     /*** IUnknown methods ***/
722     IAudioStreamSampleImpl_QueryInterface,
723     IAudioStreamSampleImpl_AddRef,
724     IAudioStreamSampleImpl_Release,
725     /*** IStreamSample methods ***/
726     IAudioStreamSampleImpl_GetMediaStream,
727     IAudioStreamSampleImpl_GetSampleTimes,
728     IAudioStreamSampleImpl_SetSampleTimes,
729     IAudioStreamSampleImpl_Update,
730     IAudioStreamSampleImpl_CompletionStatus,
731     /*** IAudioStreamSample methods ***/
732     IAudioStreamSampleImpl_GetAudioData
733 };
734
735 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample)
736 {
737     IAudioStreamSampleImpl *object;
738
739     TRACE("(%p)\n", audio_stream_sample);
740
741     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioStreamSampleImpl));
742     if (!object)
743     {
744         ERR("Out of memory\n");
745         return E_OUTOFMEMORY;
746     }
747
748     object->IAudioStreamSample_iface.lpVtbl = &AudioStreamSample_Vtbl;
749     object->ref = 1;
750     object->parent = (IMediaStream*)parent;
751     object->audio_data = audio_data;
752
753     *audio_stream_sample = (IAudioStreamSample*)&object->IAudioStreamSample_iface;
754
755     return S_OK;
756 }