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 <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2010-11-29 15:41:34 +01:00
parent aaf55f1641
commit d8b7816196
4 changed files with 60 additions and 25 deletions

View file

@ -445,6 +445,7 @@ int snd_use_case_mgr_open(snd_use_case_mgr_t **mgr,
return -ENOMEM; return -ENOMEM;
INIT_LIST_HEAD(&uc_mgr->verb_list); INIT_LIST_HEAD(&uc_mgr->verb_list);
INIT_LIST_HEAD(&uc_mgr->default_list); INIT_LIST_HEAD(&uc_mgr->default_list);
INIT_LIST_HEAD(&uc_mgr->value_list);
pthread_mutex_init(&uc_mgr->mutex, NULL); pthread_mutex_init(&uc_mgr->mutex, NULL);
uc_mgr->card_name = strdup(card_name); 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) if (verb == NULL)
return -ENOENT; return -ENOENT;
INIT_LIST_HEAD(&mylist); 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); err = add_values(&mylist, identifier, &verb->value_list);
if (err < 0) if (err < 0)
goto __fail; goto __fail;
@ -821,14 +825,16 @@ static int get_value1(const char **value, struct list_head *value_list,
return 0; return 0;
} }
} }
return 0; return -ENOENT;
} }
/** /**
* \brief Get value * \brief Get value
* \param list Returned list * \param uc_mgr Use case manager
* \param verbname For verb (NULL = current) * \param identifier Value identifier (string)
* \return Number of list entries if success, otherwise a negative error code * \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, static int get_value(snd_use_case_mgr_t *uc_mgr,
const char *identifier, const char *identifier,
@ -836,16 +842,23 @@ static int get_value(snd_use_case_mgr_t *uc_mgr,
const char *modifier) const char *modifier)
{ {
struct use_case_modifier *mod; struct use_case_modifier *mod;
int err;
if (uc_mgr->active_verb == NULL) if (modifier != 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); mod = find_modifier(uc_mgr->active_verb, modifier);
if (mod == NULL) if (mod != NULL) {
return -EINVAL; err = get_value1(value, &mod->value_list, identifier);
return 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;
} }
/** /**

View file

@ -939,6 +939,13 @@ static int parse_controls(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg)
* Comment "Play and record HiFi quality Music." * 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. * # This file also stores the default sound card state.
* *
* SectionDefaults [ * SectionDefaults [
@ -999,6 +1006,17 @@ static int parse_master_file(snd_use_case_mgr_t *uc_mgr, snd_config_t *cfg)
return err; return err;
continue; 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); uc_error("uknown master file field %s", id);
} }
return 0; return 0;

View file

@ -173,6 +173,9 @@ struct snd_use_case_mgr {
/* default settings - sequence */ /* default settings - sequence */
struct list_head default_list; struct list_head default_list;
/* default settings - value list */
struct list_head value_list;
/* current status */ /* current status */
struct use_case_verb *active_verb; struct use_case_verb *active_verb;
struct list_head active_devices; struct list_head active_devices;

View file

@ -214,6 +214,7 @@ void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
free(verb); free(verb);
} }
uc_mgr_free_sequence(&uc_mgr->default_list); uc_mgr_free_sequence(&uc_mgr->default_list);
uc_mgr_free_value(&uc_mgr->value_list);
free(uc_mgr->comment); free(uc_mgr->comment);
uc_mgr->comment = NULL; uc_mgr->comment = NULL;
uc_mgr->active_verb = NULL; uc_mgr->active_verb = NULL;