[AMSTREAM] We don't need to define WIDL_C_INLINE_WRAPPERS here anymore.
[reactos.git] / dll / directx / wine / 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 "amstream_private.h"
22
23 #include <initguid.h>
24 DEFINE_GUID(IID_IDirectDraw7, 0x15e65ec0,0x3b9c,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b);
25
26 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface,
27 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample);
28 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample);
29
30 typedef struct {
31 IAMMediaStream IAMMediaStream_iface;
32 IDirectDrawMediaStream IDirectDrawMediaStream_iface;
33 LONG ref;
34 IMultiMediaStream* parent;
35 MSPID purpose_id;
36 STREAM_TYPE stream_type;
37 IDirectDraw7 *ddraw;
38 } DirectDrawMediaStreamImpl;
39
40 static inline DirectDrawMediaStreamImpl *impl_from_DirectDrawMediaStream_IAMMediaStream(IAMMediaStream *iface)
41 {
42 return CONTAINING_RECORD(iface, DirectDrawMediaStreamImpl, IAMMediaStream_iface);
43 }
44
45 /*** IUnknown methods ***/
46 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
47 REFIID riid, void **ret_iface)
48 {
49 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
50
51 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
52
53 if (IsEqualGUID(riid, &IID_IUnknown) ||
54 IsEqualGUID(riid, &IID_IMediaStream) ||
55 IsEqualGUID(riid, &IID_IAMMediaStream))
56 {
57 IAMMediaStream_AddRef(iface);
58 *ret_iface = iface;
59 return S_OK;
60 }
61 else if (IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
62 {
63 IAMMediaStream_AddRef(iface);
64 *ret_iface = &This->IDirectDrawMediaStream_iface;
65 return S_OK;
66 }
67
68 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
69 return E_NOINTERFACE;
70 }
71
72 static ULONG WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
73 {
74 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
75 ULONG ref = InterlockedIncrement(&This->ref);
76
77 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
78
79 return ref;
80 }
81
82 static ULONG WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
83 {
84 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
85 ULONG ref = InterlockedDecrement(&This->ref);
86
87 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
88
89 if (!ref)
90 {
91 if (This->ddraw)
92 IDirectDraw7_Release(This->ddraw);
93 HeapFree(GetProcessHeap(), 0, This);
94 }
95
96 return ref;
97 }
98
99 /*** IMediaStream methods ***/
100 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
101 IMultiMediaStream** multi_media_stream)
102 {
103 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
104
105 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
106
107 if (!multi_media_stream)
108 return E_POINTER;
109
110 IMultiMediaStream_AddRef(This->parent);
111 *multi_media_stream = This->parent;
112
113 return S_OK;
114 }
115
116 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
117 MSPID *purpose_id, STREAM_TYPE *type)
118 {
119 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
120
121 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
122
123 if (purpose_id)
124 *purpose_id = This->purpose_id;
125 if (type)
126 *type = This->stream_type;
127
128 return S_OK;
129 }
130
131 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
132 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
133 {
134 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
135
136 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
137
138 return S_FALSE;
139 }
140
141 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
142 DWORD flags, IStreamSample **sample)
143 {
144 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
145
146 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
147
148 return S_FALSE;
149 }
150
151 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
152 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
153 {
154 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
155
156 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
157
158 return S_FALSE;
159 }
160
161 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
162 {
163 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
164
165 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
166
167 return S_FALSE;
168 }
169
170 /*** IAMMediaStream methods ***/
171 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
172 REFMSPID purpose_id, const STREAM_TYPE stream_type)
173 {
174 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
175
176 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
177
178 return S_FALSE;
179 }
180
181 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
182 {
183 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
184
185 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
186
187 return S_FALSE;
188 }
189
190 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
191 {
192 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
193
194 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
195
196 return S_FALSE;
197 }
198
199 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
200 {
201 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
202
203 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
204
205 return S_FALSE;
206 }
207
208 static HRESULT WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
209 {
210 DirectDrawMediaStreamImpl *This = impl_from_DirectDrawMediaStream_IAMMediaStream(iface);
211
212 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
213
214 return S_FALSE;
215 }
216
217 static const struct IAMMediaStreamVtbl DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl =
218 {
219 /*** IUnknown methods ***/
220 DirectDrawMediaStreamImpl_IAMMediaStream_QueryInterface,
221 DirectDrawMediaStreamImpl_IAMMediaStream_AddRef,
222 DirectDrawMediaStreamImpl_IAMMediaStream_Release,
223 /*** IMediaStream methods ***/
224 DirectDrawMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
225 DirectDrawMediaStreamImpl_IAMMediaStream_GetInformation,
226 DirectDrawMediaStreamImpl_IAMMediaStream_SetSameFormat,
227 DirectDrawMediaStreamImpl_IAMMediaStream_AllocateSample,
228 DirectDrawMediaStreamImpl_IAMMediaStream_CreateSharedSample,
229 DirectDrawMediaStreamImpl_IAMMediaStream_SendEndOfStream,
230 /*** IAMMediaStream methods ***/
231 DirectDrawMediaStreamImpl_IAMMediaStream_Initialize,
232 DirectDrawMediaStreamImpl_IAMMediaStream_SetState,
233 DirectDrawMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
234 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilter,
235 DirectDrawMediaStreamImpl_IAMMediaStream_JoinFilterGraph
236 };
237
238 static inline DirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
239 {
240 return CONTAINING_RECORD(iface, DirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
241 }
242
243 /*** IUnknown methods ***/
244 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface(IDirectDrawMediaStream *iface,
245 REFIID riid, void **ret_iface)
246 {
247 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
248 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
249 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
250 }
251
252 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef(IDirectDrawMediaStream *iface)
253 {
254 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
255 TRACE("(%p/%p)\n", iface, This);
256 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
257 }
258
259 static ULONG WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release(IDirectDrawMediaStream *iface)
260 {
261 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
262 TRACE("(%p/%p)\n", iface, This);
263 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
264 }
265
266 /*** IMediaStream methods ***/
267 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream(IDirectDrawMediaStream *iface,
268 IMultiMediaStream **multi_media_stream)
269 {
270 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
271
272 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
273
274 if (!multi_media_stream)
275 return E_POINTER;
276
277 IMultiMediaStream_AddRef(This->parent);
278 *multi_media_stream = This->parent;
279
280 return S_OK;
281 }
282
283 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation(IDirectDrawMediaStream *iface,
284 MSPID *purpose_id, STREAM_TYPE *type)
285 {
286 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
287
288 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
289
290 if (purpose_id)
291 *purpose_id = This->purpose_id;
292 if (type)
293 *type = This->stream_type;
294
295 return S_OK;
296 }
297
298 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat(IDirectDrawMediaStream *iface,
299 IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
300 {
301 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
302
303 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
304
305 return S_FALSE;
306 }
307
308 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample(IDirectDrawMediaStream *iface,
309 DWORD dwFlags, IStreamSample **ppSample)
310 {
311 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
312
313 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
314
315 return S_FALSE;
316 }
317
318 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample(IDirectDrawMediaStream *iface,
319 IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
320 {
321 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
322
323 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
324
325 return S_FALSE;
326 }
327
328 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream(IDirectDrawMediaStream *iface,
329 DWORD dwFlags)
330 {
331 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
332
333 FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
334
335 return S_FALSE;
336 }
337
338 /*** IDirectDrawMediaStream methods ***/
339 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat(IDirectDrawMediaStream *iface,
340 DDSURFACEDESC *current_format, IDirectDrawPalette **palette,
341 DDSURFACEDESC *desired_format, DWORD *flags)
342 {
343 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, current_format, palette, desired_format,
344 flags);
345
346 return MS_E_NOSTREAM;
347
348 }
349
350 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream *iface,
351 const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
352 {
353 FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
354
355 return E_NOTIMPL;
356 }
357
358 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw(IDirectDrawMediaStream *iface,
359 IDirectDraw **ddraw)
360 {
361 DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
362
363 TRACE("(%p)->(%p)\n", iface, ddraw);
364
365 *ddraw = NULL;
366 if (!This->ddraw)
367 {
368 HRESULT hr = DirectDrawCreateEx(NULL, (void**)&This->ddraw, &IID_IDirectDraw7, NULL);
369 if (FAILED(hr))
370 return hr;
371 IDirectDraw7_SetCooperativeLevel(This->ddraw, NULL, DDSCL_NORMAL);
372 }
373
374 return IDirectDraw7_QueryInterface(This->ddraw, &IID_IDirectDraw, (void**)ddraw);
375 }
376
377 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw(IDirectDrawMediaStream *iface,
378 IDirectDraw *pDirectDraw)
379 {
380 FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
381
382 return E_NOTIMPL;
383 }
384
385 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample(IDirectDrawMediaStream *iface,
386 IDirectDrawSurface *surface, const RECT *rect, DWORD dwFlags,
387 IDirectDrawStreamSample **ppSample)
388 {
389 TRACE("(%p)->(%p,%s,%x,%p)\n", iface, surface, wine_dbgstr_rect(rect), dwFlags, ppSample);
390
391 return ddrawstreamsample_create(iface, surface, rect, ppSample);
392 }
393
394 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame(IDirectDrawMediaStream *iface,
395 STREAM_TIME *pFrameTime)
396 {
397 FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
398
399 return E_NOTIMPL;
400 }
401
402 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl =
403 {
404 /*** IUnknown methods ***/
405 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_QueryInterface,
406 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AddRef,
407 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Release,
408 /*** IMediaStream methods ***/
409 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetMultiMediaStream,
410 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetInformation,
411 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetSameFormat,
412 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_AllocateSample,
413 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSharedSample,
414 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SendEndOfStream,
415 /*** IDirectDrawMediaStream methods ***/
416 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetFormat,
417 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat,
418 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw,
419 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw,
420 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_CreateSample,
421 DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetTimePerFrame
422 };
423
424 HRESULT ddrawmediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
425 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
426 {
427 DirectDrawMediaStreamImpl *object;
428
429 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
430
431 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectDrawMediaStreamImpl));
432 if (!object)
433 return E_OUTOFMEMORY;
434
435 object->IAMMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IAMMediaStream_Vtbl;
436 object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStreamImpl_IDirectDrawMediaStream_Vtbl;
437 object->ref = 1;
438
439 object->parent = parent;
440 object->purpose_id = *purpose_id;
441 object->stream_type = stream_type;
442
443 *media_stream = &object->IAMMediaStream_iface;
444
445 return S_OK;
446 }
447
448 typedef struct {
449 IAMMediaStream IAMMediaStream_iface;
450 IAudioMediaStream IAudioMediaStream_iface;
451 LONG ref;
452 IMultiMediaStream* parent;
453 MSPID purpose_id;
454 STREAM_TYPE stream_type;
455 } AudioMediaStreamImpl;
456
457 static inline AudioMediaStreamImpl *impl_from_AudioMediaStream_IAMMediaStream(IAMMediaStream *iface)
458 {
459 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAMMediaStream_iface);
460 }
461
462 /*** IUnknown methods ***/
463 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_QueryInterface(IAMMediaStream *iface,
464 REFIID riid, void **ret_iface)
465 {
466 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
467
468 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
469
470 if (IsEqualGUID(riid, &IID_IUnknown) ||
471 IsEqualGUID(riid, &IID_IMediaStream) ||
472 IsEqualGUID(riid, &IID_IAMMediaStream))
473 {
474 IAMMediaStream_AddRef(iface);
475 *ret_iface = iface;
476 return S_OK;
477 }
478 else if (IsEqualGUID(riid, &IID_IAudioMediaStream))
479 {
480 IAMMediaStream_AddRef(iface);
481 *ret_iface = &This->IAudioMediaStream_iface;
482 return S_OK;
483 }
484
485 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
486 return E_NOINTERFACE;
487 }
488
489 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_AddRef(IAMMediaStream *iface)
490 {
491 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
492 ULONG ref = InterlockedIncrement(&This->ref);
493
494 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
495
496 return ref;
497 }
498
499 static ULONG WINAPI AudioMediaStreamImpl_IAMMediaStream_Release(IAMMediaStream *iface)
500 {
501 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
502 ULONG ref = InterlockedDecrement(&This->ref);
503
504 TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
505
506 if (!ref)
507 HeapFree(GetProcessHeap(), 0, This);
508
509 return ref;
510 }
511
512 /*** IMediaStream methods ***/
513 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface,
514 IMultiMediaStream** multi_media_stream)
515 {
516 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
517
518 TRACE("(%p/%p)->(%p)\n", This, iface, multi_media_stream);
519
520 if (!multi_media_stream)
521 return E_POINTER;
522
523 IMultiMediaStream_AddRef(This->parent);
524 *multi_media_stream = This->parent;
525
526 return S_OK;
527 }
528
529 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_GetInformation(IAMMediaStream *iface,
530 MSPID *purpose_id, STREAM_TYPE *type)
531 {
532 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
533
534 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
535
536 if (purpose_id)
537 *purpose_id = This->purpose_id;
538 if (type)
539 *type = This->stream_type;
540
541 return S_OK;
542 }
543
544 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetSameFormat(IAMMediaStream *iface,
545 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
546 {
547 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
548
549 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
550
551 return S_FALSE;
552 }
553
554 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_AllocateSample(IAMMediaStream *iface,
555 DWORD flags, IStreamSample **sample)
556 {
557 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
558
559 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, flags, sample);
560
561 return S_FALSE;
562 }
563
564 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface,
565 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
566 {
567 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
568
569 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, existing_sample, flags, sample);
570
571 return S_FALSE;
572 }
573
574 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
575 {
576 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
577
578 FIXME("(%p/%p)->(%x) stub!\n", This, iface, flags);
579
580 return S_FALSE;
581 }
582
583 /*** IAMMediaStream methods ***/
584 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags,
585 REFMSPID purpose_id, const STREAM_TYPE stream_type)
586 {
587 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
588
589 FIXME("(%p/%p)->(%p,%x,%p,%u) stub!\n", This, iface, source_object, flags, purpose_id, stream_type);
590
591 return S_FALSE;
592 }
593
594 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
595 {
596 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
597
598 FIXME("(%p/%p)->(%u) stub!\n", This, iface, state);
599
600 return S_FALSE;
601 }
602
603 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *am_multi_media_stream)
604 {
605 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
606
607 FIXME("(%p/%p)->(%p) stub!\n", This, iface, am_multi_media_stream);
608
609 return S_FALSE;
610 }
611
612 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *media_stream_filter)
613 {
614 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
615
616 FIXME("(%p/%p)->(%p) stub!\n", This, iface, media_stream_filter);
617
618 return S_FALSE;
619 }
620
621 static HRESULT WINAPI AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
622 {
623 AudioMediaStreamImpl *This = impl_from_AudioMediaStream_IAMMediaStream(iface);
624
625 FIXME("(%p/%p)->(%p) stub!\n", This, iface, filtergraph);
626
627 return S_FALSE;
628 }
629
630 static const struct IAMMediaStreamVtbl AudioMediaStreamImpl_IAMMediaStream_Vtbl =
631 {
632 /*** IUnknown methods ***/
633 AudioMediaStreamImpl_IAMMediaStream_QueryInterface,
634 AudioMediaStreamImpl_IAMMediaStream_AddRef,
635 AudioMediaStreamImpl_IAMMediaStream_Release,
636 /*** IMediaStream methods ***/
637 AudioMediaStreamImpl_IAMMediaStream_GetMultiMediaStream,
638 AudioMediaStreamImpl_IAMMediaStream_GetInformation,
639 AudioMediaStreamImpl_IAMMediaStream_SetSameFormat,
640 AudioMediaStreamImpl_IAMMediaStream_AllocateSample,
641 AudioMediaStreamImpl_IAMMediaStream_CreateSharedSample,
642 AudioMediaStreamImpl_IAMMediaStream_SendEndOfStream,
643 /*** IAMMediaStream methods ***/
644 AudioMediaStreamImpl_IAMMediaStream_Initialize,
645 AudioMediaStreamImpl_IAMMediaStream_SetState,
646 AudioMediaStreamImpl_IAMMediaStream_JoinAMMultiMediaStream,
647 AudioMediaStreamImpl_IAMMediaStream_JoinFilter,
648 AudioMediaStreamImpl_IAMMediaStream_JoinFilterGraph
649 };
650
651 static inline AudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
652 {
653 return CONTAINING_RECORD(iface, AudioMediaStreamImpl, IAudioMediaStream_iface);
654 }
655
656 /*** IUnknown methods ***/
657 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_QueryInterface(IAudioMediaStream *iface,
658 REFIID riid, void **ret_iface)
659 {
660 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
661 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
662 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
663 }
664
665 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_AddRef(IAudioMediaStream *iface)
666 {
667 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
668 TRACE("(%p/%p)\n", iface, This);
669 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
670 }
671
672 static ULONG WINAPI AudioMediaStreamImpl_IAudioMediaStream_Release(IAudioMediaStream *iface)
673 {
674 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
675 TRACE("(%p/%p)\n", iface, This);
676 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
677 }
678
679 /*** IMediaStream methods ***/
680 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream(IAudioMediaStream *iface,
681 IMultiMediaStream **multi_media_stream)
682 {
683 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
684
685 TRACE("(%p/%p)->(%p)\n", iface, This, multi_media_stream);
686
687 if (!multi_media_stream)
688 return E_POINTER;
689
690 IMultiMediaStream_AddRef(This->parent);
691 *multi_media_stream = This->parent;
692
693 return S_OK;
694 }
695
696 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetInformation(IAudioMediaStream *iface,
697 MSPID *purpose_id, STREAM_TYPE *type)
698 {
699 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
700
701 TRACE("(%p/%p)->(%p,%p)\n", iface, This, purpose_id, type);
702
703 if (purpose_id)
704 *purpose_id = This->purpose_id;
705 if (type)
706 *type = This->stream_type;
707
708 return S_OK;
709 }
710
711 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat(IAudioMediaStream *iface,
712 IMediaStream *stream_format, DWORD flags)
713 {
714 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
715
716 FIXME("(%p/%p)->(%p,%x) stub!\n", iface, This, stream_format, flags);
717
718 return S_FALSE;
719 }
720
721 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_AllocateSample(IAudioMediaStream *iface,
722 DWORD flags, IStreamSample **sample)
723 {
724 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
725
726 FIXME("(%p/%p)->(%x,%p) stub!\n", iface, This, flags, sample);
727
728 return S_FALSE;
729 }
730
731 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample(IAudioMediaStream *iface,
732 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
733 {
734 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
735
736 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface, This, existing_sample, flags, sample);
737
738 return S_FALSE;
739 }
740
741 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream(IAudioMediaStream *iface,
742 DWORD flags)
743 {
744 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
745
746 FIXME("(%p/%p)->(%x) stub!\n", iface, This, flags);
747
748 return S_FALSE;
749 }
750
751 /*** IAudioMediaStream methods ***/
752 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_GetFormat(IAudioMediaStream *iface, WAVEFORMATEX *wave_format_current)
753 {
754 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
755
756 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format_current);
757
758 if (!wave_format_current)
759 return E_POINTER;
760
761 return MS_E_NOSTREAM;
762
763 }
764
765 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_SetFormat(IAudioMediaStream *iface, const WAVEFORMATEX *wave_format)
766 {
767 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
768
769 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format);
770
771 return E_NOTIMPL;
772 }
773
774 static HRESULT WINAPI AudioMediaStreamImpl_IAudioMediaStream_CreateSample(IAudioMediaStream *iface, IAudioData *audio_data,
775 DWORD flags, IAudioStreamSample **sample)
776 {
777 AudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
778
779 TRACE("(%p/%p)->(%p,%u,%p)\n", iface, This, audio_data, flags, sample);
780
781 if (!audio_data)
782 return E_POINTER;
783
784 return audiostreamsample_create(iface, audio_data, sample);
785 }
786
787 static const struct IAudioMediaStreamVtbl AudioMediaStreamImpl_IAudioMediaStream_Vtbl =
788 {
789 /*** IUnknown methods ***/
790 AudioMediaStreamImpl_IAudioMediaStream_QueryInterface,
791 AudioMediaStreamImpl_IAudioMediaStream_AddRef,
792 AudioMediaStreamImpl_IAudioMediaStream_Release,
793 /*** IMediaStream methods ***/
794 AudioMediaStreamImpl_IAudioMediaStream_GetMultiMediaStream,
795 AudioMediaStreamImpl_IAudioMediaStream_GetInformation,
796 AudioMediaStreamImpl_IAudioMediaStream_SetSameFormat,
797 AudioMediaStreamImpl_IAudioMediaStream_AllocateSample,
798 AudioMediaStreamImpl_IAudioMediaStream_CreateSharedSample,
799 AudioMediaStreamImpl_IAudioMediaStream_SendEndOfStream,
800 /*** IAudioMediaStream methods ***/
801 AudioMediaStreamImpl_IAudioMediaStream_GetFormat,
802 AudioMediaStreamImpl_IAudioMediaStream_SetFormat,
803 AudioMediaStreamImpl_IAudioMediaStream_CreateSample
804 };
805
806 HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
807 STREAM_TYPE stream_type, IAMMediaStream **media_stream)
808 {
809 AudioMediaStreamImpl *object;
810
811 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
812
813 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AudioMediaStreamImpl));
814 if (!object)
815 return E_OUTOFMEMORY;
816
817 object->IAMMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAMMediaStream_Vtbl;
818 object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStreamImpl_IAudioMediaStream_Vtbl;
819 object->ref = 1;
820
821 object->parent = parent;
822 object->purpose_id = *purpose_id;
823 object->stream_type = stream_type;
824
825 *media_stream = &object->IAMMediaStream_iface;
826
827 return S_OK;
828 }
829
830 typedef struct {
831 IDirectDrawStreamSample IDirectDrawStreamSample_iface;
832 LONG ref;
833 IMediaStream *parent;
834 IDirectDrawSurface *surface;
835 RECT rect;
836 } IDirectDrawStreamSampleImpl;
837
838 static inline IDirectDrawStreamSampleImpl *impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample *iface)
839 {
840 return CONTAINING_RECORD(iface, IDirectDrawStreamSampleImpl, IDirectDrawStreamSample_iface);
841 }
842
843 /*** IUnknown methods ***/
844 static HRESULT WINAPI IDirectDrawStreamSampleImpl_QueryInterface(IDirectDrawStreamSample *iface,
845 REFIID riid, void **ret_iface)
846 {
847 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
848
849 if (IsEqualGUID(riid, &IID_IUnknown) ||
850 IsEqualGUID(riid, &IID_IStreamSample) ||
851 IsEqualGUID(riid, &IID_IDirectDrawStreamSample))
852 {
853 IDirectDrawStreamSample_AddRef(iface);
854 *ret_iface = iface;
855 return S_OK;
856 }
857
858 *ret_iface = NULL;
859
860 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
861 return E_NOINTERFACE;
862 }
863
864 static ULONG WINAPI IDirectDrawStreamSampleImpl_AddRef(IDirectDrawStreamSample *iface)
865 {
866 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
867 ULONG ref = InterlockedIncrement(&This->ref);
868
869 TRACE("(%p)->(): new ref = %u\n", iface, ref);
870
871 return ref;
872 }
873
874 static ULONG WINAPI IDirectDrawStreamSampleImpl_Release(IDirectDrawStreamSample *iface)
875 {
876 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
877 ULONG ref = InterlockedDecrement(&This->ref);
878
879 TRACE("(%p)->(): new ref = %u\n", iface, ref);
880
881 if (!ref)
882 {
883 if (This->surface)
884 IDirectDrawSurface_Release(This->surface);
885 IMediaStream_Release(This->parent);
886 HeapFree(GetProcessHeap(), 0, This);
887 }
888
889 return ref;
890 }
891
892 /*** IStreamSample methods ***/
893 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetMediaStream(IDirectDrawStreamSample *iface, IMediaStream **media_stream)
894 {
895 FIXME("(%p)->(%p): stub\n", iface, media_stream);
896
897 return E_NOTIMPL;
898 }
899
900 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSampleTimes(IDirectDrawStreamSample *iface, STREAM_TIME *start_time,
901 STREAM_TIME *end_time, STREAM_TIME *current_time)
902 {
903 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
904
905 return E_NOTIMPL;
906 }
907
908 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetSampleTimes(IDirectDrawStreamSample *iface, const STREAM_TIME *start_time,
909 const STREAM_TIME *end_time)
910 {
911 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
912
913 return E_NOTIMPL;
914 }
915
916 static HRESULT WINAPI IDirectDrawStreamSampleImpl_Update(IDirectDrawStreamSample *iface, DWORD flags, HANDLE event,
917 PAPCFUNC func_APC, DWORD APC_data)
918 {
919 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
920
921 return E_NOTIMPL;
922 }
923
924 static HRESULT WINAPI IDirectDrawStreamSampleImpl_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
925 {
926 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
927
928 return E_NOTIMPL;
929 }
930
931 /*** IDirectDrawStreamSample methods ***/
932 static HRESULT WINAPI IDirectDrawStreamSampleImpl_GetSurface(IDirectDrawStreamSample *iface, IDirectDrawSurface **ddraw_surface,
933 RECT *rect)
934 {
935 IDirectDrawStreamSampleImpl *This = impl_from_IDirectDrawStreamSample(iface);
936
937 TRACE("(%p)->(%p,%p)\n", iface, ddraw_surface, rect);
938
939 if (ddraw_surface)
940 {
941 *ddraw_surface = This->surface;
942 if (*ddraw_surface)
943 IDirectDrawSurface_AddRef(*ddraw_surface);
944 }
945
946 if (rect)
947 *rect = This->rect;
948
949 return S_OK;
950 }
951
952 static HRESULT WINAPI IDirectDrawStreamSampleImpl_SetRect(IDirectDrawStreamSample *iface, const RECT *rect)
953 {
954 FIXME("(%p)->(%p): stub\n", iface, rect);
955
956 return E_NOTIMPL;
957 }
958
959 static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl =
960 {
961 /*** IUnknown methods ***/
962 IDirectDrawStreamSampleImpl_QueryInterface,
963 IDirectDrawStreamSampleImpl_AddRef,
964 IDirectDrawStreamSampleImpl_Release,
965 /*** IStreamSample methods ***/
966 IDirectDrawStreamSampleImpl_GetMediaStream,
967 IDirectDrawStreamSampleImpl_GetSampleTimes,
968 IDirectDrawStreamSampleImpl_SetSampleTimes,
969 IDirectDrawStreamSampleImpl_Update,
970 IDirectDrawStreamSampleImpl_CompletionStatus,
971 /*** IDirectDrawStreamSample methods ***/
972 IDirectDrawStreamSampleImpl_GetSurface,
973 IDirectDrawStreamSampleImpl_SetRect
974 };
975
976 static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectDrawSurface *surface,
977 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample)
978 {
979 IDirectDrawStreamSampleImpl *object;
980 HRESULT hr;
981
982 TRACE("(%p)\n", ddraw_stream_sample);
983
984 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
985 if (!object)
986 return E_OUTOFMEMORY;
987
988 object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
989 object->ref = 1;
990 object->parent = (IMediaStream*)parent;
991 IMediaStream_AddRef(object->parent);
992
993 if (surface)
994 {
995 object->surface = surface;
996 IDirectDrawSurface_AddRef(surface);
997 }
998 else
999 {
1000 DDSURFACEDESC desc;
1001 IDirectDraw *ddraw;
1002
1003 hr = IDirectDrawMediaStream_GetDirectDraw(parent, &ddraw);
1004 if (FAILED(hr))
1005 {
1006 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1007 return hr;
1008 }
1009
1010 desc.dwSize = sizeof(desc);
1011 desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
1012 desc.dwHeight = 100;
1013 desc.dwWidth = 100;
1014 desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
1015 desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
1016 desc.ddpfPixelFormat.dwRGBBitCount = 32;
1017 desc.ddpfPixelFormat.dwRBitMask = 0xff0000;
1018 desc.ddpfPixelFormat.dwGBitMask = 0x00ff00;
1019 desc.ddpfPixelFormat.dwBBitMask = 0x0000ff;
1020 desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0;
1021 desc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN;
1022 desc.lpSurface = NULL;
1023
1024 hr = IDirectDraw_CreateSurface(ddraw, &desc, &object->surface, NULL);
1025 IDirectDraw_Release(ddraw);
1026 if (FAILED(hr))
1027 {
1028 ERR("failed to create surface, 0x%08x\n", hr);
1029 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1030 return hr;
1031 }
1032 }
1033
1034 if (rect)
1035 object->rect = *rect;
1036 else if (object->surface)
1037 {
1038 DDSURFACEDESC desc = { sizeof(desc) };
1039 hr = IDirectDrawSurface_GetSurfaceDesc(object->surface, &desc);
1040 if (hr == S_OK)
1041 SetRect(&object->rect, 0, 0, desc.dwWidth, desc.dwHeight);
1042 }
1043
1044 *ddraw_stream_sample = &object->IDirectDrawStreamSample_iface;
1045
1046 return S_OK;
1047 }
1048
1049 typedef struct {
1050 IAudioStreamSample IAudioStreamSample_iface;
1051 LONG ref;
1052 IMediaStream *parent;
1053 IAudioData *audio_data;
1054 } IAudioStreamSampleImpl;
1055
1056 static inline IAudioStreamSampleImpl *impl_from_IAudioStreamSample(IAudioStreamSample *iface)
1057 {
1058 return CONTAINING_RECORD(iface, IAudioStreamSampleImpl, IAudioStreamSample_iface);
1059 }
1060
1061 /*** IUnknown methods ***/
1062 static HRESULT WINAPI IAudioStreamSampleImpl_QueryInterface(IAudioStreamSample *iface,
1063 REFIID riid, void **ret_iface)
1064 {
1065 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
1066
1067 if (IsEqualGUID(riid, &IID_IUnknown) ||
1068 IsEqualGUID(riid, &IID_IStreamSample) ||
1069 IsEqualGUID(riid, &IID_IAudioStreamSample))
1070 {
1071 IAudioStreamSample_AddRef(iface);
1072 *ret_iface = iface;
1073 return S_OK;
1074 }
1075
1076 *ret_iface = NULL;
1077
1078 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
1079 return E_NOINTERFACE;
1080 }
1081
1082 static ULONG WINAPI IAudioStreamSampleImpl_AddRef(IAudioStreamSample *iface)
1083 {
1084 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1085 ULONG ref = InterlockedIncrement(&This->ref);
1086
1087 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1088
1089 return ref;
1090 }
1091
1092 static ULONG WINAPI IAudioStreamSampleImpl_Release(IAudioStreamSample *iface)
1093 {
1094 IAudioStreamSampleImpl *This = impl_from_IAudioStreamSample(iface);
1095 ULONG ref = InterlockedDecrement(&This->ref);
1096
1097 TRACE("(%p)->(): new ref = %u\n", iface, ref);
1098
1099 if (!ref)
1100 HeapFree(GetProcessHeap(), 0, This);
1101
1102 return ref;
1103 }
1104
1105 /*** IStreamSample methods ***/
1106 static HRESULT WINAPI IAudioStreamSampleImpl_GetMediaStream(IAudioStreamSample *iface, IMediaStream **media_stream)
1107 {
1108 FIXME("(%p)->(%p): stub\n", iface, media_stream);
1109
1110 return E_NOTIMPL;
1111 }
1112
1113 static HRESULT WINAPI IAudioStreamSampleImpl_GetSampleTimes(IAudioStreamSample *iface, STREAM_TIME *start_time,
1114 STREAM_TIME *end_time, STREAM_TIME *current_time)
1115 {
1116 FIXME("(%p)->(%p,%p,%p): stub\n", iface, start_time, end_time, current_time);
1117
1118 return E_NOTIMPL;
1119 }
1120
1121 static HRESULT WINAPI IAudioStreamSampleImpl_SetSampleTimes(IAudioStreamSample *iface, const STREAM_TIME *start_time,
1122 const STREAM_TIME *end_time)
1123 {
1124 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
1125
1126 return E_NOTIMPL;
1127 }
1128
1129 static HRESULT WINAPI IAudioStreamSampleImpl_Update(IAudioStreamSample *iface, DWORD flags, HANDLE event,
1130 PAPCFUNC func_APC, DWORD APC_data)
1131 {
1132 FIXME("(%p)->(%x,%p,%p,%u): stub\n", iface, flags, event, func_APC, APC_data);
1133
1134 return E_NOTIMPL;
1135 }
1136
1137 static HRESULT WINAPI IAudioStreamSampleImpl_CompletionStatus(IAudioStreamSample *iface, DWORD flags, DWORD milliseconds)
1138 {
1139 FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
1140
1141 return E_NOTIMPL;
1142 }
1143
1144 /*** IAudioStreamSample methods ***/
1145 static HRESULT WINAPI IAudioStreamSampleImpl_GetAudioData(IAudioStreamSample *iface, IAudioData **audio_data)
1146 {
1147 FIXME("(%p)->(%p): stub\n", iface, audio_data);
1148
1149 return E_NOTIMPL;
1150 }
1151
1152 static const struct IAudioStreamSampleVtbl AudioStreamSample_Vtbl =
1153 {
1154 /*** IUnknown methods ***/
1155 IAudioStreamSampleImpl_QueryInterface,
1156 IAudioStreamSampleImpl_AddRef,
1157 IAudioStreamSampleImpl_Release,
1158 /*** IStreamSample methods ***/
1159 IAudioStreamSampleImpl_GetMediaStream,
1160 IAudioStreamSampleImpl_GetSampleTimes,
1161 IAudioStreamSampleImpl_SetSampleTimes,
1162 IAudioStreamSampleImpl_Update,
1163 IAudioStreamSampleImpl_CompletionStatus,
1164 /*** IAudioStreamSample methods ***/
1165 IAudioStreamSampleImpl_GetAudioData
1166 };
1167
1168 static HRESULT audiostreamsample_create(IAudioMediaStream *parent, IAudioData *audio_data, IAudioStreamSample **audio_stream_sample)
1169 {
1170 IAudioStreamSampleImpl *object;
1171
1172 TRACE("(%p)\n", audio_stream_sample);
1173
1174 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioStreamSampleImpl));
1175 if (!object)
1176 return E_OUTOFMEMORY;
1177
1178 object->IAudioStreamSample_iface.lpVtbl = &AudioStreamSample_Vtbl;
1179 object->ref = 1;
1180 object->parent = (IMediaStream*)parent;
1181 object->audio_data = audio_data;
1182
1183 *audio_stream_sample = (IAudioStreamSample*)&object->IAudioStreamSample_iface;
1184
1185 return S_OK;
1186 }