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;
+ return err;
} else {
- 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
--
Jaroslav Kysela <perex@xxxxxxxx>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.