int snd_config_get_bool_ascii(const char *ascii);
int snd_config_get_bool(const snd_config_t *conf);
+int snd_config_get_card(const snd_config_t *conf);
int snd_config_get_ctl_iface_ascii(const char *ascii);
int snd_config_get_ctl_iface(const snd_config_t *conf);
#include <stdio.h>
#include <string.h>
#include <ctype.h>
+#include <limits.h>
#include "local.h"
/**
return err;
}
+/**
+ * \brief Gets the card number from a configuration node.
+ * \param conf Handle to the configuration node to be parsed.
+ * \return The card number if successful, otherwise a negative error code.
+ */
+int snd_config_get_card(const snd_config_t *conf)
+{
+ const char *str, *id;
+ long v;
+ int err;
+
+ if ((err = snd_config_get_integer(conf, &v)) < 0) {
+ if ((err = snd_config_get_string(conf, &str)) < 0) {
+ snd_config_get_id(conf, &id);
+ SNDERR("Invalid field %s", id);
+ return -EINVAL;
+ }
+ err = snd_card_get_index(str);
+ if (err < 0) {
+ SNDERR("Cannot get card index for %s", str);
+ return err;
+ }
+ v = err;
+ }
+ if (v < 0 || v > INT_MAX)
+ return -EINVAL;
+ return v;
+}
+
/**
* \brief Gets the control interface index from the given ASCII string.
* \param ascii The string to be parsed.
{
snd_config_iterator_t i, next;
long card = -1;
- const char *str;
int err;
snd_config_for_each(i, next, conf) {
snd_config_t *n = snd_config_iterator_entry(i);
if (_snd_conf_generic_id(id))
continue;
if (strcmp(id, "card") == 0) {
- err = snd_config_get_integer(n, &card);
- if (err < 0) {
- err = snd_config_get_string(n, &str);
- if (err < 0)
- return -EINVAL;
- card = snd_card_get_index(str);
- if (card < 0)
- return card;
- }
+ err = snd_config_get_card(n);
+ if (err < 0)
+ return err;
+ card = err;
continue;
}
return -EINVAL;
{
snd_config_iterator_t i, next;
long card = -1, device = 0;
- const char *str;
int err;
snd_config_for_each(i, next, conf) {
snd_config_t *n = snd_config_iterator_entry(i);
if (_snd_conf_generic_id(id))
continue;
if (strcmp(id, "card") == 0) {
- err = snd_config_get_integer(n, &card);
- if (err < 0) {
- err = snd_config_get_string(n, &str);
- if (err < 0)
- return -EINVAL;
- card = snd_card_get_index(str);
- if (card < 0)
- return card;
- }
+ err = snd_config_get_card(n);
+ if (err < 0)
+ return err;
+ card = err;
continue;
}
if (strcmp(id, "device") == 0) {
continue;
}
if (strcmp(id, "card") == 0) {
- err = snd_config_get_integer(n, &card);
- if (err < 0) {
- err = snd_config_get_string(n, &str);
- if (err < 0) {
- SNDERR("Invalid type for %s", id);
- return -EINVAL;
- }
- card = snd_card_get_index(str);
- if (card < 0) {
- SNDERR("Invalid value for %s", id);
- return card;
- }
- }
+ err = snd_config_get_card(n);
+ if (err < 0)
+ return err;
+ card = err;
continue;
}
if (strcmp(id, "device") == 0) {
if (snd_pcm_conf_generic_id(id))
continue;
if (strcmp(id, "card") == 0) {
- err = snd_config_get_integer(n, &card);
- if (err < 0) {
- err = snd_config_get_string(n, &str);
- if (err < 0) {
- SNDERR("Invalid type for %s", id);
- err = -EINVAL;
- goto fail;
- }
- card = snd_card_get_index(str);
- if (card < 0) {
- SNDERR("Invalid value for %s", id);
- err = card;
- goto fail;
- }
- }
+ err = snd_config_get_card(n);
+ if (err < 0)
+ goto fail;
+ card = err;
continue;
}
if (strcmp(id, "device") == 0) {
if (strcmp(id, "comment") == 0)
continue;
if (strcmp(id, "card") == 0) {
- const char *str;
- long v;
- if ((err = snd_config_get_integer(n, &v)) < 0) {
- if ((err = snd_config_get_string(n, &str)) < 0) {
- SNDERR("Invalid field %s", id);
- goto _err;
- }
- *cardp = snd_card_get_index(str);
- if (*cardp < 0) {
- SNDERR("Cannot get index for %s", str);
- err = *cardp;
- goto _err;
- }
- } else
- *cardp = v;
+ err = snd_config_get_card(n);
+ if (err < 0)
+ goto _err;
+ *cardp = err;
continue;
}
if (strcmp(id, "iface") == 0 || strcmp(id, "interface") == 0) {
{
snd_config_iterator_t i, next;
long card = -1, device = 0, subdevice = -1;
- const char *str;
int err;
snd_config_for_each(i, next, conf) {
snd_config_t *n = snd_config_iterator_entry(i);
if (snd_rawmidi_conf_generic_id(id))
continue;
if (strcmp(id, "card") == 0) {
- err = snd_config_get_integer(n, &card);
- if (err < 0) {
- err = snd_config_get_string(n, &str);
- if (err < 0)
- return -EINVAL;
- card = snd_card_get_index(str);
- if (card < 0)
- return card;
- }
+ err = snd_config_get_card(n);
+ if (err < 0)
+ return err;
+ card = err;
continue;
}
if (strcmp(id, "device") == 0) {
snd_config_iterator_t i, next;
long dev_class = SND_TIMER_CLASS_GLOBAL, dev_sclass = SND_TIMER_SCLASS_NONE;
long card = 0, device = 0, subdevice = 0;
- const char *str;
int err;
snd_config_for_each(i, next, conf) {
snd_config_t *n = snd_config_iterator_entry(i);
continue;
}
if (strcmp(id, "card") == 0) {
- err = snd_config_get_integer(n, &card);
- if (err < 0) {
- err = snd_config_get_string(n, &str);
- if (err < 0)
- return -EINVAL;
- card = snd_card_get_index(str);
- if (card < 0)
- return card;
- }
+ err = snd_config_get_card(n);
+ if (err < 0)
+ return err;
+ card = err;
continue;
}
if (strcmp(id, "device") == 0) {