jeyzu pushed a commit to branch devs/jeyzu/mixer.

commit 9c1f871a70a4a02cca9183d8e53cdc5f0fac1857
Author: Jérémy Zurcher <[email protected]>
Date:   Mon Feb 25 14:09:06 2013 +0100

    mixer: factorise get/free channels info and names
    
    E_Mixer_Channel_Info allocated in subsystems,
    then freed in generic functions in e_mod_mixer.c
---
 src/modules/mixer/app_mixer.c   | 54 +++--------------------------------------
 src/modules/mixer/conf_gadget.c |  4 +--
 src/modules/mixer/e_mod_mixer.c | 41 ++++++++++++++++++++++++++++---
 src/modules/mixer/e_mod_mixer.h | 10 +++-----
 src/modules/mixer/sys_alsa.c    | 24 ++++++------------
 src/modules/mixer/sys_dummy.c   | 21 ++++++----------
 src/modules/mixer/sys_pulse.c   | 21 ++++++----------
 7 files changed, 70 insertions(+), 105 deletions(-)

diff --git a/src/modules/mixer/app_mixer.c b/src/modules/mixer/app_mixer.c
index 13abff2..8579c75 100644
--- a/src/modules/mixer/app_mixer.c
+++ b/src/modules/mixer/app_mixer.c
@@ -204,54 +204,6 @@ _cb_channel_selected(void *data)
 }
 
 static int
