default_backend: do not allocate frame whenever each frames
[platform/core/uifw/libpui.git] / backends / voice / default_ani_listening.c
index e1307e1..cc86e1a 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_listening_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,33 +39,15 @@ _ani_backend_listening_get_led_rgb(default_frame_info_t *frame, int led_idx, uns
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_listening_free_frame(default_frame_info_t *frame)
-{
-       if (!frame) return;
-
-       if (frame->leds) free(frame->leds);
-       free(frame);
-}
-
 static default_frame_info_t *
 _ani_backend_listening_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
+       default_frame_info_t *key_frame;
        int division;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        key_frame = &ani_info->frames[0];
-       frame->num_led = key_frame->num_led;
-       frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
-       if (!frame->leds)
-       {
-               free(frame);
-               return NULL;
-       }
-       division = (int)(frame->num_led / 2);
+
+       division = (int)(key_frame->num_led / 2);
        for (int i = 0; i < key_frame->num_led; i++)
        {
                int idx;
@@ -94,7 +78,7 @@ _ani_backend_listening_get_frame(default_ani_info *ani_info)
                                if (idx >= key_frame->num_led) continue;
                        }
                }
-               frame->leds[idx] = key_frame->leds[i];
+               ani_frame->leds[idx] = key_frame->leds[i];
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= key_frame->num_led)
@@ -104,7 +88,7 @@ _ani_backend_listening_get_frame(default_ani_info *ani_info)
                ani_info->frame_idx = 0;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -138,7 +122,7 @@ _ani_backend_listening_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_listening_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -188,6 +172,10 @@ _ani_listening_start(pui_ani_t *ani, int repeat)
        info->frame_idx = 0;
        info->repeat_cur = 0;
 
+       if (!ani_frame)
+               ani_frame = backend_util_alloc_frame(info);
+       ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
        ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_listening_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -219,6 +207,12 @@ _ani_listening_stop(pui_ani_t *ani, pui_bool force)
        else
                pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
 
+       if (ani_frame)
+       {
+               backend_util_free_frame(ani_frame);
+               ani_frame = NULL;
+       }
+
        return e;
 }