diff options
| author | Lennart Poettering <lennart@poettering.net> | 2009-08-07 23:55:06 +0200 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2009-08-07 23:55:06 +0200 | 
| commit | 51b3899348bf29dd88b56691aeea9f57895dfd14 (patch) | |
| tree | 3ff84a85873cd8d1fc92375f3f4c7a76547774bb | |
| parent | aa7408b54b6bf7cd58b894fbbe048109787d4beb (diff) | |
core: save volume/mute changes coming from the hardware automatically
Volume changes coming from the lower layers are most likely changes
triggered by the user, so let's save them automatically.
| -rw-r--r-- | src/modules/bluetooth/module-bluetooth-device.c | 4 | ||||
| -rw-r--r-- | src/modules/module-tunnel.c | 4 | ||||
| -rw-r--r-- | src/pulsecore/sink.c | 25 | ||||
| -rw-r--r-- | src/pulsecore/sink.h | 4 | ||||
| -rw-r--r-- | src/pulsecore/source.c | 22 | ||||
| -rw-r--r-- | src/pulsecore/source.h | 4 | 
6 files changed, 34 insertions, 29 deletions
| diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c index 0560ef32..e682997f 100644 --- a/src/modules/bluetooth/module-bluetooth-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -1446,12 +1446,12 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us              if (u->sink && dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged")) {                  pa_cvolume_set(&v, u->sample_spec.channels, (pa_volume_t) (gain * PA_VOLUME_NORM / 15)); -                pa_sink_volume_changed(u->sink, &v, TRUE); +                pa_sink_volume_changed(u->sink, &v);              } else if (u->source && dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {                  pa_cvolume_set(&v, u->sample_spec.channels, (pa_volume_t) (gain * PA_VOLUME_NORM / 15)); -                pa_source_volume_changed(u->source, &v, TRUE); +                pa_source_volume_changed(u->source, &v);              }          }      } diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c index f788f660..eaccea4e 100644 --- a/src/modules/module-tunnel.c +++ b/src/modules/module-tunnel.c @@ -1165,10 +1165,10 @@ static void sink_input_info_cb(pa_pdispatch *pd, uint32_t command,  uint32_t tag          pa_cvolume_equal(&volume, &u->sink->virtual_volume))          return; -    pa_sink_volume_changed(u->sink, &volume, FALSE); +    pa_sink_volume_changed(u->sink, &volume);      if (u->version >= 11) -        pa_sink_mute_changed(u->sink, mute, FALSE); +        pa_sink_mute_changed(u->sink, mute);      return; diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index d8f3c7d1..73a70625 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -1386,6 +1386,12 @@ const pa_cvolume *pa_sink_get_volume(pa_sink *s, pa_bool_t force_refresh, pa_boo              s->reference_volume = s->virtual_volume; +            /* Something got changed in the hardware. It probably +             * makes sense to save changed hw settings given that hw +             * volume changes not triggered by PA are almost certainly +             * done by the user. */ +            s->save_volume = TRUE; +              if (s->flags & PA_SINK_FLAT_VOLUME)                  pa_sink_propagate_flat_volume(s); @@ -1397,17 +1403,15 @@ const pa_cvolume *pa_sink_get_volume(pa_sink *s, pa_bool_t force_refresh, pa_boo  }  /* Called from main thread */ -void pa_sink_volume_changed(pa_sink *s, const pa_cvolume *new_volume, pa_bool_t save) { +void pa_sink_volume_changed(pa_sink *s, const pa_cvolume *new_volume) {      pa_sink_assert_ref(s);      /* The sink implementor may call this if the volume changed to make sure everyone is notified */ -    if (pa_cvolume_equal(&s->virtual_volume, new_volume)) { -        s->save_volume = s->save_volume || save; +    if (pa_cvolume_equal(&s->virtual_volume, new_volume))          return; -    }      s->reference_volume = s->virtual_volume = *new_volume; -    s->save_volume = save; +    s->save_volume = TRUE;      if (s->flags & PA_SINK_FLAT_VOLUME)          pa_sink_propagate_flat_volume(s); @@ -1449,6 +1453,8 @@ pa_bool_t pa_sink_get_mute(pa_sink *s, pa_bool_t force_refresh) {          pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_GET_MUTE, NULL, 0, NULL) == 0);          if (old_muted != s->muted) { +            s->save_muted = TRUE; +              pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);              /* Make sure the soft mute status stays in sync */ @@ -1456,22 +1462,21 @@ pa_bool_t pa_sink_get_mute(pa_sink *s, pa_bool_t force_refresh) {          }      } +      return s->muted;  }  /* Called from main thread */ -void pa_sink_mute_changed(pa_sink *s, pa_bool_t new_muted, pa_bool_t save) { +void pa_sink_mute_changed(pa_sink *s, pa_bool_t new_muted) {      pa_sink_assert_ref(s);      /* The sink implementor may call this if the volume changed to make sure everyone is notified */ -    if (s->muted == new_muted) { -        s->save_muted = s->save_muted || save; +    if (s->muted == new_muted)          return; -    }      s->muted = new_muted; -    s->save_muted = save; +    s->save_muted = TRUE;      pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);  } diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index d16fcc01..7a8cdaf1 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -267,8 +267,8 @@ void pa_sink_detach(pa_sink *s);  void pa_sink_attach(pa_sink *s);  void pa_sink_set_soft_volume(pa_sink *s, const pa_cvolume *volume); -void pa_sink_volume_changed(pa_sink *s, const pa_cvolume *new_volume, pa_bool_t save); -void pa_sink_mute_changed(pa_sink *s, pa_bool_t new_muted, pa_bool_t save); +void pa_sink_volume_changed(pa_sink *s, const pa_cvolume *new_volume); +void pa_sink_mute_changed(pa_sink *s, pa_bool_t new_muted);  pa_bool_t pa_device_init_description(pa_proplist *p);  pa_bool_t pa_device_init_icon(pa_proplist *p, pa_bool_t is_sink); diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index 74f38bc5..ad7462b1 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -773,26 +773,26 @@ const pa_cvolume *pa_source_get_volume(pa_source *s, pa_bool_t force_refresh) {          pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_VOLUME, NULL, 0, NULL) == 0); -        if (!pa_cvolume_equal(&old_virtual_volume, &s->virtual_volume)) +        if (!pa_cvolume_equal(&old_virtual_volume, &s->virtual_volume)) { +            s->save_volume = TRUE;              pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index); +        }      }      return &s->virtual_volume;  }  /* Called from main thread */ -void pa_source_volume_changed(pa_source *s, const pa_cvolume *new_volume, pa_bool_t save) { +void pa_source_volume_changed(pa_source *s, const pa_cvolume *new_volume) {      pa_source_assert_ref(s);      /* The source implementor may call this if the volume changed to make sure everyone is notified */ -    if (pa_cvolume_equal(&s->virtual_volume, new_volume)) { -        s->save_volume = s->save_volume || save; +    if (pa_cvolume_equal(&s->virtual_volume, new_volume))          return; -    }      s->virtual_volume = *new_volume; -    s->save_volume = save; +    s->save_volume = TRUE;      pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);  } @@ -831,6 +831,8 @@ pa_bool_t pa_source_get_mute(pa_source *s, pa_bool_t force_refresh) {          pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SOURCE_MESSAGE_GET_MUTE, NULL, 0, NULL) == 0);          if (old_muted != s->muted) { +            s->save_muted = TRUE; +              pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);              /* Make sure the soft mute status stays in sync */ @@ -842,18 +844,16 @@ pa_bool_t pa_source_get_mute(pa_source *s, pa_bool_t force_refresh) {  }  /* Called from main thread */ -void pa_source_mute_changed(pa_source *s, pa_bool_t new_muted, pa_bool_t save) { +void pa_source_mute_changed(pa_source *s, pa_bool_t new_muted) {      pa_source_assert_ref(s);      /* The source implementor may call this if the mute state changed to make sure everyone is notified */ -    if (s->muted == new_muted) { -        s->save_muted = s->save_muted || save; +    if (s->muted == new_muted)          return; -    }      s->muted = new_muted; -    s->save_muted = save; +    s->save_muted = TRUE;      pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index);  } diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h index 7e9fd8b7..d22e7ca5 100644 --- a/src/pulsecore/source.h +++ b/src/pulsecore/source.h @@ -237,8 +237,8 @@ void pa_source_detach(pa_source *s);  void pa_source_attach(pa_source *s);  void pa_source_set_soft_volume(pa_source *s, const pa_cvolume *volume); -void pa_source_volume_changed(pa_source *s, const pa_cvolume *new_volume, pa_bool_t save); -void pa_source_mute_changed(pa_source *s, pa_bool_t new_muted, pa_bool_t save); +void pa_source_volume_changed(pa_source *s, const pa_cvolume *new_volume); +void pa_source_mute_changed(pa_source *s, pa_bool_t new_muted);  int pa_source_sync_suspend(pa_source *s); | 
