]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ctl: support extra information to user-defined element set
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 29 Jun 2016 13:42:59 +0000 (22:42 +0900)
committerTakashi Iwai <tiwai@suse.de>
Thu, 30 Jun 2016 06:42:17 +0000 (08:42 +0200)
In ALSA control feature, information of an element includes extra fields
to type-specific parameters; i.e. dimension. The fields can be extended in
future.

Meanwhile, current APIs to add user-defined element set can not support
such an extended fields. This may cause inconveniences in future.

This commit supports the fields, by changing APIs for element set.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/control.h
src/control/control.c
src/pcm/pcm_softvol.c

index 13b0d4e5c8899bf3a156afe463d02b6840d00c8a..b14edee30fab1e31ce85afcb14ae1376ab2be19c 100644 (file)
@@ -423,24 +423,24 @@ void snd_ctl_elem_info_set_subdevice(snd_ctl_elem_info_t *obj, unsigned int val)
 void snd_ctl_elem_info_set_name(snd_ctl_elem_info_t *obj, const char *val);
 void snd_ctl_elem_info_set_index(snd_ctl_elem_info_t *obj, unsigned int val);
 
-int snd_ctl_elem_add_integer_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_integer_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                 unsigned int element_count,
                                 unsigned int member_count,
                                 long min, long max, long step);
-int snd_ctl_elem_add_integer64_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_integer64_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                   unsigned int element_count,
                                   unsigned int member_count,
                                   long long min, long long max,
                                   long long step);
-int snd_ctl_elem_add_boolean_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_boolean_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                 unsigned int element_count,
                                 unsigned int member_count);
-int snd_ctl_elem_add_enumerated_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_enumerated_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                    unsigned int element_count,
                                    unsigned int member_count,
                                    unsigned int items,
                                    const char *const labels[]);
-int snd_ctl_elem_add_bytes_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_bytes_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                               unsigned int element_count,
                               unsigned int member_count);
 
index c7fcbd23aa24d61cc1444e0dec1dac4e42b14c94..70b166b81e40904107e15a6d813ad953575bbeb9 100644 (file)
@@ -305,7 +305,8 @@ int snd_ctl_elem_info(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
 /**
  * \brief Create and add some user-defined control elements of integer type.
  * \param ctl A handle of backend module for control interface.
- * \param id ID of the first new element.
+ * \param info Common iformation for a new element set, with ID of the first new
+ *            element.
  * \param element_count The number of elements added by this operation.
  * \param member_count The number of members which a element has to
  *                        represent its states.
@@ -342,38 +343,36 @@ int snd_ctl_elem_info(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
  * \par Compatibility:
  * This function is added in version 1.1.2.
  */
-int snd_ctl_elem_add_integer_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_integer_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                 unsigned int element_count,
                                 unsigned int member_count,
                                 long min, long max, long step)
 {
-       snd_ctl_elem_info_t info = {0};
        snd_ctl_elem_value_t data = {0};
        unsigned int i;
        unsigned int j;
        unsigned int numid;
        int err;
 
-       assert(ctl && id && id->name[0]);
+       assert(ctl && info && info->id.name[0]);
 
-       info.id = *id;
-       info.type = SND_CTL_ELEM_TYPE_INTEGER;
-       info.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_USER;
-       info.owner = element_count;
-       info.count = member_count;
-       info.value.integer.min = min;
-       info.value.integer.max = max;
-       info.value.integer.step = step;
-
-       err = ctl->ops->element_add(ctl, &info);
+       info->type = SND_CTL_ELEM_TYPE_INTEGER;
+       info->access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_USER;
+       info->owner = element_count;
+       info->count = member_count;
+       info->value.integer.min = min;
+       info->value.integer.max = max;
+       info->value.integer.step = step;
+
+       err = ctl->ops->element_add(ctl, info);
        if (err < 0)
                return err;
-       numid = snd_ctl_elem_id_get_numid(&info.id);
+       numid = snd_ctl_elem_id_get_numid(&info->id);
 
        /* Set initial value to all of members in all of added elements. */
-       data.id = info.id;
+       data.id = info->id;
        for (i = 0; i < element_count; i++) {
                snd_ctl_elem_id_set_numid(&data.id, numid + i);
 
@@ -385,14 +384,14 @@ int snd_ctl_elem_add_integer_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
                        return err;
        }
 
-       *id = info.id;
        return 0;
 }
 
 /**
  * \brief Create and add some user-defined control elements of integer64 type.
  * \param ctl A handle of backend module for control interface.
- * \param id ID of the first new control element.
+ * \param info Common iformation for a new element set, with ID of the first new
+ *            element.
  * \param element_count The number of elements added by this operation.
  * \param member_count The number of members which a element has to
  *                represent its states.
@@ -429,38 +428,36 @@ int snd_ctl_elem_add_integer_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
  * \par Compatibility:
  * This function is added in version 1.1.2.
  */
