winepulse: Set pulse master volume to 0 when session is muted.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-05-13 16:04:23 +02:00 committed by Alexandre Julliard
parent 131b7fd5e1
commit 0b0ae164f4
1 changed files with 17 additions and 7 deletions

View File

@ -249,21 +249,25 @@ static void silence_buffer(pa_sample_format_t format, BYTE *buffer, UINT32 bytes
static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes) static int write_buffer(const ACImpl *This, BYTE *buffer, UINT32 bytes)
{ {
const float *vol = This->pulse_stream->vol; const float *vol = This->pulse_stream->vol;
UINT32 i, channels, mute = 0;
BOOL adjust = FALSE; BOOL adjust = FALSE;
UINT32 i, channels;
BYTE *end; BYTE *end;
if (!bytes) return 0; if (!bytes) return 0;
if (This->session->mute)
{
silence_buffer(This->pulse_stream->ss.format, buffer, bytes);
goto write;
}
/* Adjust the buffer based on the volume for each channel */ /* Adjust the buffer based on the volume for each channel */
channels = This->pulse_stream->ss.channels; channels = This->pulse_stream->ss.channels;
for (i = 0; i < channels; i++) for (i = 0; i < channels; i++)
{
adjust |= vol[i] != 1.0f; adjust |= vol[i] != 1.0f;
if (vol[i] == 0.0f)
mute++;
}
if (mute == channels)
{
silence_buffer(This->pulse_stream->ss.format, buffer, bytes);
goto write;
}
if (!adjust) goto write; if (!adjust) goto write;
end = buffer + bytes; end = buffer + bytes;
@ -525,7 +529,8 @@ static DWORD WINAPI pulse_timer_cb(void *user)
static void set_stream_volumes(ACImpl *This) static void set_stream_volumes(ACImpl *This)
{ {
pulse->set_volumes(This->pulse_stream, This->session->master_vol, This->vol, float master_vol = This->session->mute ? 0.0f : This->session->master_vol;
pulse->set_volumes(This->pulse_stream, master_vol, This->vol,
This->session->channel_vols); This->session->channel_vols);
} }
@ -2633,13 +2638,18 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface,
{ {
AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface); AudioSessionWrapper *This = impl_from_ISimpleAudioVolume(iface);
AudioSession *session = This->session; AudioSession *session = This->session;
ACImpl *client;
TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context));
if (context) if (context)
FIXME("Notifications not supported yet\n"); FIXME("Notifications not supported yet\n");
pulse->lock();
session->mute = mute; session->mute = mute;
LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry)
set_stream_volumes(client);
pulse->unlock();
return S_OK; return S_OK;
} }