int snd_config_make_pointer(snd_config_t **config, const char *key);
int snd_config_make_compound(snd_config_t **config, const char *key, int join);
+int snd_config_imake_integer(snd_config_t **config, const char *key, const long value);
+int snd_config_imake_real(snd_config_t **config, const char *key, const double value);
+int snd_config_imake_string(snd_config_t **config, const char *key, const char *ascii);
+int snd_config_imake_pointer(snd_config_t **config, const char *key, const void *ptr);
+
snd_config_type_t snd_config_get_type(snd_config_t *config);
int snd_config_set_id(snd_config_t *config, const char *id);
return 0;
}
+/**
+ * \brief Build an integer config node and use given initial value
+ * \param config Returned config node handle pointer
+ * \param id Node id
+ * \param value Initial value
+ * \return 0 on success otherwise a negative error code
+ */
+int snd_config_imake_integer(snd_config_t **config, const char *id, const long value)
+{
+ int err;
+
+ err = snd_config_make(config, id, SND_CONFIG_TYPE_INTEGER);
+ if (err < 0)
+ return err;
+ (*config)->u.integer = value;
+ return 0;
+}
+
+/**
+ * \brief Build a real config node and use given initial value
+ * \param config Returned config node handle pointer
+ * \param id Node id
+ * \param value Initial value
+ * \return 0 on success otherwise a negative error code
+ */
+int snd_config_imake_real(snd_config_t **config, const char *id, const double value)
+{
+ int err;
+
+ err = snd_config_make(config, id, SND_CONFIG_TYPE_REAL);
+ if (err < 0)
+ return err;
+ (*config)->u.real = value;
+ return 0;
+}
+
+/**
+ * \brief Build a string config node and use given initial value
+ * \param config Returned config node handle pointer
+ * \param id Node id
+ * \param value Initial value
+ * \return 0 on success otherwise a negative error code
+ */
+int snd_config_imake_string(snd_config_t **config, const char *id, const char *value)
+{
+ int err;
+ snd_config_t *tmp;
+
+ err = snd_config_make(&tmp, id, SND_CONFIG_TYPE_STRING);
+ if (err < 0)
+ return err;
+ if (value) {
+ tmp->u.string = strdup(value);
+ if (!tmp->u.string) {
+ snd_config_delete(tmp);
+ return -ENOMEM;
+ }
+ } else {
+ tmp->u.string = NULL;
+ }
+ *config = tmp;
+ return 0;
+}
+
+/**
+ * \brief Build a pointer config node and use given initial value
+ * \param config Returned config node handle pointer
+ * \param id Node id
+ * \param value Initial value
+ * \return 0 on success otherwise a negative error code
+ */
+int snd_config_imake_pointer(snd_config_t **config, const char *id, const void *value)
+{
+ int err;
+
+ err = snd_config_make(config, id, SND_CONFIG_TYPE_POINTER);
+ if (err < 0)
+ return err;
+ (*config)->u.ptr = value;
+ return 0;
+}
+
/**
* \brief Change the value of an integer config node
* \param config Config node handle
return -EINVAL;
if (config->u.string)
free(config->u.string);
- config->u.string = strdup(value);
- if (!config->u.string)
- return -ENOMEM;
+ if (value) {
+ config->u.string = strdup(value);
+ if (!config->u.string)
+ return -ENOMEM;
+ } else {
+ config->u.string = NULL;
+ }
return 0;
}
err = snd_determine_driver(card, &fdriver);
if (err < 0)
return err;
- err = snd_config_make_string(&private_data, "string");
+ err = snd_config_imake_string(&private_data, "string", fdriver);
if (err < 0)
goto __err;
- snd_config_set_string(private_data, fdriver);
if (snd_config_search(root, fdriver, &n) >= 0) {
if (snd_config_get_string(n, &driver) < 0)
continue;
case SND_CONFIG_TYPE_INTEGER:
{
long v;
- err = snd_config_make(dst, id, type);
- if (err < 0)
- return err;
err = snd_config_get_integer(src, &v);
assert(err >= 0);
- snd_config_set_integer(*dst, v);
+ err = snd_config_imake_integer(dst, id, v);
+ if (err < 0)
+ return err;
break;
}
case SND_CONFIG_TYPE_REAL:
{
double v;
- err = snd_config_make(dst, id, type);
- if (err < 0)
- return err;
err = snd_config_get_real(src, &v);
assert(err >= 0);
- snd_config_set_real(*dst, v);
+ err = snd_config_imake_real(dst, id, v);
+ if (err < 0)
+ return err;
break;
}
case SND_CONFIG_TYPE_STRING:
return err;
}
} else {
- err = snd_config_make(dst, id, type);
+ err = snd_config_imake_string(dst, id, s);
if (err < 0)
return err;
- err = snd_config_set_string(*dst, s);
- if (err < 0) {
- snd_config_delete(*dst);
- return err;
- }
}
break;
}
if (err >= 0) {
const char *id;
err = snd_config_get_id(src, &id);
- if (err >= 0) {
- err = snd_config_make_string(dst, id);
- if (err >= 0)
- snd_config_set_string(*dst, res);
- }
+ if (err >= 0)
+ err = snd_config_imake_string(dst, id, res);
free(res);
}
__error:
err = snd_config_get_id(src, &id);
if (err < 0)
return err;
- err = snd_config_make_integer(dst, id);
+ err = snd_config_imake_integer(dst, id, v);
if (err < 0)
return err;
- snd_config_set_integer(*dst, v);
return 0;
}
#ifndef DOC_HIDDEN
goto __error;
}
err = snd_config_get_id(src, &id);
- if (err >= 0) {
- err = snd_config_make_string(dst, id);
- if (err >= 0)
- snd_config_set_string(*dst, res);
- }
+ if (err >= 0)
+ err = snd_config_imake_string(dst, id, res);
free(res);
__error:
return err;
err = snd_config_get_id(src, &id);
if (err < 0)
return err;
- err = snd_config_make_string(dst, id);
- if (err >= 0)
- err = snd_config_set_string(*dst, DATADIR "/alsa");
- return err;
+ return snd_config_imake_string(dst, id, DATADIR "/alsa");
}
#ifndef DOC_HIDDEN
SND_DLSYM_BUILD_VERSION(snd_func_datadir, SND_CONFIG_DLSYM_VERSION_EVALUATE);
return err;
}
err = snd_config_get_id(src, &id);
- if (err >= 0) {
- err = snd_config_make_string(dst, id);
- if (err >= 0)
- err = snd_config_set_string(*dst, str);
- }
+ if (err >= 0)
+ err = snd_config_imake_string(dst, id, str);
return err;
}
#ifndef DOC_HIDDEN
if ((err = snd_determine_driver(card, &driver)) < 0)
return err;
err = snd_config_get_id(src, &id);
- if (err >= 0) {
- err = snd_config_make_string(dst, id);
- if (err >= 0)
- err = snd_config_set_string(*dst, driver);
- }
+ if (err >= 0)
+ err = snd_config_imake_string(dst, id, driver);
free(driver);
return err;
}
return v;
}
free(str);
- err = snd_config_make_integer(&val, "card");
+ err = snd_config_imake_integer(&val, "card", v);
if (err < 0)
return err;
- snd_config_set_integer(val, v);
err = snd_func_private_card_driver(dst, root, src, val);
snd_config_delete(val);
return err;
goto __error;
}
err = snd_config_get_id(src, &id);
- if (err >= 0) {
- err = snd_config_make_string(dst, id);
- if (err >= 0)
- err = snd_config_set_string(*dst, res);
- }
+ if (err >= 0)
+ err = snd_config_imake_string(dst, id, res);
free(res);
__error:
if (ctl)
goto __error;
}
err = snd_config_get_id(src, &id);
- if (err >= 0) {
- err = snd_config_make_string(dst, id);
- if (err >= 0)
- err = snd_config_set_string(*dst, snd_pcm_info_get_id(info));
- }
+ if (err >= 0)
+ err = snd_config_imake_string(dst, id, snd_pcm_info_get_id(info));
__error:
if (ctl)
snd_ctl_close(ctl);
return err;
}
err = snd_config_get_id(src, &id);
- if (err >= 0) {
- err = snd_config_make_integer(dst, id);
- if (err >= 0)
- err = snd_config_set_integer(*dst, snd_pcm_info_get_subdevice(info));
- }
+ if (err >= 0)
+ err = snd_config_imake_integer(dst, id, snd_pcm_info_get_subdevice(info));
return err;
}
#ifndef DOC_HIDDEN
SNDERR("Cannot open CTL %s", ctl_name);
return err;
}
- err = snd_config_make_pointer(&pcm_conf, "pcm_handle");
+ err = snd_config_imake_pointer(&pcm_conf, "pcm_handle", pcm);
if (err < 0)
goto _err;
- snd_config_set_pointer(pcm_conf, pcm);
err = snd_sctl_build(&sctl, ctl, conf, pcm_conf, 0);
if (err < 0)
goto _err;