-int snd_ctl_elem_add_integer64_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_integer64_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                   unsigned int element_count,
                                   unsigned int member_count,
                                   long long min, long long max, long long step)
 {
-       snd_ctl_elem_info_t info = {0};
        snd_ctl_elem_value_t data = {0};
        unsigned int i;
        unsigned int j;
        unsigned int numid;
        int err;
 
-       assert(ctl && id && id->name[0]);
+       assert(ctl && info && info->id.name[0]);
 
-       info.id = *id;
-       info.type = SND_CTL_ELEM_TYPE_INTEGER64;
-       info.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_USER;
-       info.owner = element_count;
-       info.count = member_count;
-       info.value.integer64.min = min;
-       info.value.integer64.max = max;
-       info.value.integer64.step = step;
-
-       err = ctl->ops->element_add(ctl, &info);
+       info->type = SND_CTL_ELEM_TYPE_INTEGER64;
+       info->access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_USER;
+       info->owner = element_count;
+       info->count = member_count;
+       info->value.integer64.min = min;
+       info->value.integer64.max = max;
+       info->value.integer64.step = step;
+
+       err = ctl->ops->element_add(ctl, info);
        if (err < 0)
                return err;
-       numid = snd_ctl_elem_id_get_numid(&info.id);
+       numid = snd_ctl_elem_id_get_numid(&info->id);
 
        /* Set initial value to all of members in all of added elements. */
-       data.id = info.id;
+       data.id = info->id;
        for (i = 0; i < element_count; i++) {
                snd_ctl_elem_id_set_numid(&data.id, numid + i);
 
@@ -472,14 +469,14 @@ int snd_ctl_elem_add_integer64_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
                        return err;
        }
 
-       *id = info.id;
        return 0;
 }
 
 /**
  * \brief Create and add some user-defined control elements of boolean type.
  * \param ctl A handle of backend module for control interface.
- * \param id ID of the new control element.
+ * \param info Common iformation for a new element set, with ID of the first new
+ *            element.
  * \param element_count The number of elements added by this operation.
  * \param member_count The number of members which a element has to
  *                        represent its states.
@@ -512,36 +509,29 @@ int snd_ctl_elem_add_integer64_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
  * \par Compatibility:
  * This function is added in version 1.1.2.
  */
