Hi Poljar,

Sorry for top posting.

This patch is based on your github's commit. Of course, it doesn't
work yet because not everything is weaved together... However I'd like
to give others a chance to see what i'm doing and whether i'm on the
right track.

2012/8/3 Deng Zhengrong <dzro...@gmail.com>:
> module-card-restore now saves the maximum volume.
>
> This change includes a entry version bump.
> ---
>  src/modules/module-card-restore.c |   26 +++++++++++++++++++++++---
>  1 files changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/src/modules/module-card-restore.c 
> b/src/modules/module-card-restore.c
> index 7d101c5..689381d 100644
> --- a/src/modules/module-card-restore.c
> +++ b/src/modules/module-card-restore.c
> @@ -68,11 +68,12 @@ struct userdata {
>      pa_database *database;
>  };
>
> -#define ENTRY_VERSION 2
> +#define ENTRY_VERSION 3
>
>  struct port_info {
>      char *name;
>      int64_t offset;
> +    pa_volume_t max_volume;
>  };
>
>  struct entry {
> @@ -145,6 +146,7 @@ static pa_bool_t entry_write(struct userdata *u, const 
> char *name, const struct
>      PA_HASHMAP_FOREACH(p_info, e->ports, state) {
>          pa_tagstruct_puts(t, p_info->name);
>          pa_tagstruct_puts64(t, p_info->offset);
> +        pa_tagstruct_put_volume(t, p_info->max_volume);
>      }
>
>      key.data = (char *) name;
> @@ -249,6 +251,18 @@ static struct entry* entry_read(struct userdata *u, 
> const char *name) {
>              p_info->name = pa_xstrdup(port_name);
>              p_info->offset = port_offset;
>
> +            if (e->version >= 3) {
> +                pa_volume_t max_volume = PA_VOLUME_INVALID;
> +
> +                if (pa_tagstruct_get_volume(t, &max_volume) < 0) {
> +                    pa_xfree(p_info->name);
> +                    pa_xfree(p_info);
> +                    goto fail;
> +                }
> +
> +                p_info->max_volume = max_volume;
> +            }
> +
>              pa_assert_se(pa_hashmap_put(e->ports, p_info->name, p_info) >= 
> 0);
>          }
>      }
> @@ -313,6 +327,7 @@ static void subscribe_callback(pa_core *c, 
> pa_subscription_event_type_t t, uint3
>          p_info = pa_xnew(struct port_info, 1);
>          p_info->name = pa_xstrdup(p->name);
>          p_info->offset = p->latency_offset;
> +        p_info->max_volume = p->maximum_volume;
>
>          pa_assert_se(pa_hashmap_put(entry->ports, p_info->name, p_info) >= 
> 0);
>      }
> @@ -336,7 +351,10 @@ static void subscribe_callback(pa_core *c, 
> pa_subscription_event_type_t t, uint3
>                          dirty = true;
>                          break;
>                      }
> -
> +                    if (p_info->max_volume != old_p_info->max_volume) {
> +                        dirty = true;
> +                        break;
> +                    }
>                  } else {
>                      dirty = true;
>                      break;
> @@ -391,8 +409,10 @@ static pa_hook_result_t card_new_hook_callback(pa_core 
> *c, pa_card_new_data *new
>      pa_log_info("Restoring port latency offsets for card %s.", 
> new_data->name);
>
>      PA_HASHMAP_FOREACH(p_info, e->ports, state)
> -        if ((p = pa_hashmap_get(new_data->ports, p_info->name)))
> +        if ((p = pa_hashmap_get(new_data->ports, p_info->name))) {
>              p->latency_offset = p_info->offset;
> +            p->maximum_volume = p_info->max_volume;
> +        }
>
>      entry_free(e);
>
> --
> 1.7.7.6
>
_______________________________________________
pulseaudio-discuss mailing list
pulseaudio-discuss@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to