summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2010-11-29 15:41:34 +0100
committerJaroslav Kysela <perex@perex.cz>2010-11-29 15:41:34 +0100
commitd8b78161966972c10415bb8eaea34533d0d7b279 (patch)
tree7a3ed410d968f03528b5f8adfd31d0d8feb2e40d
parentaaf55f16414eb81e8e805f669182f280496b41dd (diff)
downloadalsa-lib-d8b78161966972c10415bb8eaea34533d0d7b279.tar.gz
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>
-rw-r--r--src/ucm/main.c39
-rw-r--r--src/ucm/parser.c42
-rw-r--r--src/ucm/ucm_local.h3
-rw-r--r--src/ucm/utils.c1
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;