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(quartz
);
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 = %lu\n", iface
, This
->ref
);
72 static ULONG WINAPI
IAudioDataImpl_Release(IAudioData
* iface
)
74 AMAudioDataImpl
*audiodata
= impl_from_IAudioData(iface
);
75 ULONG ref
= InterlockedDecrement(&audiodata
->ref
);
77 TRACE("%p decreasing refcount to %lu.\n", audiodata
, ref
);
81 if (audiodata
->data_owned
)
82 free(audiodata
->data
);
89 /*** IMemoryData methods ***/
90 static HRESULT WINAPI
IAudioDataImpl_SetBuffer(IAudioData
* iface
, DWORD size
, BYTE
*data
, DWORD flags
)
92 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
94 TRACE("(%p)->(%lu,%p,%lx)\n", iface
, size
, data
, flags
);
101 if (This
->data_owned
)
104 This
->data_owned
= FALSE
;
112 This
->data
= malloc(This
->size
);
113 This
->data_owned
= TRUE
;
116 return E_OUTOFMEMORY
;
123 static HRESULT WINAPI
IAudioDataImpl_GetInfo(IAudioData
* iface
, DWORD
*length
, BYTE
**data
, DWORD
*actual_data
)
125 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
127 TRACE("(%p)->(%p,%p,%p)\n", iface
, length
, data
, actual_data
);
136 *length
= This
->size
;
144 *actual_data
= This
->actual_data
;
150 static HRESULT WINAPI
IAudioDataImpl_SetActual(IAudioData
* iface
, DWORD data_valid
)
152 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
154 TRACE("(%p)->(%lu)\n", iface
, data_valid
);
156 if (data_valid
> This
->size
)
161 This
->actual_data
= data_valid
;
166 /*** IAudioData methods ***/
167 static HRESULT WINAPI
IAudioDataImpl_GetFormat(IAudioData
* iface
, WAVEFORMATEX
*wave_format_current
)
169 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
171 TRACE("(%p)->(%p)\n", iface
, wave_format_current
);
173 if (!wave_format_current
)
178 *wave_format_current
= This
->wave_format
;
183 static HRESULT WINAPI
IAudioDataImpl_SetFormat(IAudioData
* iface
, const WAVEFORMATEX
*wave_format
)
185 AMAudioDataImpl
*This
= impl_from_IAudioData(iface
);
187 TRACE("(%p)->(%p)\n", iface
, wave_format
);
194 if (WAVE_FORMAT_PCM
!= wave_format
->wFormatTag
)
199 This
->wave_format
= *wave_format
;
204 static const struct IAudioDataVtbl AudioData_Vtbl
=
206 /*** IUnknown methods ***/
207 IAudioDataImpl_QueryInterface
,
208 IAudioDataImpl_AddRef
,
209 IAudioDataImpl_Release
,
210 /*** IMemoryData methods ***/
211 IAudioDataImpl_SetBuffer
,
212 IAudioDataImpl_GetInfo
,
213 IAudioDataImpl_SetActual
,
214 /*** IAudioData methods ***/
215 IAudioDataImpl_GetFormat
,
216 IAudioDataImpl_SetFormat
219 HRESULT
AMAudioData_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
221 AMAudioDataImpl
*object
;
223 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
226 return CLASS_E_NOAGGREGATION
;
228 if (!(object
= calloc(1, sizeof(*object
))))
229 return E_OUTOFMEMORY
;
231 object
->IAudioData_iface
.lpVtbl
= &AudioData_Vtbl
;
234 object
->wave_format
.wFormatTag
= WAVE_FORMAT_PCM
;
235 object
->wave_format
.nChannels
= 1;
236 object
->wave_format
.nSamplesPerSec
= 11025;
237 object
->wave_format
.wBitsPerSample
= 16;
238 object
->wave_format
.nBlockAlign
= object
->wave_format
.wBitsPerSample
* object
->wave_format
.nChannels
/ 8;
239 object
->wave_format
.nAvgBytesPerSec
= object
->wave_format
.nBlockAlign
* object
->wave_format
.nSamplesPerSec
;
241 *ppObj
= &object
->IAudioData_iface
;