-int snd_ctl_elem_add_boolean_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_boolean_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                 unsigned int element_count,
                                 unsigned int member_count)
 {
-       snd_ctl_elem_info_t info = {0};
-       int err;
-
-       assert(ctl && id && id->name[0]);
+       assert(ctl && info && info->id.name[0]);
 
-       info.id = *id;
-       info.type = SND_CTL_ELEM_TYPE_BOOLEAN;
-       info.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_USER;
-       info.owner = element_count;
-       info.count = member_count;
-       info.value.integer.min = 0;
-       info.value.integer.max = 1;
-
-       err = ctl->ops->element_add(ctl, &info);
-       if (err >= 0)
-               *id = info.id;
+       info->type = SND_CTL_ELEM_TYPE_BOOLEAN;
+       info->access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_USER;
+       info->owner = element_count;
+       info->count = member_count;
+       info->value.integer.min = 0;
+       info->value.integer.max = 1;
 
-       return err;
+       return ctl->ops->element_add(ctl, info);
 }
 
 /**
  * \brief Create and add some user-defined control elements of enumerated type.
  * \param ctl A handle of backend module for control interface.
- * \param id ID of the first new element.
+ * \param info Common iformation for a new element set, with ID of the first new
+ *            element.
  * \param element_count The number of elements added by this operation.
  * \param member_count The number of members which a element has to
  *                represent its states.
@@ -579,27 +569,25 @@ int snd_ctl_elem_add_boolean_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
  * \par Compatibility:
  * This function is added in version 1.1.2.
  */
