]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: add ValueDefaults section to the master file
authorJaroslav Kysela <perex@perex.cz>
Mon, 29 Nov 2010 14:41:34 +0000 (15:41 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 29 Nov 2010 14:41:34 +0000 (15:41 +0100)
- the get_value() function is recoded (tries to find the value in
  parent's list)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/ucm/main.c
src/ucm/parser.c
src/ucm/ucm_local.h
src/ucm/utils.c

index 9f950e425c062b3d3ad57e2bd08312cd0ecd79e8..9ba5c74462a39c98ea52baf1faf5de82d4d66ac5 100644 (file)
@@ -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;
 }
 
 /**
index 2407d3996fa0a3477d999f8559e334cb59a7de0d..b85ac0a23c1de53cedabffd641488f3dcb30b46a 100644 (file)
@@ -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;
index 479cc97683acbc771f7b2cea749614d739b3a4f5..3060f960b8ddfcfb7e57f0a80388dd8630b29bbc 100644 (file)
@@ -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;
index 267a13c91c21791b1f38707083a14d43dec633cc..8de2de41a75eb224b927cd40ec0b3bc3d8611e19 100644 (file)
@@ -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;