amstream: Add IAudioMediaStream stub implementation.
[wine/multimedia.git] / dlls / amstream / mediastream.c
blobafebdcdc51b5bc2cc46d6841fb4fd20eddd35967
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"
29 #include "amstream.h"
31 #include "ddstream.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
35 typedef struct {
36 IDirectDrawMediaStream IDirectDrawMediaStream_iface;
37 LONG ref;
38 IMultiMediaStream* Parent;
39 MSPID PurposeId;
40 STREAM_TYPE StreamType;
41 } IDirectDrawMediaStreamImpl;
43 static inline IDirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
45 return CONTAINING_RECORD(iface, IDirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
48 /*** IUnknown methods ***/
49 static HRESULT WINAPI IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream *iface,
50 REFIID riid, void **ppv)
52 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
54 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppv);
56 if (IsEqualGUID(riid, &IID_IUnknown) ||
57 IsEqualGUID(riid, &IID_IMediaStream) ||
58 IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
60 IUnknown_AddRef(iface);
61 *ppv = This;
62 return S_OK;
65 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv);
66 return E_NOINTERFACE;
69 static ULONG WINAPI IDirectDrawMediaStreamImpl_AddRef(IDirectDrawMediaStream *iface)
71 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
73 TRACE("(%p/%p)\n", iface, This);
75 return InterlockedIncrement(&This->ref);
78 static ULONG WINAPI IDirectDrawMediaStreamImpl_Release(IDirectDrawMediaStream *iface)
80 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
81 ULONG ref = InterlockedDecrement(&This->ref);
83 TRACE("(%p/%p)\n", iface, This);
85 if (!ref)
86 HeapFree(GetProcessHeap(), 0, This);
88 return ref;
91 /*** IMediaStream methods ***/
92 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetMultiMediaStream(IDirectDrawMediaStream *iface,
93 IMultiMediaStream** ppMultiMediaStream)
95 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
97 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppMultiMediaStream);
99 return S_FALSE;
102 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetInformation(IDirectDrawMediaStream *iface,
103 MSPID *pPurposeId, STREAM_TYPE *pType)
105 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
107 TRACE("(%p/%p)->(%p,%p)\n", This, iface, pPurposeId, pType);
109 if (pPurposeId)
110 *pPurposeId = This->PurposeId;
111 if (pType)
112 *pType = This->StreamType;
114 return S_OK;
117 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetSameFormat(IDirectDrawMediaStream *iface,
118 IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
120 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
122 FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
124 return S_FALSE;
127 static HRESULT WINAPI IDirectDrawMediaStreamImpl_AllocateSample(IDirectDrawMediaStream *iface,
128 DWORD dwFlags, IStreamSample **ppSample)
130 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
132 FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
134 return S_FALSE;
137 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSharedSample(IDirectDrawMediaStream *iface,
138 IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
140 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
142 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
144 return S_FALSE;
147 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SendEndOfStream(IDirectDrawMediaStream *iface,
148 DWORD dwFlags)
150 IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
152 FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
154 return S_FALSE;
157 /*** IDirectDrawMediaStream methods ***/
158 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream *iface,
159 DDSURFACEDESC *pDDSDCurrent, IDirectDrawPalette **ppDirectDrawPalette,
160 DDSURFACEDESC *pDDSDDesired, DWORD *pdwFlags)
162 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, pDDSDCurrent, ppDirectDrawPalette, pDDSDDesired,
163 pdwFlags);
165 return E_NOTIMPL;
169 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream *iface,
170 const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
172 FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
174 return E_NOTIMPL;
177 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream *iface,
178 IDirectDraw **ppDirectDraw)
180 FIXME("(%p)->(%p) stub!\n", iface, ppDirectDraw);
182 return E_NOTIMPL;
185 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream *iface,
186 IDirectDraw *pDirectDraw)
188 FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
190 return E_NOTIMPL;
193 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream *iface,
194 IDirectDrawSurface *pSurface, const RECT *pRect, DWORD dwFlags,
195 IDirectDrawStreamSample **ppSample)
197 FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface, pSurface, pRect, dwFlags, ppSample);
199 return E_NOTIMPL;
202 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream *iface,
203 STREAM_TIME *pFrameTime)
205 FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
207 return E_NOTIMPL;
210 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl =
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
232 HRESULT ddrawmediastream_create(IMultiMediaStream *Parent, const MSPID *pPurposeId,
233 STREAM_TYPE StreamType, IMediaStream **ppMediaStream)
235 IDirectDrawMediaStreamImpl *object;
237 TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
239 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawMediaStreamImpl));
240 if (!object)
242 ERR("Out of memory\n");
243 return E_OUTOFMEMORY;
246 object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStream_Vtbl;
247 object->ref = 1;
249 object->Parent = Parent;
250 object->PurposeId = *pPurposeId;
251 object->StreamType = StreamType;
253 *ppMediaStream = (IMediaStream*)&object->IDirectDrawMediaStream_iface;
255 return S_OK;
258 typedef struct {
259 IAudioMediaStream IAudioMediaStream_iface;
260 LONG ref;
261 IMultiMediaStream* parent;
262 MSPID purpose_id;
263 STREAM_TYPE stream_type;
264 } IAudioMediaStreamImpl;
266 static inline IAudioMediaStreamImpl *impl_from_IAudioMediaStream(IAudioMediaStream *iface)
268 return CONTAINING_RECORD(iface, IAudioMediaStreamImpl, IAudioMediaStream_iface);
271 /*** IUnknown methods ***/
272 static HRESULT WINAPI IAudioMediaStreamImpl_QueryInterface(IAudioMediaStream *iface,
273 REFIID riid, void **ret_iface)
275 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
277 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
279 if (IsEqualGUID(riid, &IID_IUnknown) ||
280 IsEqualGUID(riid, &IID_IMediaStream) ||
281 IsEqualGUID(riid, &IID_IAudioMediaStream))
283 IAudioMediaStream_AddRef(iface);
284 *ret_iface = iface;
285 return S_OK;
288 *ret_iface = NULL;
290 ERR("(%p/%p)->(%s,%p),not found\n", iface, This, debugstr_guid(riid), ret_iface);
291 return E_NOINTERFACE;
294 static ULONG WINAPI IAudioMediaStreamImpl_AddRef(IAudioMediaStream *iface)
296 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
297 ULONG ref = InterlockedIncrement(&This->ref);
299 TRACE("(%p/%p): new ref = %u\n", iface, This, ref);
301 return ref;
304 static ULONG WINAPI IAudioMediaStreamImpl_Release(IAudioMediaStream *iface)
306 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
307 ULONG ref = InterlockedDecrement(&This->ref);
309 TRACE("(%p/%p): new ref = %u\n", iface, This, ref);
311 if (!ref)
312 HeapFree(GetProcessHeap(), 0, This);
314 return ref;
317 /*** IMediaStream methods ***/
318 static HRESULT WINAPI IAudioMediaStreamImpl_GetMultiMediaStream(IAudioMediaStream *iface,
319 IMultiMediaStream** multimedia_stream)
321 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
323 FIXME("(%p/%p)->(%p) stub!\n", iface, This, multimedia_stream);
325 return S_FALSE;
328 static HRESULT WINAPI IAudioMediaStreamImpl_GetInformation(IAudioMediaStream *iface,
329 MSPID *purpose_id, STREAM_TYPE *type)
331 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
333 TRACE("(%p/%p)->(%p,%p)\n", iface, This, purpose_id, type);
335 if (purpose_id)
336 *purpose_id = This->purpose_id;
337 if (type)
338 *type = This->stream_type;
340 return S_OK;
343 static HRESULT WINAPI IAudioMediaStreamImpl_SetSameFormat(IAudioMediaStream *iface,
344 IMediaStream *stream_format, DWORD flags)
346 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
348 FIXME("(%p/%p)->(%p,%x) stub!\n", iface, This, stream_format, flags);
350 return S_FALSE;
353 static HRESULT WINAPI IAudioMediaStreamImpl_AllocateSample(IAudioMediaStream *iface,
354 DWORD flags, IStreamSample **sample)
356 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
358 FIXME("(%p/%p)->(%x,%p) stub!\n", iface, This, flags, sample);
360 return S_FALSE;
363 static HRESULT WINAPI IAudioMediaStreamImpl_CreateSharedSample(IAudioMediaStream *iface,
364 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
366 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
368 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", iface, This, existing_sample, flags, sample);
370 return S_FALSE;
373 static HRESULT WINAPI IAudioMediaStreamImpl_SendEndOfStream(IAudioMediaStream *iface,
374 DWORD flags)
376 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
378 FIXME("(%p/%p)->(%x) stub!\n", iface, This, flags);
380 return S_FALSE;
383 /*** IAudioMediaStream methods ***/
384 static HRESULT WINAPI IAudioMediaStreamImpl_GetFormat(IAudioMediaStream *iface, WAVEFORMATEX *wave_format_current)
386 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
388 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format_current);
390 return E_NOTIMPL;
394 static HRESULT WINAPI IAudioMediaStreamImpl_SetFormat(IAudioMediaStream *iface, const WAVEFORMATEX *wave_format)
396 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
398 FIXME("(%p/%p)->(%p) stub!\n", iface, This, wave_format);
400 return E_NOTIMPL;
403 static HRESULT WINAPI IAudioMediaStreamImpl_CreateSample(IAudioMediaStream *iface, IAudioData *audio_data,
404 DWORD flags, IAudioStreamSample **sample)
406 IAudioMediaStreamImpl *This = impl_from_IAudioMediaStream(iface);
408 FIXME("(%p/%p)->(%p,%u,%p) stub!\n", iface, This, audio_data, flags, sample);
410 return E_NOTIMPL;
413 static const struct IAudioMediaStreamVtbl AudioMediaStream_Vtbl =
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
432 HRESULT audiomediastream_create(IMultiMediaStream *parent, const MSPID *purpose_id,
433 STREAM_TYPE stream_type, IMediaStream **media_stream)
435 IAudioMediaStreamImpl *object;
437 TRACE("(%p,%s,%p)\n", parent, debugstr_guid(purpose_id), media_stream);
439 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAudioMediaStreamImpl));
440 if (!object)
442 ERR("Out of memory\n");
443 return E_OUTOFMEMORY;
446 object->IAudioMediaStream_iface.lpVtbl = &AudioMediaStream_Vtbl;
447 object->ref = 1;
449 object->parent = parent;
450 object->purpose_id = *purpose_id;
451 object->stream_type = stream_type;
453 *media_stream = (IMediaStream*)&object->IAudioMediaStream_iface;
455 return S_OK;