Maarten Lankhorst : mmdevapi: Add AudioSimpleVolume stub.

Alexandre Julliard julliard at winehq.org
Tue Apr 20 11:32:24 CDT 2010


Module: wine
Branch: master
Commit: 724351ede47459ca5538ed5dc4f882048d9cbd5d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=724351ede47459ca5538ed5dc4f882048d9cbd5d

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Mon Apr 19 11:52:55 2010 +0200

mmdevapi: Add AudioSimpleVolume stub.

---

 dlls/mmdevapi/audio.c |  121 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/dlls/mmdevapi/audio.c b/dlls/mmdevapi/audio.c
index 3b384d8..4a7a4c6 100644
--- a/dlls/mmdevapi/audio.c
+++ b/dlls/mmdevapi/audio.c
@@ -78,6 +78,7 @@ typedef struct ACImpl {
     ACRender *render;
     ACCapture *capture;
     ACSession *session;
+    ASVolume *svolume;
     AClock *clock;
 } ACImpl;
 
@@ -99,6 +100,12 @@ struct ACSession {
     ACImpl *parent;
 };
 
+struct ASVolume {
+    const ISimpleAudioVolumeVtbl *lpVtbl;
+    LONG ref;
+    ACImpl *parent;
+};
+
 struct AClock {
     const IAudioClockVtbl *lpVtbl;
     const IAudioClock2Vtbl *lp2Vtbl;
@@ -110,6 +117,7 @@ static const IAudioClientVtbl ACImpl_Vtbl;
 static const IAudioRenderClientVtbl ACRender_Vtbl;
 static const IAudioCaptureClientVtbl ACCapture_Vtbl;
 static const IAudioSessionControl2Vtbl ACSession_Vtbl;
+static const ISimpleAudioVolumeVtbl ASVolume_Vtbl;
 static const IAudioClockVtbl AClock_Vtbl;
 static const IAudioClock2Vtbl AClock2_Vtbl;
 
@@ -119,6 +127,8 @@ static HRESULT AudioCaptureClient_Create(ACImpl *parent, ACCapture **ppv);
 static void AudioCaptureClient_Destroy(ACCapture *This);
 static HRESULT AudioSessionControl_Create(ACImpl *parent, ACSession **ppv);
 static void AudioSessionControl_Destroy(ACSession *This);
+static HRESULT AudioSimpleVolume_Create(ACImpl *parent, ASVolume **ppv);
+static void AudioSimpleVolume_Destroy(ASVolume *This);
 static HRESULT AudioClock_Create(ACImpl *parent, AClock **ppv);
 static void AudioClock_Destroy(AClock *This);
 
@@ -301,6 +311,8 @@ static void AudioClient_Destroy(ACImpl *This)
         AudioCaptureClient_Destroy(This->capture);
     if (This->session)
         AudioSessionControl_Destroy(This->session);
+    if (This->svolume)
+        AudioSimpleVolume_Destroy(This->svolume);
     if (This->clock)
         AudioClock_Destroy(This->clock);
     if (This->parent->flow == eRender && This->init) {
@@ -876,6 +888,10 @@ static HRESULT WINAPI AC_GetService(IAudioClient *iface, REFIID riid, void **ppv
         if (!This->session)
             hr = AudioSessionControl_Create(This, &This->session);
         *ppv = This->session;
+    } else if (IsEqualIID(riid, &IID_ISimpleAudioVolume)) {
+        if (!This->svolume)
+            hr = AudioSimpleVolume_Create(This, &This->svolume);
+        *ppv = This->svolume;
     } else if (IsEqualIID(riid, &IID_IAudioClock)) {
         if (!This->clock)
             hr = AudioClock_Create(This, &This->clock);
@@ -1452,6 +1468,111 @@ static const IAudioSessionControl2Vtbl ACSession_Vtbl =
     ACS_SetDuckingPreference
 };
 
+static HRESULT AudioSimpleVolume_Create(ACImpl *parent, ASVolume **ppv)
+{
+    ASVolume *This;
+    This = *ppv = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+    if (!This)
+        return E_OUTOFMEMORY;
+    This->lpVtbl = &ASVolume_Vtbl;
+    This->ref = 0;
+    This->parent = parent;
+    return S_OK;
+}
+
+static void AudioSimpleVolume_Destroy(ASVolume *This)
+{
+    This->parent->svolume = NULL;
+    HeapFree(GetProcessHeap(), 0, This);
+}
+
+static HRESULT WINAPI ASV_QueryInterface(ISimpleAudioVolume *iface, REFIID riid, void **ppv)
+{
+    TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ppv);
+
+    if (!ppv)
+        return E_POINTER;
+    *ppv = NULL;
+    if (IsEqualIID(riid, &IID_IUnknown)
+        || IsEqualIID(riid, &IID_ISimpleAudioVolume))
+        *ppv = iface;
+    if (*ppv) {
+        IUnknown_AddRef((IUnknown*)*ppv);
+        return S_OK;
+    }
+    WARN("Unknown interface %s\n", debugstr_guid(riid));
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ASV_AddRef(ISimpleAudioVolume *iface)
+{
+    ASVolume *This = (ASVolume*)iface;
+    ULONG ref;
+    ref = InterlockedIncrement(&This->ref);
+    TRACE("Refcount now %i\n", ref);
+    return ref;
+}
+
+static ULONG WINAPI ASV_Release(ISimpleAudioVolume *iface)
+{
+    ASVolume *This = (ASVolume*)iface;
+    ULONG ref;
+    ref = InterlockedDecrement(&This->ref);
+    TRACE("Refcount now %i\n", ref);
+    if (!ref)
+        AudioSimpleVolume_Destroy(This);
+    return ref;
+}
+
+static HRESULT WINAPI ASV_SetMasterVolume(ISimpleAudioVolume *iface, float level, const GUID *context)
+{
+    ASVolume *This = (ASVolume*)iface;
+    TRACE("(%p)->(%f,%p)\n", This, level, context);
+
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI ASV_GetMasterVolume(ISimpleAudioVolume *iface, float *level)
+{
+    ASVolume *This = (ASVolume*)iface;
+    TRACE("(%p)->(%p)\n", This, level);
+
+    *level = 1.f;
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI ASV_SetMute(ISimpleAudioVolume *iface, BOOL mute, const GUID *context)
+{
+    ASVolume *This = (ASVolume*)iface;
+    TRACE("(%p)->(%u,%p)\n", This, mute, context);
+
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static HRESULT WINAPI ASV_GetMute(ISimpleAudioVolume *iface, BOOL *mute)
+{
+    ASVolume *This = (ASVolume*)iface;
+    TRACE("(%p)->(%p)\n", This, mute);
+
+    *mute = 0;
+    FIXME("stub\n");
+    return S_OK;
+}
+
+static const ISimpleAudioVolumeVtbl ASVolume_Vtbl  =
+{
+    ASV_QueryInterface,
+    ASV_AddRef,
+    ASV_Release,
+    ASV_SetMasterVolume,
+    ASV_GetMasterVolume,
+    ASV_SetMute,
+    ASV_GetMute
+};
+
 static HRESULT AudioClock_Create(ACImpl *parent, AClock **ppv)
 {
     AClock *This;




More information about the wine-cvs mailing list