Sound volume resets after making a call

Bug #1289515 reported by Omer Akram
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
pulseaudio (Ubuntu)
High
David Henningsson

Bug Description

1. mute your phone
2. dial a number and ensure the call is picked
3. end the call

What happens:
The sound volume is set to full and the phone unmutes

What should happen:
Ending the call should not effect the sound volume setting.

ProblemType: Bug
DistroRelease: Ubuntu 14.04
Package: telephony-service 0.1+14.04.20140303-0ubuntu1
Uname: Linux 3.4.0-5-mako armv7l
ApportVersion: 2.13.2-0ubuntu5
Architecture: armhf
Date: Fri Mar 7 23:26:43 2014
InstallationDate: Installed on 2014-03-07 (0 days ago)
InstallationMedia: Ubuntu Trusty Tahr (development branch) - armhf (20140307.2)
ProcEnviron:
 TERM=linux
 PATH=(custom, no user)
SourcePackage: telephony-service
UpgradeStatus: No upgrade log present (probably fresh install)

Related branches

Revision history for this message
Omer Akram (om26er) wrote :
Omer Akram (om26er)
summary: - Sound volumes resets after making a call
+ Sound volume resets after making a call
Omer Akram (om26er)
affects: telephony-service (Ubuntu) → pulseaudio (Ubuntu)
Changed in pulseaudio (Ubuntu):
assignee: nobody → David Henningsson (diwic)
importance: Undecided → High
Revision history for this message
David Henningsson (diwic) wrote :

Volumes for music and phone calls are stored independently. Volume returns to what it was before the phone call, regardless of how you adjusted the volume during the phone call. Is this not the case?

Changed in pulseaudio (Ubuntu):
status: New → Incomplete
Revision history for this message
Omer Akram (om26er) wrote :

No, the problem is that *if* my phone is muted before the call, it does not stay muted after I end the call, The volume automatically changes to full as soon as I end the call.

Revision history for this message
David Henningsson (diwic) wrote :

I was able to see something similar on the desktop, and came up with a patch to fix it. Can you test it and see if it resolves your problem as well?

Revision history for this message
David Henningsson (diwic) wrote : [PATCH] sink/source: Initialize port before fixate hook (fixes volume/mute not restored)

In case a port has not yet been saved, which is e g often the case
if a sink/source has only one port, reading volume/mute will be done
without port, whereas writing volume/mute will be done with port.

Work around this by setting a default port before the fixate hook,
so module-device-restore can read volume/mute for the correct port.

BugLink: https://bugs.launchpad.net/bugs/1289515
Signed-off-by: David Henningsson <email address hidden>
---
 src/pulsecore/sink.c | 11 +++++++++++
 src/pulsecore/source.c | 11 +++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 08143e9..9c4b0c3 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -235,6 +235,17 @@ pa_sink* pa_sink_new(
     pa_device_init_icon(data->proplist, true);
     pa_device_init_intended_roles(data->proplist);

+ if (!data->active_port && !data->save_port) {
+ void *state;
+ pa_device_port *p, *p2 = NULL;
+
+ PA_HASHMAP_FOREACH(p, data->ports, state)
+ if (!p2 || p->priority > p2->priority) {
+ p2 = p;
+ pa_sink_new_data_set_port(data, p2->name);
+ }
+ }
+
     if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_FIXATE], data) < 0) {
         pa_xfree(s);
         pa_namereg_unregister(core, name);
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index 2a600e2..94533df 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -222,6 +222,17 @@ pa_source* pa_source_new(
     pa_device_init_icon(data->proplist, false);
     pa_device_init_intended_roles(data->proplist);

+ if (!data->active_port && !data->save_port) {
+ void *state;
+ pa_device_port *p, *p2 = NULL;
+
+ PA_HASHMAP_FOREACH(p, data->ports, state)
+ if (!p2 || p->priority > p2->priority) {
+ p2 = p;
+ pa_source_new_data_set_port(data, p2->name);
+ }
+ }
+
     if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_FIXATE], data) < 0) {
         pa_xfree(s);
         pa_namereg_unregister(core, name);
--
1.7.9.5

Revision history for this message
David Henningsson (diwic) wrote :
tags: added: patch
Revision history for this message
Tanu Kaskinen (tanuk) wrote : Re: [pulseaudio-discuss] [PATCH] sink/source: Initialize port before fixate hook (fixes volume/mute not restored)

On Fri, 2014-03-21 at 10:27 +0100, David Henningsson wrote:
> In case a port has not yet been saved, which is e g often the case
> if a sink/source has only one port, reading volume/mute will be done
> without port, whereas writing volume/mute will be done with port.
>
> Work around this by setting a default port before the fixate hook,
> so module-device-restore can read volume/mute for the correct port.
>
> BugLink: https://bugs.launchpad.net/bugs/1289515
> Signed-off-by: David Henningsson <email address hidden>

Thanks, this also fixes this bug:
https://bugs.freedesktop.org/show_bug.cgi?id=55262

A couple of comments below.

> ---
> src/pulsecore/sink.c | 11 +++++++++++
> src/pulsecore/source.c | 11 +++++++++++
> 2 files changed, 22 insertions(+)
>
> diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
> index 08143e9..9c4b0c3 100644
> --- a/src/pulsecore/sink.c
> +++ b/src/pulsecore/sink.c
> @@ -235,6 +235,17 @@ pa_sink* pa_sink_new(
> pa_device_init_icon(data->proplist, true);
> pa_device_init_intended_roles(data->proplist);
>
> + if (!data->active_port && !data->save_port) {

How is data->save_port relevant here? If active_port is NULL, save_port
should always be false (true wouldn't have any meaning).

> + void *state;
> + pa_device_port *p, *p2 = NULL;
> +
> + PA_HASHMAP_FOREACH(p, data->ports, state)
> + if (!p2 || p->priority > p2->priority) {
> + p2 = p;
> + pa_sink_new_data_set_port(data, p2->name);

I'd prefer calling pa_sink_new_data_set_port() only once, i.e. outside
the loop.

> + }
> + }

This partially duplicates the code that is run later:

    if (!s->active_port) {
        void *state;
        pa_device_port *p;

        PA_HASHMAP_FOREACH(p, s->ports, state) {
            if (p->available == PA_AVAILABLE_NO)
                continue;

            if (!s->active_port || p->priority > s->active_port->priority)
                s->active_port = p;
        }
        if (!s->active_port) {
            PA_HASHMAP_FOREACH(p, s->ports, state)
                if (!s->active_port || p->priority > s->active_port->priority)
                    s->active_port = p;
        }
    }

I think we should do the fallback port initialization only once, in the
location where you added the new code. We should use the full logic of
the old fallback initialization code.

--
Tanu

Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package pulseaudio - 1:4.0-0ubuntu11

---------------
pulseaudio (1:4.0-0ubuntu11) trusty; urgency=medium

  * 0105-sink-source-Initialize-port-before-fixate-hook-fixes.patch:
    Fix volume/mute not restored in some cases (LP: #1285179, LP: #1289515)
  * 0106-module-switch-on-port-available-Don-t-switch-profile.patch:
    Fix profile incorrectly switched on startup (LP: #1256511)
 -- David Henningsson <email address hidden> Fri, 04 Apr 2014 09:39:55 +0200

Changed in pulseaudio (Ubuntu):
status: Incomplete → Fix Released
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.