On 05. 10. 21 21:49, Pavel Hofman wrote:
-static void openctl_elem(struct loopback_handle *lhandle,
int device, int subdevice,
const char *name,
snd_ctl_elem_value_t **elem)
+static int openctl_elem_id(struct loopback_handle *lhandle, snd_ctl_elem_id_t *id,
snd_ctl_elem_value_t **elem)
{ int err;
if (snd_ctl_elem_value_malloc(elem) < 0) { *elem = NULL;
snd_ctl_elem_id_free(id);
return -ENOMEM;
}
snd_ctl_elem_value_set_id(*elem, id);
snd_ctl_elem_value_set_interface(*elem, SND_CTL_ELEM_IFACE_PCM);
err = snd_ctl_elem_read(lhandle->ctl, *elem);
if (err < 0) {
snd_ctl_elem_id_free(id);
Move the id allocation management to the caller.
snd_ctl_elem_value_free(*elem);
*elem = NULL;
} else {return err;
snd_ctl_elem_value_set_interface(*elem,
SND_CTL_ELEM_IFACE_PCM);
snd_ctl_elem_value_set_device(*elem, device);
snd_ctl_elem_value_set_subdevice(*elem, subdevice);
snd_ctl_elem_value_set_name(*elem, name);
err = snd_ctl_elem_read(lhandle->ctl, *elem);
if (err < 0) {
snd_ctl_elem_value_free(*elem);
*elem = NULL;
} else {
if (verbose)
snd_output_printf(lhandle->loopback->output,
"Opened PCM element %s of %s, device %d, subdevice %d\n",
name, snd_ctl_name(lhandle->ctl), device, subdevice);
}
snd_output_printf(lhandle->loopback->output,
"Opened PCM element %s of %s, device %d, subdevice %d\n",
snd_ctl_elem_id_get_name(id), snd_ctl_name(lhandle->ctl),
snd_ctl_elem_id_get_device(id),
snd_ctl_elem_id_get_subdevice(id));
} }return 0;
+static int openctl_elem(struct loopback_handle *lhandle,
int device, int subdevice,
const char *name,
snd_ctl_elem_value_t **elem)
+{
- snd_ctl_elem_id_t *id;
- if (snd_ctl_elem_id_malloc(&id))
return -ENOMEM;
- snd_ctl_elem_id_set_device(id, device);
- snd_ctl_elem_id_set_subdevice(id, subdevice);
- snd_ctl_elem_id_set_name(id, name);
- return openctl_elem_id(lhandle, id, elem);
Missing snd_ctl_elem_id_free(id). Eventually, the id may be allocated using snd_ctl_elem_id_alloca().
+}
+static int openctl_elem_ascii(struct loopback_handle *lhandle, char *ascii_name,
snd_ctl_elem_value_t **elem)
+{
- snd_ctl_elem_id_t *id;
- if (snd_ctl_elem_id_malloc(&id)) {
return -ENOMEM;
- }
- if (snd_ctl_ascii_elem_id_parse(id, ascii_name)) {
snd_ctl_elem_id_free(id);
fprintf(stderr, "Wrong control identifier: %s\n", ascii_name);
return -EINVAL;
- }
- return openctl_elem_id(lhandle, id, elem);
Missing snd_ctl_elem_id_free(id). Eventually, the id may be allocated using snd_ctl_elem_id_alloca().
Jaroslav