]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: add snd_use_case_parse_selem_id()
authorJaroslav Kysela <perex@perex.cz>
Mon, 11 Nov 2019 13:22:36 +0000 (14:22 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 14 Nov 2019 14:00:40 +0000 (15:00 +0100)
and add strict ucm_id checks to snd_use_case_parse_ctl_elem_id()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
include/use-case.h
src/ucm/main.c

index 109502aa842f89181a4366fa17f41f651bfc23d5..eb4643c8f6c3a4a2370b2ce16eef005847f0a0cc 100644 (file)
@@ -447,8 +447,19 @@ static __inline__ int snd_use_case_verb_list(snd_use_case_mgr_t *uc_mgr,
  * \return Zero if success, otherwise a negative error code
  */
 int snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
-                                  const char *ucm_id, char *value);
+                                  const char *ucm_id,
+                                  const char *value);
 
+/**
+ * \brief Parse mixer element identifier
+ * \param dst Simple mixer element identifier
+ * \param ucm_id Use case identifier
+ * \param value String value to be parsed
+ * \return Zero if success, otherwise a negative error code
+ */
+int snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
+                               const char *ucm_id,
+                               const char *value);
 
 /**
  *  \}
index 773c72583796e357c0f05219abb52ec57b0c3114..8ab3900664d961fc34f31c1d42639eaf23910930 100644 (file)
@@ -1929,17 +1929,43 @@ int snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
  * \return Zero if success, otherwise a negative error code
  */
 int snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
-                                  const char *ucm_id, char *value)
+                                  const char *ucm_id,
+                                  const char *value)
 {
        snd_ctl_elem_iface_t iface;
-
+       int jack_control;
+
+       jack_control = strcmp(ucm_id, "JackControl") == 0;
+       if (!jack_control &&
+           strcmp(ucm_id, "PlaybackVolume") &&
+           strcmp(ucm_id, "PlaybackSwitch") &&
+           strcmp(ucm_id, "CaptureVolume") &&
+           strcmp(ucm_id, "CaptureSwitch"))
+               return -EINVAL;
        snd_ctl_elem_id_clear(dst);
        if (strcasestr(ucm_id, "name="))
                return __snd_ctl_ascii_elem_id_parse(dst, value, NULL);
        iface = SND_CTL_ELEM_IFACE_MIXER;
-       if (strcasecmp(ucm_id, "JackControl") == 0)
+       if (jack_control)
                iface = SND_CTL_ELEM_IFACE_CARD;
        snd_ctl_elem_id_set_interface(dst, iface);
        snd_ctl_elem_id_set_name(dst, value);
        return 0;
 }
+
+/**
+ * \brief Parse mixer element identifier
+ * \param dst Simple mixer element identifier
+ * \param ucm_id Use case identifier
+ * \param value String value to be parsed
+ * \return Zero if success, otherwise a negative error code
+ */
+int snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
+                               const char *ucm_id,
+                               const char *value)
+{
+       if (strcmp(ucm_id, "PlaybackMixerId") == 0 ||
+           strcmp(ucm_id, "CaptureMixerId") == 0)
+               return snd_mixer_selem_id_parse(dst, value);
+       return -EINVAL;
+}