[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