Sound volume resets after making a call

Bug #1289515 reported by Omer Akram on 2014-03-07
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

Omer Akram (om26er) wrote :
Omer Akram (om26er) on 2014-03-07
summary: - Sound volumes resets after making a call
+ Sound volume resets after making a call
Omer Akram (om26er) on 2014-03-07
affects: telephony-service (Ubuntu) → pulseaudio (Ubuntu)
Changed in pulseaudio (Ubuntu):
assignee: nobody → David Henningsson (diwic)
importance: Undecided → High
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
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.

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?

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

tags: added: patch

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

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.