amstream: Add IAudioMediaStream stub implementation.
[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 typedef struct {
36     IDirectDrawMediaStream IDirectDrawMediaStream_iface;
37     LONG ref;
38     IMultiMediaStream* Parent;
39     MSPID PurposeId;
40     STREAM_TYPE StreamType;
41 } IDirectDrawMediaStreamImpl;
42
43 static inline IDirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
44 {
45     return CONTAINING_RECORD(iface, IDirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
46 }
47
48 /*** IUnknown methods ***/
49 static HRESULT WINAPI IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream *iface,
50         REFIID riid, void **ppv)
51 {
52     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
53
54     TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppv);
55
56     if (IsEqualGUID(riid, &IID_IUnknown) ||
57         IsEqualGUID(riid, &IID_IMediaStream) ||
58         IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
59     {
60         IUnknown_AddRef(iface);
61         *ppv = This;
62         return S_OK;
63     }
64
65     ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv);
66     return E_NOINTERFACE;
67 }
68
69 static ULONG WINAPI IDirectDrawMediaStreamImpl_AddRef(IDirectDrawMediaStream *iface)
70 {
71     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
72
73     TRACE("(%p/%p)\n", iface, This);
74
75     return InterlockedIncrement(&This->ref);
76 }
77
78 static ULONG WINAPI IDirectDrawMediaStreamImpl_Release(IDirectDrawMediaStream *iface)
79 {
80     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
81     ULONG ref = InterlockedDecrement(&This->ref);
82
83     TRACE("(%p/%p)\n", iface, This);
84
85     if (!ref)
86         HeapFree(GetProcessHeap(), 0, This);
87
88     return ref;
89 }
90
91 /*** IMediaStream methods ***/
92 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetMultiMediaStream(IDirectDrawMediaStream *iface,
93         IMultiMediaStream** ppMultiMediaStream)
94 {
95     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
96
97     FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppMultiMediaStream);
98
99     return S_FALSE;
100 }
101
102 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetInformation(IDirectDrawMediaStream *iface,
103         MSPID *pPurposeId, STREAM_TYPE *pType)
104 {
105     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
106
107     TRACE("(%p/%p)->(%p,%p)\n", This, iface, pPurposeId, pType);
108
109     if (pPurposeId)
110         *pPurposeId = This->PurposeId;
111     if (pType)
112         *pType = This->StreamType;
113
114     return S_OK;
115 }
116
117 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetSameFormat(IDirectDrawMediaStream *iface,
118         IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
119 {
120     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
121
122     FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
123
124     return S_FALSE;
125 }
126
127 static HRESULT WINAPI IDirectDrawMediaStreamImpl_AllocateSample(IDirectDrawMediaStream *iface,
128         DWORD dwFlags, IStreamSample **ppSample)
129 {
130     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
131
132     FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
133
134     return S_FALSE;
135 }
136
137 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSharedSample(IDirectDrawMediaStream *iface,
138         IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
139 {
140     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
141
142     FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
143
144     return S_FALSE;
145 }
146
147 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SendEndOfStream(IDirectDrawMediaStream *iface,
148         DWORD dwFlags)
149 {
150     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
151
152     FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
153
154     return S_FALSE;
155 }
156
157 /*** IDirectDrawMediaStream methods ***/
158 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream *iface,
159         DDSURFACEDESC *pDDSDCurrent, IDirectDrawPalette **ppDirectDrawPalette,
160         DDSURFACEDESC *pDDSDDesired, DWORD *pdwFlags)
161 {
162     FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, pDDSDCurrent, ppDirectDrawPalette, pDDSDDesired,
163             pdwFlags);
164
165     return E_NOTIMPL;
166
167 }
168
169 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream *iface,
170         const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
171 {
172     FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
173
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream *iface,
178         IDirectDraw **ppDirectDraw)
179 {
180     FIXME("(%p)->(%p) stub!\n", iface, ppDirectDraw);
181
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream *iface,
186         IDirectDraw *pDirectDraw)
187 {
188     FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
189
190     return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream *iface,
194         IDirectDrawSurface *pSurface, const RECT *pRect, DWORD dwFlags,
195         IDirectDrawStreamSample **ppSample)
196 {
197     FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface, pSurface, pRect, dwFlags, ppSample);
198
199     return E_NOTIMPL;
200 }
201
202 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream *iface,
203         STREAM_TIME *pFrameTime)
204 {
205     FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
206
207     return E_NOTIMPL;
208 }
209
210 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl =
211 {
212     /*** IUnknown methods ***/
213     IDirectDrawMediaStreamImpl_QueryInterface,
214     IDirectDrawMediaStreamImpl_AddRef,
215     IDirectDrawMediaStreamImpl_Release,
216     /*** IMediaStream methods ***/
217     IDirectDrawMediaStreamImpl_GetMultiMediaStream,
218     IDirectDrawMediaStreamImpl_GetInformation,
219     IDirectDrawMediaStreamImpl_SetSameFormat,
220     IDirectDrawMediaStreamImpl_AllocateSample,
221     IDirectDrawMediaStreamImpl_CreateSharedSample,
222     IDirectDrawMediaStreamImpl_SendEndOfStream,
223     /*** IDirectDrawMediaStream methods ***/
224     IDirectDrawMediaStreamImpl_GetFormat,
225     IDirectDrawMediaStreamImpl_SetFormat,
226     IDirectDrawMediaStreamImpl_GetDirectDraw,
227     IDirectDrawMediaStreamImpl_SetDirectDraw,
228     IDirectDrawMediaStreamImpl_CreateSample,
229     IDirectDrawMediaStreamImpl_GetTimePerFrame
230 };
231
232 HRESULT ddrawmediastream_create(IMultiMediaStream *Parent, const MSPID *pPurposeId,
233         STREAM_TYPE StreamType, IMediaStream **ppMediaStream)
234 {
235     IDirectDrawMediaStreamImpl *object;
236
237     TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
238
239     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawMediaStreamImpl));
240     if (!object)
241     {
242         ERR("Out of memory\n");
243         return E_OUTOFMEMORY;
244     }
245
246     object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStream_Vtbl;
247     object->ref = 1;
248
249     object->Parent = Parent;
250     object->PurposeId = *pPurposeId;
251     object->StreamType = StreamType;
252
253     *ppMediaStream = (IMediaStream*)&object->IDirectDrawMediaStream_iface;
254
255     return S_OK;
256 }
257
258 typedef struct {
259     IAudioMediaStream IAudioMediaStream_iface;
260     LONG ref;
261     IMultiMediaStream* parent;
262     MSPID purpose_id;
263     STREAM_TYPE stream_type;
264 } IAudioMediaStreamImpl;
265
266 static inline IAudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
267 {
268     return CONTAINING_RECORD(iface, IAudioMediaStreamImpl, IAudioMediaStream_iface);
269 }
270
271 /*** IUnknown methods ***/
272 static HRESULT WINAPI IAudioMediaStreamImpl_QueryInterface(IAudioMediaStream *iface,
273         REFIID riid, void **ret_iface)
274 {
275     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
276
277     TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
278
279     if (IsEqualGUID(riid, &IID_IUnknown) ||
280         IsEqualGUID(riid, &IID_IMediaStream) ||
281         IsEqualGUID(riid, &IID_IAudioMediaStream))
282     {
283         IAudioMediaStream_AddRef(iface);
284         *ret_iface = iface;
285         return S_OK;
286     }
287
288     *ret_iface = NULL;
289
290     ERR("(%p/%p)->(%s,%p),not found\n", iface, This, debugstr_guid(riid), ret_iface);
291     return E_NOINTERFACE;
292 }
293
294 static ULONG WINAPI IAudioMediaStreamImpl_AddRef(IAudioMediaStream *iface)
295 {
296     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
297     ULONG ref = InterlockedIncrement(&This->ref);
298
299     TRACE("(%p/%p): new ref = %u\n", iface, This, ref);
300
301     return ref;
302 }
303
304 static ULONG WINAPI IAudioMediaStreamImpl_Release(IAudioMediaStream *iface)
305 {
306     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
307     ULONG ref = InterlockedDecrement(&This->ref);
308
309     TRACE("(%p/%p): new ref = %u\n", iface, This, ref);
310
311     if (!ref)
312         HeapFree(GetProcessHeap(), 0, This);
313
314     return ref;
315 }
316
317 /*** IMediaStream methods ***/
318 static HRESULT WINAPI IAudioMediaStreamImpl_GetMultiMediaStream(IAudioMediaStream *iface,
319         IMultiMediaStream** multimedia_stream)
320 {
321     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
322
323     FIXME("(%p/%p)->(%p) stub!\n", iface, This, multimedia_stream);
324
325     return S_FALSE;
326 }
327
328 static HRESULT WINAPI IAudioMediaStreamImpl_GetInformation(IAudioMediaStream *iface,
329         MSPID *purpose_id, STREAM_TYPE *type)
330 {
331     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
332
333     TRACE("(%p/%p)->(%p,%p)\n", iface, This, purpose_id, type);
334
335     if (purpose_id)
336         *purpose_id = This->purpose_id;
337     if (type)
338         *type = This->stream_type;
339
340     return S_OK;
341 }
342
343 static HRESULT WINAPI IAudioMediaStreamImpl_SetSameFormat(IAudioMediaStream *iface,
344         IMediaStream *stream_format, DWORD flags)
345 {
346     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
347
348     FIXME("(%p/%p)->(%p,%x) stub!\n", iface, This, stream_format, flags);
349
350     return S_FALSE;
351 }
352
353 static HRESULT WINAPI IAudioMediaStreamImpl_AllocateSample(IAudioMediaStream *iface,
354         DWORD flags, IStreamSample **sample)
355 {
356     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
357
358     FIXME("(%p/%p)->(%x,%p) stub!\n", iface, This, flags, sample);
359
360     return S_FALSE;
361 }
362
363 static HRESULT WINAPI IAudioMediaStreamImpl_CreateSharedSample(IAudioMediaStream *iface,
364         IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
365 {
366     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
367
368     FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface, This, existing_sample, flags, sample);
369
370     return S_FALSE;
371 }
372
373 static HRESULT WINAPI IAudioMediaStreamImpl_SendEndOfStream(IAudioMediaStream *iface,
374         DWORD flags)
375 {
376     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
377
378     FIXME("(%p/%p)->(%x) stub!\n", iface, This, flags);
379
380     return S_FALSE;
381 }
382
383 /*** IAudioMediaStream methods ***/
384 static HRESULT WINAPI IAudioMediaStreamImpl_GetFormat(IAudioMediaStream *iface, WAVEFORMATEX *wave_format_current)
385 {
386     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
387
388     FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format_current);
389
390     return E_NOTIMPL;
391
392 }
393
394 static HRESULT WINAPI IAudioMediaStreamImpl_SetFormat(IAudioMediaStream *iface, const WAVEFORMATEX *wave_format)
395 {
396     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
397
398     FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format);
399
400     return E_NOTIMPL;
401 }
402
403 static HRESULT WINAPI IAudioMediaStreamImpl_CreateSample(IAudioMediaStream *iface, IAudioData *audio_data,
404                                                          DWORD flags, IAudioStreamSample **sample)
405 {
406     IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
407
408     FIXME("(%p/%p)->(%p,%u,%p) stub!\n", iface, This, audio_data, flags, sample);
409
410     return E_NOTIMPL;
411 }
412
413 static const struct IAudioMediaStreamVtbl AudioMediaStream_Vtbl =
414 {
415     /*** IUnknown methods ***/
416     IAudioMediaStreamImpl_QueryInterface,
417     IAudioMediaStreamImpl_AddRef,
418     IAudioMediaStreamImpl_Release,
419     /*** IMediaStream methods ***/
420     IAudioMediaStreamImpl_GetMultiMediaStream,
421     IAudioMediaStreamImpl_GetInformation,
422     IAudioMediaStreamImpl_SetSameFormat,
423     IAudioMediaStreamImpl_AllocateSample,
424     IAudioMediaStreamImpl_CreateSharedSample,
425     IAudioMediaStreamImpl_SendEndOfStream,
426     /*** IAudioMediaStream methods ***/
427     IAudioMediaStreamImpl_GetFormat,
428     IAudioMediaStreamImpl_SetFormat,
429     IAudioMediaStreamImpl_CreateSample
430 };
431
432 HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
433         STREAM_TYPE stream_type, IMediaStream **media_stream)
434 {
435     IAudioMediaStreamImpl *object;
436
437     TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
438
439     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioMediaStreamImpl));
440     if (!object)
441     {
442         ERR("Out of memory\n");
443         return E_OUTOFMEMORY;
444     }
445
446     object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStream_Vtbl;
447     object->ref = 1;
448
449     object->parent = parent;
450     object->purpose_id = *purpose_id;
451     object->stream_type = stream_type;
452
453     *media_stream = (IMediaStream*)&object->IAudioMediaStream_iface;
454
455     return S_OK;
456 }