-_channel_info_cmp(const void *data_a, const void *data_b)
-{
-   const E_Mixer_Channel_Info *a = data_a, *b = data_b;
-
-   if (a->has_capture < b->has_capture)
-     return -1;
-   else if (a->has_capture > b->has_capture)
-     return 1;
-
-   return strcmp(a->name, b->name);
-}
-
-static Eina_List *
-_channels_info_new(E_Mixer_System *sys)
-{
-   Eina_List *channels, *channels_infos, *l;
-
-   channels = e_mod_mixer_channels_get(sys);
-   channels_infos = NULL;
-   for (l = channels; l; l = l->next)
-     {
-        E_Mixer_Channel_Info *info;
-
-        info = malloc(sizeof(*info));
-        info->id = l->data;
-        info->name = e_mod_mixer_channel_name_get(sys, info->id);
-        info->has_capture = e_mod_mixer_capture_get(sys, info->id);
-
-        channels_infos = eina_list_append(channels_infos, info);
-     }
-   e_mod_mixer_channels_free(channels);
-
-   return eina_list_sort(channels_infos, -1, _channel_info_cmp);
-}
-
-static void
-_channels_info_free(Eina_List *list)
-{
-   E_Mixer_Channel_Info *info;
-
-   EINA_LIST_FREE(list, info)
-     {
-        eina_stringshare_del(info->name);
-        free(info);
-     }
-}
-
-static int
 _cb_system_update(void *data, E_Mixer_System *sys __UNUSED__)
 {
    E_Mixer_App_Dialog_Data *app = data;
@@ -289,8 +241,8 @@ _populate_channels(E_Mixer_App_Dialog_Data *app)
    app->channel_name = e_mod_mixer_channel_default_name_get(app->sys);
 
    if (app->channels_infos)
-     _channels_info_free(app->channels_infos);
-   app->channels_infos = _channels_info_new(app->sys);
+     e_mod_mixer_channels_info_free(app->channels_infos);
+   app->channels_infos = e_mod_mixer_channels_info_get(app->sys);
 
    if (app->channels_infos)
      {
@@ -490,7 +442,7 @@ _mixer_app_dialog_del(E_Dialog *dialog, 
E_Mixer_App_Dialog_Data *app)
    if (app->cards)
      e_mod_mixer_cards_free(app->cards);
    if (app->channels_infos)
-     _channels_info_free(app->channels_infos);
+     e_mod_mixer_channels_info_free(app->channels_infos);
    e_mod_mixer_del(app->sys);
 
    e_util_defer_object_del(E_OBJECT(dialog));
diff --git a/src/modules/mixer/conf_gadget.c b/src/modules/mixer/conf_gadget.c
index 795bbc2..238f8d3 100644
--- a/src/modules/mixer/conf_gadget.c
+++ b/src/modules/mixer/conf_gadget.c
@@ -136,7 +136,7 @@ _free_data(E_Config_Dialog *dialog, E_Config_Dialog_Data 
*cfdata)
      eina_stringshare_del(card);
 
    if (cfdata->channels_names)
-     e_mod_mixer_channels_free(cfdata->channels_names);
+     e_mod_mixer_channels_names_free(cfdata->channels_names);
    if (cfdata->cards)
      e_mod_mixer_cards_free(cfdata->cards);
 
@@ -293,7 +293,7 @@ _card_change(void *data, Evas_Object *obj, void *event 
__UNUSED__)
 
    eina_stringshare_del(cfdata->card);
 
-   e_mod_mixer_channels_free(cfdata->channels_names);
+   e_mod_mixer_channels_names_free(cfdata->channels_names);
 
    eina_stringshare_del(cfdata->channel_name);
 
diff --git a/src/modules/mixer/e_mod_mixer.c b/src/modules/mixer/e_mod_mixer.c
index 7c7e5b0..6123a2d 100644
--- a/src/modules/mixer/e_mod_mixer.c
+++ b/src/modules/mixer/e_mod_mixer.c
@@ -15,7 +15,6 @@ E_Mixer_Cb e_mod_mixer_channel_get_by_name;
 E_Mixer_Cb e_mod_mixer_channel_name_get;
 E_Mixer_Cb e_mod_mixer_channel_del;
 E_Mixer_Cb e_mod_mixer_channel_free;
-E_Mixer_Cb e_mod_mixer_channels_free;
 E_Mixer_Cb e_mod_mixer_channels_get;
 E_Mixer_Cb e_mod_mixer_channels_names_get;
 E_Mixer_Cb e_mod_mixer_card_name_get;
@@ -39,7 +38,6 @@ e_mixer_default_setup(void)
    e_mod_mixer_channel_get_by_name = (void 
*)e_mixer_system_get_channel_by_name;
    e_mod_mixer_channel_name_get = (void *)e_mixer_system_get_channel_name;
    e_mod_mixer_channel_del = (void *)e_mixer_system_channel_del;
-   e_mod_mixer_channels_free = (void *)e_mixer_system_free_channels;
    e_mod_mixer_channels_get = (void *)e_mixer_system_get_channels;
    e_mod_mixer_channels_names_get = (void *)e_mixer_system_get_channels_names;
    e_mod_mixer_card_name_get = (void *)e_mixer_system_get_card_name;
@@ -65,7 +63,6 @@ e_mixer_pulse_setup()
    e_mod_mixer_channel_get_by_name = (void *)e_mixer_pulse_get_channel_by_name;
    e_mod_mixer_channel_name_get = (void *)e_mixer_pulse_get_channel_name;
    e_mod_mixer_channel_del = (void *)e_mixer_pulse_channel_del;
-   e_mod_mixer_channels_free = (void *)e_mixer_pulse_free_channels;
    e_mod_mixer_channels_get = (void *)e_mixer_pulse_get_channels;
    e_mod_mixer_channels_names_get = (void *)e_mixer_pulse_get_channels_names;
    e_mod_mixer_card_name_get = (void *)e_mixer_pulse_get_card_name;
@@ -75,3 +72,41 @@ e_mixer_pulse_setup()
    _mixer_using_default = EINA_FALSE;
 }
 
+static int
+_channel_info_cmp(const void *data_a, const void *data_b)
+{
+   const E_Mixer_Channel_Info *a = data_a, *b = data_b;
+
+   if (a->has_capture < b->has_capture)
+     return -1;
+   else if (a->has_capture > b->has_capture)
+     return 1;
+
+   return strcmp(a->name, b->name);
+}
+
+Eina_List *
+e_mod_mixer_channels_info_get(E_Mixer_System *sys)
+{
+   return eina_list_sort(e_mod_mixer_channels_get(sys), -1, _channel_info_cmp);
+}
+
+void
+e_mod_mixer_channels_info_free(Eina_List *list)
+{
+   E_Mixer_Channel_Info *info;
+
+   EINA_LIST_FREE(list, info)
+     {
+        eina_stringshare_del(info->name);
+        free(info);
+     }
+}
+
+void
+e_mod_mixer_channels_names_free(Eina_List *list)
+{
+   const char *str;
+   EINA_LIST_FREE(list, str)
+     eina_stringshare_del(str);
+}
diff --git a/src/modules/mixer/e_mod_mixer.h b/src/modules/mixer/e_mod_mixer.h
index 86655d9..3436285 100644
--- a/src/modules/mixer/e_mod_mixer.h
+++ b/src/modules/mixer/e_mod_mixer.h
@@ -45,14 +45,16 @@ extern E_Mixer_Cb e_mod_mixer_channel_get_by_name;
 extern E_Mixer_Cb e_mod_mixer_channel_name_get;
 extern E_Mixer_Cb e_mod_mixer_channel_del;
 extern E_Mixer_Cb e_mod_mixer_channel_free;
-extern E_Mixer_Cb e_mod_mixer_channels_free;
-extern E_Mixer_Cb e_mod_mixer_channels_get;
 extern E_Mixer_Cb e_mod_mixer_channels_names_get;
 extern E_Mixer_Cb e_mod_mixer_card_name_get;
 extern E_Mixer_Cb e_mod_mixer_cards_get;
 extern E_Mixer_Cb e_mod_mixer_cards_free;
 extern E_Mixer_Cb e_mod_mixer_card_default_get;
 
+Eina_List *e_mod_mixer_channels_info_get(E_Mixer_System *sys);
+void e_mod_mixer_channels_info_free(Eina_List*);
+void e_mod_mixer_channels_names_free(Eina_List*);
+
 void e_mixer_default_setup(void);
 void e_mixer_pulse_setup();
 
@@ -69,9 +71,7 @@ const char *e_mixer_system_get_card_name(const char *card);
 const char *e_mixer_system_get_channel_name(E_Mixer_System *self, 
E_Mixer_Channel *channel);
 
 Eina_List *e_mixer_system_get_channels(E_Mixer_System *self);
-void e_mixer_system_free_channels(Eina_List *channels);
 Eina_List *e_mixer_system_get_channels_names(E_Mixer_System *self);
-void e_mixer_system_free_channels_names(Eina_List *channels_names);
 
 const char *e_mixer_system_get_default_channel_name(E_Mixer_System *self);
 E_Mixer_Channel *e_mixer_system_get_channel_by_name(E_Mixer_System *self, 
const char *name);
@@ -102,9 +102,7 @@ const char *e_mixer_pulse_get_card_name(const char *card);
 const char *e_mixer_pulse_get_channel_name(E_Mixer_System *self, 
E_Mixer_Channel *channel);
 
 Eina_List *e_mixer_pulse_get_channels(E_Mixer_System *self);
-void e_mixer_pulse_free_channels(Eina_List *channels);
 Eina_List *e_mixer_pulse_get_channels_names(E_Mixer_System *self);
-void e_mixer_pulse_free_channels_names(Eina_List *channels_names);
 
 const char *e_mixer_pulse_get_default_channel_name(E_Mixer_System *self);
 E_Mixer_Channel *e_mixer_pulse_get_channel_by_name(E_Mixer_System *self, const 
char *name);
diff --git a/src/modules/mixer/sys_alsa.c b/src/modules/mixer/sys_alsa.c
index 308a847..9530852 100644
--- a/src/modules/mixer/sys_alsa.c
+++ b/src/modules/mixer/sys_alsa.c
@@ -321,18 +321,19 @@ e_mixer_system_get_channels(E_Mixer_System *self)
             (!snd_mixer_selem_has_playback_volume(elem)))
           continue;
 
