2 * Implementation of IAudioData Interface
4 * Copyright 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"
26 #include "amstream_private.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(amstream
);
31 IAudioData IAudioData_iface
;
37 WAVEFORMATEX wave_format
;
40 static inline AMAudioDataImpl
*impl_from_IAudioData(IAudioData
*iface
)
42 return CONTAINING_RECORD(iface
, AMAudioDataImpl
, IAudioData_iface
);
45 /*** IUnknown methods ***/
46 static HRESULT WINAPI
IAudioDataImpl_QueryInterface(IAudioData
*iface
, REFIID riid
, void **ret_iface
)
48 TRACE("(%p)->(%s,%p)\n", iface
, debugstr_guid(riid
), ret_iface
);
50 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
51 IsEqualGUID(riid
, &IID_IAudioData
))
53 IAudioData_AddRef(iface
);
58 ERR("(%p)->(%s,%p),not found\n", iface
, debugstr_guid(riid
), ret_iface
);
62 static ULONG WINAPI
IAudioDataImpl_AddRef(IAudioData
* iface
)
64 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
65 ULONG ref
= InterlockedIncrement(&This
->ref
);
67 TRACE("(%p)->(): new ref = %u\n", iface
, This
->ref
);
72 static ULONG WINAPI
IAudioDataImpl_Release(IAudioData
* iface
)
74 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
75 ULONG ref
= InterlockedDecrement(&This
->ref
);
77 TRACE("(%p)->(): new ref = %u\n", iface
, This
->ref
);
83 CoTaskMemFree(This
->data
);
86 HeapFree(GetProcessHeap(), 0, This
);
92 /*** IMemoryData methods ***/
93 static HRESULT WINAPI
IAudioDataImpl_SetBuffer(IAudioData
* iface
, DWORD size
, BYTE
*data
, DWORD flags
)
95 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
97 TRACE("(%p)->(%u,%p,%x)\n", iface
, size
, data
, flags
);
104 if (This
->data_owned
)
106 CoTaskMemFree(This
->data
);
107 This
->data_owned
= FALSE
;
115 This
->data
= CoTaskMemAlloc(This
->size
);
116 This
->data_owned
= TRUE
;
119 return E_OUTOFMEMORY
;
126 static HRESULT WINAPI
IAudioDataImpl_GetInfo(IAudioData
* iface
, DWORD
*length
, BYTE
**data
, DWORD
*actual_data
)
128 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
130 TRACE("(%p)->(%p,%p,%p)\n", iface
, length
, data
, actual_data
);
139 *length
= This
->size
;
147 *actual_data
= This
->actual_data
;
153 static HRESULT WINAPI
IAudioDataImpl_SetActual(IAudioData
* iface
, DWORD data_valid
)
155 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
157 TRACE("(%p)->(%u)\n", iface
, data_valid
);
159 if (data_valid
> This
->size
)
164 This
->actual_data
= data_valid
;
169 /*** IAudioData methods ***/
170 static HRESULT WINAPI
IAudioDataImpl_GetFormat(IAudioData
* iface
, WAVEFORMATEX
*wave_format_current
)
172 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
174 TRACE("(%p)->(%p)\n", iface
, wave_format_current
);
176 if (!wave_format_current
)
181 *wave_format_current
= This
->wave_format
;
186 static HRESULT WINAPI
IAudioDataImpl_SetFormat(IAudioData
* iface
, const WAVEFORMATEX
*wave_format
)
188 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
190 TRACE("(%p)->(%p)\n", iface
, wave_format
);
197 if (WAVE_FORMAT_PCM
!= wave_format
->wFormatTag
)
202 This
->wave_format
= *wave_format
;
207 static const struct IAudioDataVtbl AudioData_Vtbl
=
209 /*** IUnknown methods ***/
210 IAudioDataImpl_QueryInterface
,
211 IAudioDataImpl_AddRef
,
212 IAudioDataImpl_Release
,
213 /*** IMemoryData methods ***/
214 IAudioDataImpl_SetBuffer
,
215 IAudioDataImpl_GetInfo
,
216 IAudioDataImpl_SetActual
,
217 /*** IAudioData methods ***/
218 IAudioDataImpl_GetFormat
,
219 IAudioDataImpl_SetFormat
222 HRESULT
AMAudioData_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
224 AMAudioDataImpl
*object
;
226 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
229 return CLASS_E_NOAGGREGATION
;
231 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(AMAudioDataImpl
));
233 return E_OUTOFMEMORY
;
235 object
->IAudioData_iface
.lpVtbl
= &AudioData_Vtbl
;
238 object
->wave_format
.wFormatTag
= WAVE_FORMAT_PCM
;
239 object
->wave_format
.nChannels
= 1;
240 object
->wave_format
.nSamplesPerSec
= 11025;
241 object
->wave_format
.wBitsPerSample
= 16;
242 object
->wave_format
.nBlockAlign
= object
->wave_format
.wBitsPerSample
* object
->wave_format
.nChannels
/ 8;
243 object
->wave_format
.nAvgBytesPerSec
= object
->wave_format
.nBlockAlign
* object
->wave_format
.nSamplesPerSec
;
245 *ppObj
= &object
->IAudioData_iface
;