filter: Make ->open() optional.
[paraslash.git] / alsa_mix.c
index c860efc..cad58af 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2012-2014 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2012 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -100,11 +100,13 @@ static bool channel_has_playback(snd_mixer_selem_channel_id_t chn,
 
 static char *alsa_mix_get_channels(struct mixer_handle *handle)
 {
 
 static char *alsa_mix_get_channels(struct mixer_handle *handle)
 {
+       int ret;
        char *list = NULL;
        snd_mixer_selem_id_t *sid;
        snd_mixer_elem_t *elem;
 
        char *list = NULL;
        snd_mixer_selem_id_t *sid;
        snd_mixer_elem_t *elem;
 
-       snd_mixer_selem_id_alloca(&sid);
+       ret = snd_mixer_selem_id_malloc(&sid);
+       assert(ret >= 0);
        elem = snd_mixer_first_elem(handle->mixer);
        for (; elem; elem = snd_mixer_elem_next(elem)) {
                char *tmp = list;
        elem = snd_mixer_first_elem(handle->mixer);
        for (; elem; elem = snd_mixer_elem_next(elem)) {
                char *tmp = list;
@@ -122,6 +124,7 @@ static char *alsa_mix_get_channels(struct mixer_handle *handle)
                        name);
                free(tmp);
        }
                        name);
                free(tmp);
        }
+       snd_mixer_selem_id_free(sid);
        return list;
 }
 
        return list;
 }
 
@@ -133,7 +136,8 @@ static int alsa_mix_set_channel(struct mixer_handle *h,
 
        if (!mixer_channel)
                mixer_channel = "Master";
 
        if (!mixer_channel)
                mixer_channel = "Master";
-       snd_mixer_selem_id_alloca(&sid);
+       ret = snd_mixer_selem_id_malloc(&sid);
+       assert(ret >= 0);
        snd_mixer_selem_id_set_index(sid, selem_id);
        snd_mixer_selem_id_set_name(sid, mixer_channel);
        h->elem = snd_mixer_find_selem(h->mixer, sid);
        snd_mixer_selem_id_set_index(sid, selem_id);
        snd_mixer_selem_id_set_name(sid, mixer_channel);
        h->elem = snd_mixer_find_selem(h->mixer, sid);
@@ -141,21 +145,27 @@ static int alsa_mix_set_channel(struct mixer_handle *h,
                PARA_NOTICE_LOG("unable to find simple control '%s',%i\n",
                        snd_mixer_selem_id_get_name(sid),
                        snd_mixer_selem_id_get_index(sid));
                PARA_NOTICE_LOG("unable to find simple control '%s',%i\n",
                        snd_mixer_selem_id_get_name(sid),
                        snd_mixer_selem_id_get_index(sid));
-               return -E_BAD_CHANNEL;
+               ret = -E_BAD_CHANNEL;
+               goto out;
        }
        ret = snd_mixer_selem_get_playback_volume_range(h->elem,
                &h->pmin, &h->pmax);
        if (ret < 0) {
                PARA_NOTICE_LOG("unable to get %s range (%s): %s\n",
                        mixer_channel, h->card, snd_strerror(ret));
        }
        ret = snd_mixer_selem_get_playback_volume_range(h->elem,
                &h->pmin, &h->pmax);
        if (ret < 0) {
                PARA_NOTICE_LOG("unable to get %s range (%s): %s\n",
                        mixer_channel, h->card, snd_strerror(ret));
-               return -E_ALSA_MIX_RANGE;
+               ret = -E_ALSA_MIX_RANGE;
+               goto out;
        }
        if (h->pmin >= h->pmax) {
                PARA_NOTICE_LOG("alsa reported %s range %ld-%ld (%s)\n",
                        mixer_channel, h->pmin, h->pmax, h->card);
        }
        if (h->pmin >= h->pmax) {
                PARA_NOTICE_LOG("alsa reported %s range %ld-%ld (%s)\n",
                        mixer_channel, h->pmin, h->pmax, h->card);
-               return -E_ALSA_MIX_RANGE;
+               ret = -E_ALSA_MIX_RANGE;
+               goto out;
        }
        }
-       return 1;
+       ret = 1;
+out:
+       snd_mixer_selem_id_free(sid);
+       return ret;
 }
 
 static int alsa_mix_get(struct mixer_handle *h)
 }
 
 static int alsa_mix_get(struct mixer_handle *h)