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:
parent
131b7fd5e1
commit
0b0ae164f4
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue