[pulseaudio-discuss] [PATCH] card-restore: Add the ability to save and restore the maximum volume

Tanu Kaskinen tanuk at iki.fi
Mon Aug 13 00:08:12 PDT 2012


On Fri, 2012-08-03 at 15:12 +0800, Deng Zhengrong wrote:
> 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;
> +            }

p_info->max_volume needs to be initialized even when e->version is less
than 3. Also, the local max_volume variable is redundant: you can give
p_info->max_volume directly to pa_tagstruct_get_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;

Later in the function there's this:

    if (card->save_profile)
        pa_log_info("Storing profile and port latency offsets for card %s.", card->name);
    else
        pa_log_info("Storing port latency offsets for card %s.", card->name);

That code is now out of date.

> @@ -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);

There should be a mention of restoring the maximum volume too.

>  
>      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);

-- 
Tanu



More information about the pulseaudio-discuss mailing list