ReactOS  0.4.14-dev-337-gf981a68
audiovolume.c
Go to the documentation of this file.
1 /*
2  * Copyright 2010 Maarten Lankhorst for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #define COBJMACROS
20 
21 #include <stdarg.h>
22 
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winnls.h"
26 #include "winreg.h"
27 #include "wine/debug.h"
28 
29 #include "ole2.h"
30 #include "mmdeviceapi.h"
31 #include "mmsystem.h"
32 #include "dsound.h"
33 #include "audioclient.h"
34 #include "endpointvolume.h"
35 #include "audiopolicy.h"
36 
37 #include "mmdevapi.h"
38 
40 
41 typedef struct AEVImpl {
44  float master_vol;
46 } AEVImpl;
47 
49 {
50  return CONTAINING_RECORD(iface, AEVImpl, IAudioEndpointVolumeEx_iface);
51 }
52 
54 {
56 }
57 
59 {
61  TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppv);
62  if (!ppv)
63  return E_POINTER;
64  *ppv = NULL;
65  if (IsEqualIID(riid, &IID_IUnknown) ||
66  IsEqualIID(riid, &IID_IAudioEndpointVolume) ||
67  IsEqualIID(riid, &IID_IAudioEndpointVolumeEx)) {
68  *ppv = &This->IAudioEndpointVolumeEx_iface;
69  }
70  else
71  return E_NOINTERFACE;
72  IUnknown_AddRef((IUnknown *)*ppv);
73  return S_OK;
74 }
75 
77 {
80  TRACE("(%p) new ref %u\n", This, ref);
81  return ref;
82 }
83 
85 {
88  TRACE("(%p) new ref %u\n", This, ref);
89  if (!ref)
91  return ref;
92 }
93 
95 {
96  TRACE("(%p)->(%p)\n", iface, notify);
97  if (!notify)
98  return E_POINTER;
99  FIXME("stub\n");
100  return S_OK;
101 }
102 
104 {
105  TRACE("(%p)->(%p)\n", iface, notify);
106  if (!notify)
107  return E_POINTER;
108  FIXME("stub\n");
109  return S_OK;
110 }
111 
113 {
114  TRACE("(%p)->(%p)\n", iface, count);
115  if (!count)
116  return E_POINTER;
117  FIXME("stub\n");
118  return E_NOTIMPL;
119 }
120 
121 static HRESULT WINAPI AEV_SetMasterVolumeLevel(IAudioEndpointVolumeEx *iface, float leveldb, const GUID *ctx)
122 {
124 
125  TRACE("(%p)->(%f,%s)\n", iface, leveldb, debugstr_guid(ctx));
126 
127  if(leveldb < -100.f || leveldb > 0.f)
128  return E_INVALIDARG;
129 
130  This->master_vol = leveldb;
131 
132  return S_OK;
133 }
134 
136 {
137  TRACE("(%p)->(%f,%s)\n", iface, level, debugstr_guid(ctx));
138  FIXME("stub\n");
139  return E_NOTIMPL;
140 }
141 
143 {
145 
146  TRACE("(%p)->(%p)\n", iface, leveldb);
147 
148  if (!leveldb)
149  return E_POINTER;
150 
151  *leveldb = This->master_vol;
152 
153  return S_OK;
154 }
155 
157 {
158  TRACE("(%p)->(%p)\n", iface, level);
159  if (!level)
160  return E_POINTER;
161  FIXME("stub\n");
162  return E_NOTIMPL;
163 }
164 
165 static HRESULT WINAPI AEV_SetChannelVolumeLevel(IAudioEndpointVolumeEx *iface, UINT chan, float leveldb, const GUID *ctx)
166 {
167  TRACE("(%p)->(%f,%s)\n", iface, leveldb, debugstr_guid(ctx));
168  FIXME("stub\n");
169  return E_NOTIMPL;
170 }
171 
173 {
174  TRACE("(%p)->(%u,%f,%s)\n", iface, chan, level, debugstr_guid(ctx));
175  FIXME("stub\n");
176  return E_NOTIMPL;
177 }
178 
180 {
181  TRACE("(%p)->(%u,%p)\n", iface, chan, leveldb);
182  if (!leveldb)
183  return E_POINTER;
184  FIXME("stub\n");
185  return E_NOTIMPL;
186 }
187 
189 {
190  TRACE("(%p)->(%u,%p)\n", iface, chan, level);
191  if (!level)
192  return E_POINTER;
193  FIXME("stub\n");
194  return E_NOTIMPL;
195 }
196 
197 static HRESULT WINAPI AEV_SetMute(IAudioEndpointVolumeEx *iface, BOOL mute, const GUID *ctx)
198 {
200  HRESULT ret;
201 
202  TRACE("(%p)->(%u,%s)\n", iface, mute, debugstr_guid(ctx));
203 
204  ret = This->mute == mute ? S_FALSE : S_OK;
205 
206  This->mute = mute;
207 
208  return ret;
209 }
210 
212 {
214 
215  TRACE("(%p)->(%p)\n", iface, mute);
216 
217  if (!mute)
218  return E_POINTER;
219 
220  *mute = This->mute;
221 
222  return S_OK;
223 }
224 
226 {
227  TRACE("(%p)->(%p,%p)\n", iface, stepsize, stepcount);
228  if (!stepsize && !stepcount)
229  return E_POINTER;
230  FIXME("stub\n");
231  return E_NOTIMPL;
232 }
233 
235 {
236  TRACE("(%p)->(%s)\n", iface, debugstr_guid(ctx));
237  FIXME("stub\n");
238  return E_NOTIMPL;
239 }
240 
242 {
243  TRACE("(%p)->(%s)\n", iface, debugstr_guid(ctx));
244  FIXME("stub\n");
245  return E_NOTIMPL;
246 }
247 
249 {
250  TRACE("(%p)->(%p)\n", iface, mask);
251  if (!mask)
252  return E_POINTER;
253  FIXME("stub\n");
254  return E_NOTIMPL;
255 }
256 
257 static HRESULT WINAPI AEV_GetVolumeRange(IAudioEndpointVolumeEx *iface, float *mindb, float *maxdb, float *inc)
258 {
259  TRACE("(%p)->(%p,%p,%p)\n", iface, mindb, maxdb, inc);
260 
261  if (!mindb || !maxdb || !inc)
262  return E_POINTER;
263 
264  *mindb = -100.f;
265  *maxdb = 0.f;
266  *inc = 1.f;
267 
268  return S_OK;
269 }
270 
271 static HRESULT WINAPI AEV_GetVolumeRangeChannel(IAudioEndpointVolumeEx *iface, UINT chan, float *mindb, float *maxdb, float *inc)
272 {
273  TRACE("(%p)->(%p,%p,%p)\n", iface, mindb, maxdb, inc);
274  if (!mindb || !maxdb || !inc)
275  return E_POINTER;
276  FIXME("stub\n");
277  return E_NOTIMPL;
278 }
279 
280 static const IAudioEndpointVolumeExVtbl AEVImpl_Vtbl = {
282  AEV_AddRef,
283  AEV_Release,
295  AEV_SetMute,
296  AEV_GetMute,
303 };
304 
306 {
307  AEVImpl *This;
308 
309  *ppv = NULL;
311  if (!This)
312  return E_OUTOFMEMORY;
313  This->IAudioEndpointVolumeEx_iface.lpVtbl = &AEVImpl_Vtbl;
314  This->ref = 1;
315 
316  *ppv = &This->IAudioEndpointVolumeEx_iface;
317  return S_OK;
318 }
static HRESULT WINAPI AEV_RegisterControlChangeNotify(IAudioEndpointVolumeEx *iface, IAudioEndpointVolumeCallback *notify)
Definition: audiovolume.c:94
static HRESULT WINAPI AEV_SetMasterVolumeLevel(IAudioEndpointVolumeEx *iface, float leveldb, const GUID *ctx)
Definition: audiovolume.c:121
GLint level
Definition: gl.h:1546
#define REFIID
Definition: guiddef.h:118
#define E_NOINTERFACE
Definition: winerror.h:2364
struct AEVImpl AEVImpl
REFIID riid
Definition: precomp.h:44
GLuint GLuint GLsizei count
Definition: gl.h:1545
static HRESULT WINAPI AEV_QueryInterface(IAudioEndpointVolumeEx *iface, REFIID riid, void **ppv)
Definition: audiovolume.c:58
int notify
Definition: msacm.c:1365
REFIID LPVOID * ppv
Definition: atlbase.h:39
static HRESULT WINAPI AEV_GetMasterVolumeLevelScalar(IAudioEndpointVolumeEx *iface, float *level)
Definition: audiovolume.c:156
static HRESULT WINAPI AEV_GetVolumeRange(IAudioEndpointVolumeEx *iface, float *mindb, float *maxdb, float *inc)
Definition: audiovolume.c:257
IAudioEndpointVolumeEx IAudioEndpointVolumeEx_iface
Definition: audiovolume.c:42
static HRESULT WINAPI AEV_VolumeStepUp(IAudioEndpointVolumeEx *iface, const GUID *ctx)
Definition: audiovolume.c:234
Definition: send.c:47
GLenum GLint GLuint mask
Definition: glext.h:6028
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static ULONG WINAPI AEV_AddRef(IAudioEndpointVolumeEx *iface)
Definition: audiovolume.c:76
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
GLenum GLint ref
Definition: glext.h:6028
WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi)
#define FIXME(fmt,...)
Definition: debug.h:110
#define S_FALSE
Definition: winerror.h:2357
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
#define debugstr_guid
Definition: kernel32.h:35
static ULONG WINAPI AEV_Release(IAudioEndpointVolumeEx *iface)
Definition: audiovolume.c:84
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static HRESULT WINAPI AEV_GetVolumeRangeChannel(IAudioEndpointVolumeEx *iface, UINT chan, float *mindb, float *maxdb, float *inc)
Definition: audiovolume.c:271
GLfloat f
Definition: glext.h:7540
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
r parent
Definition: btrfs.c:2869
static HRESULT WINAPI AEV_GetMasterVolumeLevel(IAudioEndpointVolumeEx *iface, float *leveldb)
Definition: audiovolume.c:142
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
static HRESULT WINAPI AEV_SetChannelVolumeLevel(IAudioEndpointVolumeEx *iface, UINT chan, float leveldb, const GUID *ctx)
Definition: audiovolume.c:165
int ret
#define InterlockedDecrement
Definition: armddk.h:52
static HRESULT WINAPI AEV_GetVolumeStepInfo(IAudioEndpointVolumeEx *iface, UINT *stepsize, UINT *stepcount)
Definition: audiovolume.c:225
static HRESULT WINAPI AEV_UnregisterControlChangeNotify(IAudioEndpointVolumeEx *iface, IAudioEndpointVolumeCallback *notify)
Definition: audiovolume.c:103
static HRESULT WINAPI AEV_GetChannelVolumeLevelScalar(IAudioEndpointVolumeEx *iface, UINT chan, float *level)
Definition: audiovolume.c:188
static HRESULT WINAPI AEV_SetChannelVolumeLevelScalar(IAudioEndpointVolumeEx *iface, UINT chan, float level, const GUID *ctx)
Definition: audiovolume.c:172
static HRESULT WINAPI AEV_GetChannelCount(IAudioEndpointVolumeEx *iface, UINT *count)
Definition: audiovolume.c:112
static HRESULT WINAPI AEV_SetMute(IAudioEndpointVolumeEx *iface, BOOL mute, const GUID *ctx)
Definition: audiovolume.c:197
#define S_OK
Definition: intsafe.h:59
HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolumeEx **ppv)
Definition: audiovolume.c:305
#define InterlockedIncrement
Definition: armddk.h:53
BOOL mute
Definition: audiovolume.c:45
static HRESULT WINAPI AEV_QueryHardwareSupport(IAudioEndpointVolumeEx *iface, DWORD *mask)
Definition: audiovolume.c:248
#define E_NOTIMPL
Definition: ddrawi.h:99
static HRESULT WINAPI AEV_SetMasterVolumeLevelScalar(IAudioEndpointVolumeEx *iface, float level, const GUID *ctx)
Definition: audiovolume.c:135
unsigned int UINT
Definition: ndis.h:50
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
float master_vol
Definition: audiovolume.c:44
static HRESULT WINAPI AEV_VolumeStepDown(IAudioEndpointVolumeEx *iface, const GUID *ctx)
Definition: audiovolume.c:241
static const IAudioEndpointVolumeExVtbl AEVImpl_Vtbl
Definition: audiovolume.c:280
unsigned int ULONG
Definition: retypes.h:1
static HRESULT WINAPI AEV_GetMute(IAudioEndpointVolumeEx *iface, BOOL *mute)
Definition: audiovolume.c:211
static HRESULT WINAPI AEV_GetChannelVolumeLevel(IAudioEndpointVolumeEx *iface, UINT chan, float *leveldb)
Definition: audiovolume.c:179
#define E_POINTER
Definition: winerror.h:2365
LONG ref
Definition: audiovolume.c:43
static AEVImpl * impl_from_IAudioEndpointVolumeEx(IAudioEndpointVolumeEx *iface)
Definition: audiovolume.c:48
#define HeapFree(x, y, z)
Definition: compat.h:402
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
static void AudioEndpointVolume_Destroy(AEVImpl *This)
Definition: audiovolume.c:53