Please note that with this MR the following `TRACE()` calls are removed:
- `"ALSA does not support volume control\n"` - `"OSS doesn't support setting volume\n"` - `"PulseAudio does not support session volume control\n"`
Should I perhaps move them to the specific drivers' unixlib instead?
-- v2: winepulse: Use mmdevapi's SimpleAudioVolume. wineoss: Use mmdevapi's SimpleAudioVolume.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/session.c | 143 +++++++++++++++++++++++++++++++++++ dlls/winealsa.drv/mmdevdrv.c | 135 +-------------------------------- 2 files changed, 144 insertions(+), 134 deletions(-)
diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 8ba8bed5fc4..825fd44d4cf 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -39,6 +39,24 @@ static inline struct audio_session_wrapper *impl_from_IAudioSessionControl2(IAud return CONTAINING_RECORD(iface, struct audio_session_wrapper, IAudioSessionControl2_iface); }
+static inline struct audio_session_wrapper *impl_from_ISimpleAudioVolume(ISimpleAudioVolume *iface) +{ + return CONTAINING_RECORD(iface, struct audio_session_wrapper, ISimpleAudioVolume_iface); +} + +static void set_stream_volumes(struct audio_client *This) +{ + struct set_volumes_params params; + + params.stream = This->stream; + params.master_volume = (This->session->mute ? 0.0f : This->session->master_vol); + params.volumes = This->vols; + params.session_volumes = This->session->channel_vols; + params.channel = 0; + + WINE_UNIX_CALL(set_volumes, ¶ms); +} + static HRESULT WINAPI control_QueryInterface(IAudioSessionControl2 *iface, REFIID riid, void **ppv) { TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); @@ -247,3 +265,128 @@ const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl = control_IsSystemSoundsSession, control_SetDuckingPreference }; + +static HRESULT WINAPI simplevolume_QueryInterface(ISimpleAudioVolume *iface, REFIID riid, + void **ppv) +{ + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); + + if (!ppv) + return E_POINTER; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_ISimpleAudioVolume)) + *ppv = iface; + else { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*ppv); + + return S_OK; +} + +static ULONG WINAPI simplevolume_AddRef(ISimpleAudioVolume *iface) +{ + struct audio_session_wrapper *This = impl_from_ISimpleAudioVolume(iface); + return IAudioSessionControl2_AddRef(&This->IAudioSessionControl2_iface); +} + +static ULONG WINAPI simplevolume_Release(ISimpleAudioVolume *iface) +{ + struct audio_session_wrapper *This = impl_from_ISimpleAudioVolume(iface); + return IAudioSessionControl2_Release(&This->IAudioSessionControl2_iface); +} + +static HRESULT WINAPI simplevolume_SetMasterVolume(ISimpleAudioVolume *iface, float level, + const GUID *context) +{ + struct audio_session_wrapper *This = impl_from_ISimpleAudioVolume(iface); + struct audio_session *session = This->session; + struct audio_client *client; + + TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); + + if (level < 0.f || level > 1.f) + return E_INVALIDARG; + + if (context) + FIXME("Notifications not supported yet\n"); + + sessions_lock(); + + session->master_vol = level; + + LIST_FOR_EACH_ENTRY(client, &session->clients, struct audio_client, entry) + set_stream_volumes(client); + + sessions_unlock(); + + return S_OK; +} + +static HRESULT WINAPI simplevolume_GetMasterVolume(ISimpleAudioVolume *iface, float *level) +{ + struct audio_session_wrapper *This = impl_from_ISimpleAudioVolume(iface); + struct audio_session *session = This->session; + + TRACE("(%p)->(%p)\n", session, level); + + if (!level) + return NULL_PTR_ERR; + + *level = session->master_vol; + + return S_OK; +} + +static HRESULT WINAPI simplevolume_SetMute(ISimpleAudioVolume *iface, BOOL mute, + const GUID *context) +{ + struct audio_session_wrapper *This = impl_from_ISimpleAudioVolume(iface); + struct audio_session *session = This->session; + struct audio_client *client; + + TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); + + if (context) + FIXME("Notifications not supported yet\n"); + + sessions_lock(); + + session->mute = mute; + + LIST_FOR_EACH_ENTRY(client, &session->clients, struct audio_client, entry) + set_stream_volumes(client); + + sessions_unlock(); + + return S_OK; +} + +static HRESULT WINAPI simplevolume_GetMute(ISimpleAudioVolume *iface, BOOL *mute) +{ + struct audio_session_wrapper *This = impl_from_ISimpleAudioVolume(iface); + struct audio_session *session = This->session; + + TRACE("(%p)->(%p)\n", session, mute); + + if (!mute) + return NULL_PTR_ERR; + + *mute = session->mute; + + return S_OK; +} + +const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = +{ + simplevolume_QueryInterface, + simplevolume_AddRef, + simplevolume_Release, + simplevolume_SetMasterVolume, + simplevolume_GetMasterVolume, + simplevolume_SetMute, + simplevolume_GetMute +}; diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 3af83d94eae..6ea8882de59 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -73,7 +73,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl; static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; +extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; static const IAudioClockVtbl AudioClock_Vtbl; static const IAudioClock2Vtbl AudioClock2_Vtbl; static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; @@ -106,11 +106,6 @@ static inline ACImpl *impl_from_IAudioCaptureClient(IAudioCaptureClient *iface) return CONTAINING_RECORD(iface, ACImpl, IAudioCaptureClient_iface); }
-static inline AudioSessionWrapper *impl_from_ISimpleAudioVolume(ISimpleAudioVolume *iface) -{ - return CONTAINING_RECORD(iface, AudioSessionWrapper, ISimpleAudioVolume_iface); -} - static inline AudioSessionWrapper *impl_from_IChannelAudioVolume(IChannelAudioVolume *iface) { return CONTAINING_RECORD(iface, AudioSessionWrapper, IChannelAudioVolume_iface); @@ -1511,134 +1506,6 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) return ret; }
-static HRESULT WINAPI SimpleAudioVolume_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 SimpleAudioVolume_AddRef(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_AddRef(&This->IAudioSessionControl2_iface); -} - -static ULONG WINAPI SimpleAudioVolume_Release(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_Release(&This->IAudioSessionControl2_iface); -} - -static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( - ISimpleAudioVolume *iface, float level, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); - - if(level < 0.f || level > 1.f) - return E_INVALIDARG; - - if(context) - FIXME("Notifications not supported yet\n"); - - TRACE("ALSA does not support volume control\n"); - - sessions_lock(); - - session->master_vol = level; - - LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) - set_stream_volumes(client); - - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMasterVolume( - ISimpleAudioVolume *iface, float *level) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, level); - - if(!level) - return NULL_PTR_ERR; - - *level = session->master_vol; - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, - BOOL mute, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); - - if(context) - FIXME("Notifications not supported yet\n"); - - sessions_lock(); - - session->mute = mute; - LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) - set_stream_volumes(client); - - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMute(ISimpleAudioVolume *iface, - BOOL *mute) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, mute); - - if(!mute) - return NULL_PTR_ERR; - - *mute = session->mute; - - return S_OK; -} - -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = -{ - SimpleAudioVolume_QueryInterface, - SimpleAudioVolume_AddRef, - SimpleAudioVolume_Release, - SimpleAudioVolume_SetMasterVolume, - SimpleAudioVolume_GetMasterVolume, - SimpleAudioVolume_SetMute, - SimpleAudioVolume_GetMute -}; - static HRESULT WINAPI AudioStreamVolume_QueryInterface( IAudioStreamVolume *iface, REFIID riid, void **ppv) {
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 134 +----------------------------- 1 file changed, 1 insertion(+), 133 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index abcca09039a..5113132f09b 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -55,7 +55,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl; static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; +extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; static const IAudioClockVtbl AudioClock_Vtbl; static const IAudioClock2Vtbl AudioClock2_Vtbl; static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; @@ -100,11 +100,6 @@ static inline ACImpl *impl_from_IAudioCaptureClient(IAudioCaptureClient *iface) return CONTAINING_RECORD(iface, ACImpl, IAudioCaptureClient_iface); }
-static inline AudioSessionWrapper *impl_from_ISimpleAudioVolume(ISimpleAudioVolume *iface) -{ - return CONTAINING_RECORD(iface, AudioSessionWrapper, ISimpleAudioVolume_iface); -} - static inline AudioSessionWrapper *impl_from_IChannelAudioVolume(IChannelAudioVolume *iface) { return CONTAINING_RECORD(iface, AudioSessionWrapper, IChannelAudioVolume_iface); @@ -1461,133 +1456,6 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) return ret; }
-static HRESULT WINAPI SimpleAudioVolume_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 SimpleAudioVolume_AddRef(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_AddRef(&This->IAudioSessionControl2_iface); -} - -static ULONG WINAPI SimpleAudioVolume_Release(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_Release(&This->IAudioSessionControl2_iface); -} - -static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( - ISimpleAudioVolume *iface, float level, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); - - if(level < 0.f || level > 1.f) - return E_INVALIDARG; - - if(context) - FIXME("Notifications not supported yet\n"); - - sessions_lock(); - - session->master_vol = level; - - LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) - set_stream_volumes(client, -1); - - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMasterVolume( - ISimpleAudioVolume *iface, float *level) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, level); - - if(!level) - return NULL_PTR_ERR; - - *level = session->master_vol; - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, - BOOL mute, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); - - if(context) - FIXME("Notifications not supported yet\n"); - - sessions_lock(); - - session->mute = mute; - - LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) - set_stream_volumes(client, -1); - - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMute(ISimpleAudioVolume *iface, - BOOL *mute) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, mute); - - if(!mute) - return NULL_PTR_ERR; - - *mute = session->mute; - - return S_OK; -} - -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = -{ - SimpleAudioVolume_QueryInterface, - SimpleAudioVolume_AddRef, - SimpleAudioVolume_Release, - SimpleAudioVolume_SetMasterVolume, - SimpleAudioVolume_GetMasterVolume, - SimpleAudioVolume_SetMute, - SimpleAudioVolume_GetMute -}; - static HRESULT WINAPI AudioStreamVolume_QueryInterface( IAudioStreamVolume *iface, REFIID riid, void **ppv) {
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 132 +----------------------------------- dlls/wineoss.drv/oss.c | 10 +++ 2 files changed, 11 insertions(+), 131 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index e30787dc7c1..89dbeac62bc 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -81,7 +81,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl; static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; +extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; static const IAudioClockVtbl AudioClock_Vtbl; static const IAudioClock2Vtbl AudioClock2_Vtbl; static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; @@ -112,11 +112,6 @@ static inline ACImpl *impl_from_IAudioCaptureClient(IAudioCaptureClient *iface) return CONTAINING_RECORD(iface, ACImpl, IAudioCaptureClient_iface); }
-static inline AudioSessionWrapper *impl_from_ISimpleAudioVolume(ISimpleAudioVolume *iface) -{ - return CONTAINING_RECORD(iface, AudioSessionWrapper, ISimpleAudioVolume_iface); -} - static inline AudioSessionWrapper *impl_from_IChannelAudioVolume(IChannelAudioVolume *iface) { return CONTAINING_RECORD(iface, AudioSessionWrapper, IChannelAudioVolume_iface); @@ -1460,131 +1455,6 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) return ret; }
-static HRESULT WINAPI SimpleAudioVolume_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 SimpleAudioVolume_AddRef(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_AddRef(&This->IAudioSessionControl2_iface); -} - -static ULONG WINAPI SimpleAudioVolume_Release(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_Release(&This->IAudioSessionControl2_iface); -} - -static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( - ISimpleAudioVolume *iface, float level, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); - - if(level < 0.f || level > 1.f) - return E_INVALIDARG; - - if(context) - FIXME("Notifications not supported yet\n"); - - sessions_lock(); - - session->master_vol = level; - - TRACE("OSS doesn't support setting volume\n"); - LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) - set_stream_volumes(client); - - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMasterVolume( - ISimpleAudioVolume *iface, float *level) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, level); - - if(!level) - return NULL_PTR_ERR; - - *level = session->master_vol; - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, - BOOL mute, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); - - sessions_lock(); - - session->mute = mute; - - LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) - set_stream_volumes(client); - - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMute(ISimpleAudioVolume *iface, - BOOL *mute) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, mute); - - if(!mute) - return NULL_PTR_ERR; - - *mute = This->session->mute; - - return S_OK; -} - -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = -{ - SimpleAudioVolume_QueryInterface, - SimpleAudioVolume_AddRef, - SimpleAudioVolume_Release, - SimpleAudioVolume_SetMasterVolume, - SimpleAudioVolume_GetMasterVolume, - SimpleAudioVolume_SetMute, - SimpleAudioVolume_GetMute -}; - static HRESULT WINAPI AudioStreamVolume_QueryInterface( IAudioStreamVolume *iface, REFIID riid, void **ppv) { diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 65ca42c3182..96d84a07d00 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1360,6 +1360,16 @@ static NTSTATUS oss_set_volumes(void *args) { struct set_volumes_params *params = args; struct oss_stream *stream = handle_get_stream(params->stream); + UINT16 i; + + if (params->master_volume) { + for (i = 0; i < stream->fmt->nChannels; ++i) { + if (params->master_volume * params->volumes[i] * params->session_volumes[i] != 1.0f) { + FIXME("Volume control is not implemented\n"); + break; + } + } + }
oss_lock(stream); stream->mute = !params->master_volume;
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winepulse.drv/mmdevdrv.c | 130 +--------------------------------- 1 file changed, 1 insertion(+), 129 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 5f2a8b8609d..59e2d086d0b 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -128,7 +128,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl; static const IAudioRenderClientVtbl AudioRenderClient_Vtbl; static const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; extern const IAudioSessionControl2Vtbl AudioSessionControl2_Vtbl; -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; +extern const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl; static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; static const IAudioClockVtbl AudioClock_Vtbl; static const IAudioClock2Vtbl AudioClock2_Vtbl; @@ -151,11 +151,6 @@ static inline ACImpl *impl_from_IAudioCaptureClient(IAudioCaptureClient *iface) return CONTAINING_RECORD(iface, ACImpl, IAudioCaptureClient_iface); }
-static inline AudioSessionWrapper *impl_from_ISimpleAudioVolume(ISimpleAudioVolume *iface) -{ - return CONTAINING_RECORD(iface, AudioSessionWrapper, ISimpleAudioVolume_iface); -} - static inline AudioSessionWrapper *impl_from_IChannelAudioVolume(IChannelAudioVolume *iface) { return CONTAINING_RECORD(iface, AudioSessionWrapper, IChannelAudioVolume_iface); @@ -1887,129 +1882,6 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) return ret; }
-static HRESULT WINAPI SimpleAudioVolume_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 SimpleAudioVolume_AddRef(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_AddRef(&This->IAudioSessionControl2_iface); -} - -static ULONG WINAPI SimpleAudioVolume_Release(ISimpleAudioVolume *iface) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - return IAudioSessionControl2_Release(&This->IAudioSessionControl2_iface); -} - -static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( - ISimpleAudioVolume *iface, float level, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%f, %s)\n", session, level, wine_dbgstr_guid(context)); - - if (level < 0.f || level > 1.f) - return E_INVALIDARG; - - if (context) - FIXME("Notifications not supported yet\n"); - - TRACE("PulseAudio does not support session volume control\n"); - - sessions_lock(); - session->master_vol = level; - LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) - set_stream_volumes(client); - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMasterVolume( - ISimpleAudioVolume *iface, float *level) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, level); - - if (!level) - return NULL_PTR_ERR; - - *level = session->master_vol; - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, - BOOL mute, const GUID *context) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - ACImpl *client; - - TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); - - if (context) - FIXME("Notifications not supported yet\n"); - - sessions_lock(); - session->mute = mute; - LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) - set_stream_volumes(client); - sessions_unlock(); - - return S_OK; -} - -static HRESULT WINAPI SimpleAudioVolume_GetMute(ISimpleAudioVolume *iface, - BOOL *mute) -{ - AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); - AudioSession *session = This->session; - - TRACE("(%p)->(%p)\n", session, mute); - - if (!mute) - return NULL_PTR_ERR; - - *mute = session->mute; - - return S_OK; -} - -static const ISimpleAudioVolumeVtbl SimpleAudioVolume_Vtbl = -{ - SimpleAudioVolume_QueryInterface, - SimpleAudioVolume_AddRef, - SimpleAudioVolume_Release, - SimpleAudioVolume_SetMasterVolume, - SimpleAudioVolume_GetMasterVolume, - SimpleAudioVolume_SetMute, - SimpleAudioVolume_GetMute -}; - static HRESULT WINAPI ChannelAudioVolume_QueryInterface( IChannelAudioVolume *iface, REFIID riid, void **ppv) {
This merge request was approved by Huw Davies.