-int snd_ctl_elem_add_enumerated_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_enumerated_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                                    unsigned int element_count,
                                    unsigned int member_count,
                                    unsigned int items,
                                    const char *const labels[])
 {
-       snd_ctl_elem_info_t info = {0};
        unsigned int i, bytes;
        char *buf, *p;
        int err;
 
-       assert(ctl && id && id->name[0] && labels);
+       assert(ctl && info && info->id.name[0] && labels);
 
-       info.id = *id;
-       info.type = SND_CTL_ELEM_TYPE_ENUMERATED;
-       info.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_USER;
-       info.owner = element_count;
-       info.count = member_count;
-       info.value.enumerated.items = items;
+       info->type = SND_CTL_ELEM_TYPE_ENUMERATED;
+       info->access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_USER;
+       info->owner = element_count;
+       info->count = member_count;
+       info->value.enumerated.items = items;
 
        bytes = 0;
        for (i = 0; i < items; ++i)
@@ -609,17 +597,15 @@ int snd_ctl_elem_add_enumerated_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
        buf = malloc(bytes);
        if (buf == NULL)
                return -ENOMEM;
-       info.value.enumerated.names_ptr = (uintptr_t)buf;
-       info.value.enumerated.names_length = bytes;
+       info->value.enumerated.names_ptr = (uintptr_t)buf;
+       info->value.enumerated.names_length = bytes;
        p = buf;
        for (i = 0; i < items; ++i) {
                strcpy(p, labels[i]);
                p += strlen(labels[i]) + 1;
        }
 
-       err = ctl->ops->element_add(ctl, &info);
-       if (err >= 0)
-               *id = info.id;
+       err = ctl->ops->element_add(ctl, info);
 
        free(buf);
 
@@ -629,7 +615,8 @@ int snd_ctl_elem_add_enumerated_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
 /**
  * \brief Create and add some user-defined control elements of bytes type.
  * \param ctl A handle of backend module for control interface.
- * \param id ID of the first new element.
+ * \param info Common iformation for a new element set, with ID of the first new
+ *            element.
  * \param element_count The number of elements added by this operation.
  * \param member_count The number of members which a element has to
  *                        represent its states.
@@ -663,28 +650,20 @@ int snd_ctl_elem_add_enumerated_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
  * \par Compatibility:
  * This function is added in version 1.1.2.
  */
-int snd_ctl_elem_add_bytes_set(snd_ctl_t *ctl, snd_ctl_elem_id_t *id,
+int snd_ctl_elem_add_bytes_set(snd_ctl_t *ctl, snd_ctl_elem_info_t *info,
                               unsigned int element_count,
                               unsigned int member_count)
 {
-       snd_ctl_elem_info_t info = {0};
-       int err;
-
-       assert(ctl && id && id->name[0]);
+       assert(ctl && info && info->id.name[0]);
 
-       info.id = *id;
-       info.type = SND_CTL_ELEM_TYPE_BYTES;
-       info.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
-                     SNDRV_CTL_ELEM_ACCESS_USER;
-       info.owner = element_count;
-       info.count = member_count;
-
-       err = ctl->ops->element_add(ctl, &info);
-       if (err >= 0)
-               *id = info.id;
+       info->type = SND_CTL_ELEM_TYPE_BYTES;
+       info->access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE |
+                      SNDRV_CTL_ELEM_ACCESS_USER;
+       info->owner = element_count;
+       info->count = member_count;
 
-       return err;
+       return ctl->ops->element_add(ctl, info);
 }
 
 /**
@@ -698,11 +677,11 @@ int snd_ctl_elem_add_integer(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
                             unsigned int member_count,
                             long min, long max, long step)
 {
-       snd_ctl_elem_id_t local_id = {0};
+       snd_ctl_elem_info_t info = {0};
 
-       local_id = *id;
+       info.id = *id;
 
-       return snd_ctl_elem_add_integer_set(ctl, &local_id, 1, member_count,
+       return snd_ctl_elem_add_integer_set(ctl, &info, 1, member_count,
                                            min, max, step);
 }
 
@@ -717,11 +696,11 @@ int snd_ctl_elem_add_integer64(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
                               unsigned int member_count,
                               long long min, long long max, long long step)
 {
-       snd_ctl_elem_id_t local_id = {0};
+       snd_ctl_elem_info_t info = {0};
 
-       local_id = *id;
+       info.id = *id;
 
-       return snd_ctl_elem_add_integer64_set(ctl, &local_id, 1, member_count,
+       return snd_ctl_elem_add_integer64_set(ctl, &info, 1, member_count,
                                              min, max, step);
 }
 
@@ -735,11 +714,11 @@ int snd_ctl_elem_add_integer64(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
 int snd_ctl_elem_add_boolean(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
                             unsigned int member_count)
 {
-       snd_ctl_elem_id_t local_id = {0};
+       snd_ctl_elem_info_t info = {0};
 
-       local_id = *id;
+       info.id = *id;
 
-       return snd_ctl_elem_add_boolean_set(ctl, &local_id, 1, member_count);
+       return snd_ctl_elem_add_boolean_set(ctl, &info, 1, member_count);
 }
 
 /**
@@ -755,11 +734,11 @@ int snd_ctl_elem_add_enumerated(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
                                unsigned int member_count, unsigned int items,
                                const char *const labels[])
 {
-       snd_ctl_elem_id_t local_id = {0};
+       snd_ctl_elem_info_t info = {0};
 
-       local_id = *id;
+       info.id = *id;
 
-       return snd_ctl_elem_add_enumerated_set(ctl, &local_id, 1, member_count,
+       return snd_ctl_elem_add_enumerated_set(ctl, &info, 1, member_count,
                                               items, labels);
 }
 
index 459ff8ee3a7207863f7df0b201b4799c2d16e609..a667c85aee3bae1486ef131111dc85351184e1b1 100644 (file)
@@ -663,18 +663,18 @@ static int add_tlv_info(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo)
        return snd_ctl_elem_tlv_write(svol->ctl, &cinfo->id, tlv);
 }
 
-static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo, int count)
+static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo,
+                       int count)
 {
        int err;
        int i;
        unsigned int def_val;
        
        if (svol->max_val == 1)
-               err = snd_ctl_elem_add_boolean_set(svol->ctl, &cinfo->id, 1,
-                                                  count);
+               err = snd_ctl_elem_add_boolean_set(svol->ctl, cinfo, 1, count);
        else
-               err = snd_ctl_elem_add_integer_set(svol->ctl, &cinfo->id, 1,
-                                                  count, 0, svol->max_val, 0);
+               err = snd_ctl_elem_add_integer_set(svol->ctl, cinfo, 1, count,
+                                                  0, svol->max_val, 0);
        if (err < 0)
                return err;
        if (svol->max_val == 1)