-        channels = eina_list_append(channels, elem);
+        E_Mixer_Channel_Info *ch_info;
+
+        ch_info = malloc(sizeof(*ch_info));
+        ch_info->id = elem;
+        ch_info->name = eina_stringshare_add(snd_mixer_selem_get_name(elem));
+        ch_info->has_capture = snd_mixer_selem_has_capture_switch(elem) || 
snd_mixer_selem_has_capture_volume(elem);
+
+        channels = eina_list_append(channels, ch_info);
      }
 
    return channels;
 }
 
-void
-e_mixer_system_free_channels(Eina_List *channels)
-{
-   eina_list_free(channels);
-}
-
 Eina_List *
 e_mixer_system_get_channels_names(E_Mixer_System *self)
 {
@@ -363,15 +364,6 @@ e_mixer_system_get_channels_names(E_Mixer_System *self)
    return channels;
 }
 
-void
-e_mixer_system_free_channels_names(Eina_List *channels_names)
-{
-   const char *channel;
-
-   EINA_LIST_FREE(channels_names, channel)
-     eina_stringshare_del(channel);
-}
-
 const char *
 e_mixer_system_get_default_channel_name(E_Mixer_System *self)
 {
diff --git a/src/modules/mixer/sys_dummy.c b/src/modules/mixer/sys_dummy.c
index 9d5a069..cf18092 100644
--- a/src/modules/mixer/sys_dummy.c
+++ b/src/modules/mixer/sys_dummy.c
@@ -67,13 +67,14 @@ e_mixer_system_get_card_name(const char *card)
 Eina_List *
 e_mixer_system_get_channels(E_Mixer_System *self __UNUSED__)
 {
-   return eina_list_append(NULL, (void *)-2);
-}
+   E_Mixer_Channel_Info *ch_info;
 
-void
-e_mixer_system_free_channels(Eina_List *channels)
-{
-   eina_list_free(channels);
+   ch_info = malloc(sizeof(*ch_info));
+   ch_info->id = (void*)-2;
+   ch_info->name = eina_stringshare_ref(_name);
+   ch_info->has_capture = 0;
+
+   return eina_list_append(NULL, ch_info);
 }
 
 Eina_List *
@@ -81,13 +82,7 @@ e_mixer_system_get_channels_names(E_Mixer_System *self 
__UNUSED__)
 {
    _e_mixer_dummy_set();
 
-   return eina_list_append(NULL, _name);
-}
-
-void
-e_mixer_system_free_channels_names(Eina_List *channels_names)
-{
-   eina_list_free(channels_names);
+   return eina_list_append(NULL, eina_stringshare_ref(_name));
 }
 
 const char *
diff --git a/src/modules/mixer/sys_pulse.c b/src/modules/mixer/sys_pulse.c
index 34fbd80..fdc3797 100644
--- a/src/modules/mixer/sys_pulse.c
+++ b/src/modules/mixer/sys_pulse.c
@@ -477,13 +477,14 @@ e_mixer_pulse_get_card_name(const char *card)
 Eina_List *
 e_mixer_pulse_get_channels(E_Mixer_System *self EINA_UNUSED)
 {
-   return eina_list_append(NULL, (void *)(1));
-}
+   E_Mixer_Channel_Info *ch_info;
 
-void
-e_mixer_pulse_free_channels(Eina_List *channels)
-{
-   eina_list_free(channels);
+   ch_info = malloc(sizeof(*ch_info));
+   ch_info->id = (void*)1;
+   ch_info->name = eina_stringshare_ref(_name);
+   ch_info->has_capture = 0;
+
+   return eina_list_append(NULL, ch_info);
 }
 
 Eina_List *
@@ -492,14 +493,6 @@ e_mixer_pulse_get_channels_names(E_Mixer_System *self 
EINA_UNUSED)
    return eina_list_append(NULL, eina_stringshare_ref(_name));
 }
 
-void
-e_mixer_pulse_free_channels_names(Eina_List *channels_names)
-{
-   const char *str;
-   EINA_LIST_FREE(channels_names, str)
-     eina_stringshare_del(str);
-}
-
 const char *
 e_mixer_pulse_get_default_channel_name(E_Mixer_System *self EINA_UNUSED)
 {

-- 

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb

Reply via email to