[PATCH 5/5] mmdevapi: Add stub for IAudioEndpointVolume

Maarten Lankhorst m.b.lankhorst at gmail.com
Wed Apr 21 08:44:07 CDT 2010


---
 dlls/mmdevapi/Makefile.in   |    1 +
 dlls/mmdevapi/audiovolume.c |  297 +++++++++++++++++++++++++++++++++++++++++++
 dlls/mmdevapi/devenum.c     |   23 ++--
 dlls/mmdevapi/mmdevapi.h    |    1 +
 4 files changed, 309 insertions(+), 13 deletions(-)
 create mode 100644 dlls/mmdevapi/audiovolume.c

diff --git a/dlls/mmdevapi/Makefile.in b/dlls/mmdevapi/Makefile.in
index a370fcf..ef1b0ce 100644
--- a/dlls/mmdevapi/Makefile.in
+++ b/dlls/mmdevapi/Makefile.in
@@ -8,6 +8,7 @@ EXTRALIBS = @FRAMEWORK_OPENAL@
 
 C_SRCS = \
 	audio.c \
+	audiovolume.c \
 	devenum.c \
 	main.c \
 	regsvr.c
diff --git a/dlls/mmdevapi/audiovolume.c b/dlls/mmdevapi/audiovolume.c
new file mode 100644
index 0000000..61cbed4
--- /dev/null
+++ b/dlls/mmdevapi/audiovolume.c
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2010 Maarten Lankhorst for Codeweavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+
+#define NONAMELESSUNION
+#define CINTERFACE
+#define COBJMACROS
+#include "config.h"
+
+#include <stdarg.h>
+#ifdef HAVE_AL_AL_H
+#include <AL/al.h>
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#include <OpenAL/alc.h>
+#endif
+
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "winreg.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+#include "ole2.h"
+#include "mmdeviceapi.h"
+#include "dshow.h"
+#include "dsound.h"
+#include "audioclient.h"
+#include "endpointvolume.h"
+#include "audiopolicy.h"
+
+#include "mmdevapi.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
+
+#ifdef HAVE_OPENAL
+
+static const IAudioEndpointVolumeExVtbl AEVImpl_Vtbl;
+
+typedef struct AEVImpl {
+    const IAudioEndpointVolumeExVtbl *lpVtbl;
+    LONG ref;
+} AEVImpl;
+
+HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolume **ppv)
+{
+    AEVImpl *This;
+    This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This));
+    *ppv = (IAudioEndpointVolume*)This;
+    if (!This)
+        return E_OUTOFMEMORY;
+    This->lpVtbl = &AEVImpl_Vtbl;
+    This->ref = 1;
+    return S_OK;
+}
+
+static void AudioEndpointVolume_Destroy(AEVImpl *This)
+{
+    HeapFree(GetProcessHeap(), 0, This);
+}
+
+static HRESULT WINAPI AEV_QueryInterface(IAudioEndpointVolumeEx *iface, REFIID riid, void **ppv)
+{
+    AEVImpl *This = (AEVImpl*)iface;
+    TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppv);
+    if (!ppv)
+        return E_POINTER;
+    *ppv = NULL;
+    if (IsEqualIID(riid, &IID_IUnknown) ||
+        IsEqualIID(riid, &IID_IAudioEndpointVolume) ||
+        IsEqualIID(riid, &IID_IAudioEndpointVolumeEx)) {
+        *ppv = This;
+    }
+    else
+        return E_NOINTERFACE;
+    IUnknown_AddRef((IUnknown *)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI AEV_AddRef(IAudioEndpointVolumeEx *iface)
+{
+    AEVImpl *This = (AEVImpl*)iface;
+    ULONG ref = InterlockedIncrement(&This->ref);
+    TRACE("(%p) new ref %u\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI AEV_Release(IAudioEndpointVolumeEx *iface)
+{
+    AEVImpl *This = (AEVImpl*)iface;
+    ULONG ref = InterlockedDecrement(&This->ref);
+    TRACE("(%p) new ref %u\n", This, ref);
+    if (!ref)
+        AudioEndpointVolume_Destroy(This);
+    return ref;
+}
+
+static HRESULT WINAPI AEV_RegisterControlChangeNotify(IAudioEndpointVolumeEx *iface, IAudioEndpointVolumeCallback *notify)
+{
+    TRACE("(%p)->(%p)\n", iface, notify);
+    if (!notify)
+        return E_POINTER;
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI AEV_UnregisterControlChangeNotify(IAudioEndpointVolumeEx *iface, IAudioEndpointVolumeCallback *notify)
+{
+    TRACE("(%p)->(%p)\n", iface, notify);
+    if (!notify)
+        return E_POINTER;
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI AEV_GetChannelCount(IAudioEndpointVolumeEx *iface, UINT *count)
+{
+    TRACE("(%p)->(%p)\n", iface, count);
+    if (!count)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_SetMasterVolumeLevel(IAudioEndpointVolumeEx *iface, float leveldb, const GUID *ctx)
+{
+    TRACE("(%p)->(%f,%s)\n", iface, leveldb, debugstr_guid(ctx));
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_SetMasterVolumeLevelScalar(IAudioEndpointVolumeEx *iface, float level, const GUID *ctx)
+{
+    TRACE("(%p)->(%f,%s)\n", iface, level, debugstr_guid(ctx));
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetMasterVolumeLevel(IAudioEndpointVolumeEx *iface, float *leveldb)
+{
+    TRACE("(%p)->(%p)\n", iface, leveldb);
+    if (!leveldb)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetMasterVolumeLevelScalar(IAudioEndpointVolumeEx *iface, float *level)
+{
+    TRACE("(%p)->(%p)\n", iface, level);
+    if (!level)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_SetChannelVolumeLevel(IAudioEndpointVolumeEx *iface, UINT chan, float leveldb, const GUID *ctx)
+{
+    TRACE("(%p)->(%f,%s)\n", iface, leveldb, debugstr_guid(ctx));
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_SetChannelVolumeLevelScalar(IAudioEndpointVolumeEx *iface, UINT chan, float level, const GUID *ctx)
+{
+    TRACE("(%p)->(%u,%f,%s)\n", iface, chan, level, debugstr_guid(ctx));
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetChannelVolumeLevel(IAudioEndpointVolumeEx *iface, UINT chan, float *leveldb)
+{
+    TRACE("(%p)->(%u,%p)\n", iface, chan, leveldb);
+    if (!leveldb)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetChannelVolumeLevelScalar(IAudioEndpointVolumeEx *iface, UINT chan, float *level)
+{
+    TRACE("(%p)->(%u,%p)\n", iface, chan, level);
+    if (!level)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_SetMute(IAudioEndpointVolumeEx *iface, BOOL mute, const GUID *ctx)
+{
+    TRACE("(%p)->(%u,%s)\n", iface, mute, debugstr_guid(ctx));
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetMute(IAudioEndpointVolumeEx *iface, BOOL *mute)
+{
+    TRACE("(%p)->(%p)\n", iface, mute);
+    if (!mute)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetVolumeStepInfo(IAudioEndpointVolumeEx *iface, UINT *stepsize, UINT *stepcount)
+{
+    TRACE("(%p)->(%p,%p)\n", iface, stepsize, stepcount);
+    if (!stepsize && !stepcount)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_VolumeStepUp(IAudioEndpointVolumeEx *iface, const GUID *ctx)
+{
+    TRACE("(%p)->(%s)\n", iface, debugstr_guid(ctx));
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_VolumeStepDown(IAudioEndpointVolumeEx *iface, const GUID *ctx)
+{
+    TRACE("(%p)->(%s)\n", iface, debugstr_guid(ctx));
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_QueryHardwareSupport(IAudioEndpointVolumeEx *iface, DWORD *mask)
+{
+    TRACE("(%p)->(%p)\n", iface, mask);
+    if (!mask)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetVolumeRange(IAudioEndpointVolumeEx *iface, float *mindb, float *maxdb, float *inc)
+{
+    TRACE("(%p)->(%p,%p,%p)\n", iface, mindb, maxdb, inc);
+    if (!mindb || !maxdb || !inc)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AEV_GetVolumeRangeChannel(IAudioEndpointVolumeEx *iface, UINT chan, float *mindb, float *maxdb, float *inc)
+{
+    TRACE("(%p)->(%p,%p,%p)\n", iface, mindb, maxdb, inc);
+    if (!mindb || !maxdb || !inc)
+        return E_POINTER;
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static const IAudioEndpointVolumeExVtbl AEVImpl_Vtbl = {
+    AEV_QueryInterface,
+    AEV_AddRef,
+    AEV_Release,
+    AEV_RegisterControlChangeNotify,
+    AEV_UnregisterControlChangeNotify,
+    AEV_GetChannelCount,
+    AEV_SetMasterVolumeLevel,
+    AEV_SetMasterVolumeLevelScalar,
+    AEV_GetMasterVolumeLevel,
+    AEV_GetMasterVolumeLevelScalar,
+    AEV_SetChannelVolumeLevel,
+    AEV_SetChannelVolumeLevelScalar,
+    AEV_GetChannelVolumeLevel,
+    AEV_GetChannelVolumeLevelScalar,
+    AEV_SetMute,
+    AEV_GetMute,
+    AEV_GetVolumeStepInfo,
+    AEV_VolumeStepUp,
+    AEV_VolumeStepDown,
+    AEV_QueryHardwareSupport,
+    AEV_GetVolumeRange,
+    AEV_GetVolumeRangeChannel
+};
+
+#endif
diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
index 977f25a..1275724 100644
--- a/dlls/mmdevapi/devenum.c
+++ b/dlls/mmdevapi/devenum.c
@@ -277,22 +277,16 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls
     if (!ppv)
         return E_POINTER;
 
-    if (IsEqualIID(riid, &IID_IAudioClient))
-    {
 #ifdef HAVE_OPENAL
-        if (openal_loaded)
-            hr = AudioClient_Create(This, (IAudioClient**)ppv);
-        else
-#endif
-        {
-            ERR("Trying to open a device with openal not available\n");
-            hr = AUDCLNT_E_SERVICE_NOT_RUNNING;
-        }
-    }
-    else if (IsEqualIID(riid, &IID_IAudioEndpointVolume))
+    if (!openal_loaded)
     {
-        FIXME("IID_IAudioEndpointVolume unsupported\n");
+        WARN("OpenAL is still not loaded\n");
+        hr = AUDCLNT_E_SERVICE_NOT_RUNNING;
     }
+    else if (IsEqualIID(riid, &IID_IAudioClient))
+        hr = AudioClient_Create(This, (IAudioClient**)ppv);
+    else if (IsEqualIID(riid, &IID_IAudioEndpointVolume))
+        hr = AudioEndpointVolume_Create(This, (IAudioEndpointVolume**)ppv);
     else if (IsEqualIID(riid, &IID_IAudioSessionManager)
              || IsEqualIID(riid, &IID_IAudioSessionManager2))
     {
@@ -355,6 +349,9 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls
     }
     else
         ERR("Invalid/unknown iid %s\n", debugstr_guid(riid));
+#else
+    hr = AUDCLNT_E_SERVICE_NOT_RUNNING;
+#endif
 
     if (FAILED(hr))
         *ppv = NULL;
diff --git a/dlls/mmdevapi/mmdevapi.h b/dlls/mmdevapi/mmdevapi.h
index 2cb9385..afe7bba 100644
--- a/dlls/mmdevapi/mmdevapi.h
+++ b/dlls/mmdevapi/mmdevapi.h
@@ -41,6 +41,7 @@ typedef struct MMDevice {
 } MMDevice;
 
 extern HRESULT AudioClient_Create(MMDevice *parent, IAudioClient **ppv);
+extern HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolume **ppv);
 
 #ifdef HAVE_OPENAL
 
-- 
1.7.0.4


--------------010808000303080902080505--



More information about the wine-patches mailing list