From d8b78161966972c10415bb8eaea34533d0d7b279 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 29 Nov 2010 15:41:34 +0100 Subject: ucm: add ValueDefaults section to the master file - the get_value() function is recoded (tries to find the value in parent's list) Signed-off-by: Jaroslav Kysela --- src/ucm/main.c | 39 ++++++++++++++++++++++++++------------- src/ucm/parser.c | 42 ++++++++++++++++++++++++++++++------------ src/ucm/ucm_local.h | 3 +++ src/ucm/utils.c | 1 + 4 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/ucm/main.c b/src/ucm/main.c index 9f950e42..9ba5c744 100644 --- a/src/ucm/main.c +++ b/src/ucm/main.c @@ -445,6 +445,7 @@ int snd_use_case_mgr_open(snd_use_case_mgr_t **mgr, return -ENOMEM; INIT_LIST_HEAD(&uc_mgr->verb_list); INIT_LIST_HEAD(&uc_mgr->default_list); + INIT_LIST_HEAD(&uc_mgr->value_list); pthread_mutex_init(&uc_mgr->mutex, NULL); uc_mgr->card_name = strdup(card_name); @@ -688,6 +689,9 @@ static int get_value_list(snd_use_case_mgr_t *uc_mgr, if (verb == NULL) return -ENOENT; INIT_LIST_HEAD(&mylist); + err = add_values(&mylist, identifier, &uc_mgr->value_list); + if (err < 0) + goto __fail; err = add_values(&mylist, identifier, &verb->value_list); if (err < 0) goto __fail; @@ -821,14 +825,16 @@ static int get_value1(const char **value, struct list_head *value_list, return 0; } } - return 0; + return -ENOENT; } /** * \brief Get value - * \param list Returned list - * \param verbname For verb (NULL = current) - * \return Number of list entries if success, otherwise a negative error code + * \param uc_mgr Use case manager + * \param identifier Value identifier (string) + * \param value Returned value string + * \param modifier modifier name (string) + * \return Zero on success (value is filled), otherwise a negative error code */ static int get_value(snd_use_case_mgr_t *uc_mgr, const char *identifier, @@ -836,16 +842,23 @@ static int get_value(snd_use_case_mgr_t *uc_mgr, const char *modifier) { struct use_case_modifier *mod; + int err; - if (uc_mgr->active_verb == NULL) - return -ENOENT; - if (modifier == NULL) - return get_value1(value, &uc_mgr->active_verb->value_list, - identifier); - mod = find_modifier(uc_mgr->active_verb, modifier); - if (mod == NULL) - return -EINVAL; - return get_value1(value, &mod->value_list, identifier); + if (modifier != NULL) { + mod = find_modifier(uc_mgr->active_verb, modifier); + if (mod != NULL) { + err = get_value1(value, &mod->value_list, identifier); + if (err >= 0 || err != -ENOENT) + return err; + } + } + err = get_value1(value, &uc_mgr->active_verb->value_list, identifier); + if (err >= 0 || err != -ENOENT) + return err; + err = get_value1(value, &uc_mgr->value_list, identifier); + if (err >= 0 || err != -ENOENT) + return err; + return -ENOENT; } /** diff --git a/src/ucm/parser.c b/src/ucm/parser.c index 2407d399..b85ac0a2 100644 --- a/src/ucm/parser.c +++ b/src/ucm/parser.c @@ -930,26 +930,33 @@ static int parse_controls(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg) * # The file is divided into Use case sections. One section per use case verb. * * SectionUseCase."Voice Call" { - * File "voice_call_blah" - * Comment "Make a voice phone call." + * File "voice_call_blah" + * Comment "Make a voice phone call." * } * * SectionUseCase."HiFi" { - * File "hifi_blah" - * Comment "Play and record HiFi quality Music." + * File "hifi_blah" + * Comment "Play and record HiFi quality Music." + * } + * + * # Define Value defaults + * + * ValueDefaults { + * PlaybackCTL "hw:CARD=0,DEV=0" + * CaptureCTL "hw:CARD=0,DEV=0" * } * * # This file also stores the default sound card state. * * SectionDefaults [ - * cset "name='Master Playback Switch',index=2 1,1" - * cset "name='Master Playback Volume',index=2 25,25" - * cset "name='Master Mono Playback',index=1 0" - * cset "name='Master Mono Playback Volume',index=1 0" - * cset "name='PCM Switch',index=2 1,1" - * exec "some binary here" - * msleep 50 - * ........ + * cset "name='Master Playback Switch',index=2 1,1" + * cset "name='Master Playback Volume',index=2 25,25" + * cset "name='Master Mono Playback',index=1 0" + * cset "name='Master Mono Playback Volume',index=1 0" + * cset "name='PCM Switch',index=2 1,1" + * exec "some binary here" + * msleep 50 + * ........ * ] * * # End of example file. @@ -999,6 +1006,17 @@ static int parse_master_file(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg) return err; continue; } + + /* get the default values */ + if (strcmp(id, "ValueDefaults") == 0) { + err = parse_value(uc_mgr, &uc_mgr->value_list, n); + if (err < 0) { + uc_error("error: failed to parse ValueDefaults"); + return err; + } + continue; + } + uc_error("uknown master file field %s", id); } return 0; diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h index 479cc976..3060f960 100644 --- a/src/ucm/ucm_local.h +++ b/src/ucm/ucm_local.h @@ -173,6 +173,9 @@ struct snd_use_case_mgr { /* default settings - sequence */ struct list_head default_list; + /* default settings - value list */ + struct list_head value_list; + /* current status */ struct use_case_verb *active_verb; struct list_head active_devices; diff --git a/src/ucm/utils.c b/src/ucm/utils.c index 267a13c9..8de2de41 100644 --- a/src/ucm/utils.c +++ b/src/ucm/utils.c @@ -214,6 +214,7 @@ void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr) free(verb); } uc_mgr_free_sequence(&uc_mgr->default_list); + uc_mgr_free_value(&uc_mgr->value_list); free(uc_mgr->comment); uc_mgr->comment = NULL; uc_mgr->active_verb = NULL; -- cgit v1.2.1