default_backend: do not allocate frame whenever each frames 13/220713/1
authorjeon <jhyuni.kang@samsung.com>
Thu, 19 Sep 2019 11:46:35 +0000 (20:46 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Fri, 20 Dec 2019 09:57:28 +0000 (18:57 +0900)
Change-Id: I089ad4b075fbb68214fea0baeaa6948374776210

18 files changed:
backends/bt/default_ani_connected.c
backends/bt/default_ani_pairing.c
backends/default_backend.c
backends/default_backend.h
backends/notification/default_ani_alarm.c
backends/notification/default_ani_emergency.c
backends/notification/default_ani_error.c
backends/notification/default_ani_networkerror.c
backends/notification/default_ani_normal.c
backends/system/default_ani_easysetup.c
backends/system/default_ani_micoff.c
backends/system/default_ani_swupdatedone.c
backends/system/default_ani_system_processing.c
backends/voice/default_ani_listening.c
backends/voice/default_ani_processing.c
backends/voice/default_ani_speaking.c
backends/voice/default_ani_streaming.c
backends/voice/default_ani_timeout.c

index d76c23e..dbe27d1 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_connected_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,24 +39,12 @@ _ani_backend_connected_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_connected_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_connected_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
+       default_frame_info_t *key_frame;
        int idx;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -63,17 +53,9 @@ _ani_backend_connected_get_frame(default_ani_info *ani_info)
        idx = ani_info->key_frame_cur;
        key_frame = &ani_info->frames[idx];
 
-       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;
-       }
-
        for (int i = 0; i < key_frame->num_led; i++)
        {
-               frame->leds[i].color = key_frame->leds[i].color;
+               ani_frame->leds[i].color = key_frame->leds[i].color;
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= ani_info->frame_max)
@@ -84,7 +66,7 @@ _ani_backend_connected_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -119,7 +101,7 @@ _ani_backend_connected_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_connected_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -169,6 +151,10 @@ _ani_connected_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_connected_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -200,6 +186,11 @@ _ani_connected_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;
 }
index b2bbf99..08306c0 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_pairing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,43 +39,23 @@ _ani_backend_pairing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsig
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_pairing_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_pairing_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
+       default_frame_info_t *key_frame;
        int idx;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
        }
 
        idx = ani_info->key_frame_cur;
-
        key_frame = &ani_info->frames[idx];
-       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;
-       }
 
        for (int i = 0; i < key_frame->num_led; i++)
        {
-               frame->leds[i].color = key_frame->leds[i].color;
+               ani_frame->leds[i].color = key_frame->leds[i].color;
        }
 
        ani_info->frame_idx++;
@@ -85,7 +67,7 @@ _ani_backend_pairing_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -120,7 +102,7 @@ _ani_backend_pairing_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_pairing_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -170,6 +152,10 @@ _ani_pairing_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_pairing_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -201,6 +187,12 @@ _ani_pairing_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;
 }
 
index c13deb4..7c7f6c9 100644 (file)
@@ -280,6 +280,7 @@ _read_json(const char *path)
                led_len = json_object_array_length(frame_data_obj);
 
                ani_info->frames[frame_id - 1].num_led = led_len;
+               if (ani_info->max_leds < led_len) ani_info->max_leds = led_len;
                ani_info->frames[frame_id - 1].leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), led_len);
                ERROR_CHECK(ani_info->frames[frame_id - 1].leds, goto error, "Failed to alloc for default_led_info_t\n");
 
@@ -601,6 +602,48 @@ _animation_data_free_cb(void *data)
        _ani_info_cleanup(ani_info);
 }
 
+default_frame_info_t *
+backend_util_alloc_frame(default_ani_info *ani_info)
+{
+       default_frame_info_t *frame;
+
+       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
+       ERROR_CHECK(frame, return NULL, "Failed to allocate memory for frame\n");
+
+       frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), ani_info->max_leds);
+       ERROR_CHECK(frame->leds, goto error, "Failed to allocate memory for led\n");
+
+       frame->num_led = ani_info->max_leds;
+
+       return frame;
+
+error:
+       free(frame);
+       return NULL;
+}
+
+void
+backend_util_cleanup_frame(default_frame_info_t *frame)
+{
+       ERROR_CHECK(frame, return, "Invalid frame to cleanup\n");
+
+       for (int i = 0; i < frame->num_led; i++)
+       {
+               frame->leds[i].color = 0x0;
+       }
+       frame->frame_duration = 0;
+}
+
+void
+backend_util_free_frame(default_frame_info_t *frame)
+{
+       if (!frame) return;
+
+       if (frame->leds) free(frame->leds);
+       free(frame);
+}
+
+
 static pui_backend_module_data *
 pui_default_backend_init(void)
 {
index b7b7047..62c6786 100644 (file)
@@ -82,6 +82,7 @@ struct _default_ani_info
        unsigned int num_key_frames;
        default_frame_info_t *frames;
        int interval;
+       unsigned int max_leds;
        pui_effect_func effect_func;
 
        unsigned int repeat_cur;
@@ -102,6 +103,10 @@ struct _default_led_info_t
        unsigned int color;
 };
 
+default_frame_info_t *backend_util_alloc_frame(default_ani_info *ani_info);
+void backend_util_cleanup_frame(default_frame_info_t *frame);
+void backend_util_free_frame(default_frame_info_t *frame);
+
 void pui_default_backend_ani_listening_func_set(pui_backend_ani_func *func);
 void pui_default_backend_ani_speaking_func_set(pui_backend_ani_func *func);
 void pui_default_backend_ani_processing_func_set(pui_backend_ani_func *func);
index 31d58b7..c915d75 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_alarm_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,29 +39,17 @@ _ani_backend_alarm_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigne
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_alarm_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_alarm_get_frame(default_ani_info *ani_info)
 {
 /* FIXME: ALAMR_FRAME need to changed after we imply animation type, suchas ease function */
 #define ALARM_FRAME 18
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,19 +58,11 @@ _ani_backend_alarm_get_frame(default_ani_info *ani_info)
        idx = ani_info->key_frame_cur;
        key_frame = &ani_info->frames[idx];
 
-       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;
-       }
-
        if (ani_info->key_frame_cur < ALARM_FRAME)
        {
                for (int i = 0; i < key_frame->num_led; i++)
                {
-                       frame->leds[i].color = key_frame->leds[i].color;
+                       ani_frame->leds[i].color = key_frame->leds[i].color;
                }
        }
        else
@@ -97,7 +79,7 @@ _ani_backend_alarm_get_frame(default_ani_info *ani_info)
                        g3 = (int)(g2 - g) * div + g;
                        b3 = (int)(b2 - b) * div + b;
 
-                       frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+                       ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
                }
        }
 
@@ -110,7 +92,7 @@ _ani_backend_alarm_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -144,7 +126,7 @@ _ani_backend_alarm_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_alarm_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -194,6 +176,10 @@ _ani_alarm_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_alarm_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -225,6 +211,11 @@ _ani_alarm_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;
 }
index f4dd476..889d465 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_emergency_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_emergency_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_emergency_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_emergency_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,7 @@ _ani_backend_emergency_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       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;
-       }
+
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
        for (int i = 0; i < key_frame->num_led; i++)
@@ -85,7 +69,7 @@ _ani_backend_emergency_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
 
        ani_info->frame_idx++;
@@ -97,7 +81,7 @@ _ani_backend_emergency_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -132,7 +116,7 @@ _ani_backend_emergency_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_emergency_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -182,6 +166,10 @@ _ani_emergency_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_emergency_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -213,6 +201,12 @@ _ani_emergency_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;
 }
 
index 9f1a18d..2520af8 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_error_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,46 +39,27 @@ _ani_backend_error_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigne
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_error_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_error_get_frame(default_ani_info *ani_info)
 {
 /* FIXME: ALAMR_FRAME need to changed after we imply animation type, suchas ease function */
 #define BLINK_FRAME 2
-       default_frame_info_t *frame, *key_frame;
-
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
+       default_frame_info_t *key_frame;
 
        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;
-       }
 
        if (ani_info->frame_idx % BLINK_FRAME == 0)
        {
                for (int i = 0; i < key_frame->num_led; i++)
                {
-                       frame->leds[i].color = key_frame->leds[i].color;
+                       ani_frame->leds[i].color = key_frame->leds[i].color;
                }
        }
        else
        {
                for (int i = 0; i < key_frame->num_led; i++)
                {
-                       frame->leds[i].color = 0x000000;
+                       ani_frame->leds[i].color = 0x000000;
                }
        }
 
@@ -88,7 +71,7 @@ _ani_backend_error_get_frame(default_ani_info *ani_info)
                ani_info->frame_idx = 0;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -123,7 +106,7 @@ _ani_backend_error_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_error_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -173,6 +156,10 @@ _ani_error_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_error_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -204,6 +191,11 @@ _ani_error_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;
 }
index 5f7a794..7824398 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_networkerror_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,24 +39,12 @@ _ani_backend_networkerror_get_led_rgb(default_frame_info_t *frame, int led_idx,
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_networkerror_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_networkerror_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
+       default_frame_info_t *key_frame;
        int idx;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -63,17 +53,9 @@ _ani_backend_networkerror_get_frame(default_ani_info *ani_info)
        idx = ani_info->key_frame_cur;
        key_frame = &ani_info->frames[idx];
 
-       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;
-       }
-
        for (int i = 0; i < key_frame->num_led; i++)
        {
-               frame->leds[i].color = key_frame->leds[i].color;
+               ani_frame->leds[i].color = key_frame->leds[i].color;
        }
 
        ani_info->frame_idx++;
@@ -85,7 +67,7 @@ _ani_backend_networkerror_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -120,7 +102,7 @@ _ani_backend_networkerror_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_networkerror_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -170,6 +152,10 @@ _ani_networkerror_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_networkerror_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -201,6 +187,11 @@ _ani_networkerror_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;
 }
index 5228062..b0a72fa 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_normal_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_normal_get_led_rgb(default_frame_info_t *frame, int led_idx, unsign
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_normal_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_normal_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,7 @@ _ani_backend_normal_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       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;
-       }
+
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
        for (int i = 0; i < key_frame->num_led; i++)
@@ -85,7 +69,7 @@ _ani_backend_normal_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= ani_info->frame_max)
@@ -96,7 +80,7 @@ _ani_backend_normal_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -131,7 +115,7 @@ _ani_backend_normal_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_normal_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -181,6 +165,10 @@ _ani_normal_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_normal_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -212,6 +200,11 @@ _ani_normal_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;
 }
index 3f00c13..cad2d53 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_easysetup_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_easysetup_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_easysetup_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_easysetup_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,7 @@ _ani_backend_easysetup_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       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;
-       }
+
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
        for (int i = 0; i < key_frame->num_led; i++)
@@ -85,7 +69,7 @@ _ani_backend_easysetup_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= ani_info->frame_max)
@@ -96,7 +80,7 @@ _ani_backend_easysetup_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -130,7 +114,7 @@ _ani_backend_easysetup_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_easysetup_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -180,6 +164,10 @@ _ani_easysetup_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_easysetup_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -211,6 +199,11 @@ _ani_easysetup_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;
 }
index 14ae00a..4c991c2 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_micoff_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,41 +39,22 @@ _ani_backend_micoff_get_led_rgb(default_frame_info_t *frame, int led_idx, unsign
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_micoff_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_micoff_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
-
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
+       default_frame_info_t *key_frame;
 
        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;
-       }
 
        for (int i = 0; i < key_frame->num_led; i++)
        {
-               frame->leds[i].color = key_frame->leds[i].color;
+               ani_frame->leds[i].color = key_frame->leds[i].color;
        }
 
        if (ani_info->repeat >= 0)
                ani_info->repeat_cur++;
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -106,7 +89,7 @@ _ani_backend_micoff_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_micoff_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -156,6 +139,10 @@ _ani_micoff_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_micoff_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -187,6 +174,11 @@ _ani_micoff_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;
 }
index 3b95b0c..17a024d 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_swupdatedone_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_swupdatedone_get_led_rgb(default_frame_info_t *frame, int led_idx,
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_swupdatedone_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_swupdatedone_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,6 @@ _ani_backend_swupdatedone_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       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;
-       }
 
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
@@ -87,7 +70,7 @@ _ani_backend_swupdatedone_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
 
        ani_info->frame_idx++;
@@ -99,7 +82,7 @@ _ani_backend_swupdatedone_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -133,7 +116,7 @@ _ani_backend_swupdatedone_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_swupdatedone_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -183,6 +166,10 @@ _ani_swupdatedone_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_swupdatedone_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -214,6 +201,11 @@ _ani_swupdatedone_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;
 }
index e4ac723..713a90a 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_system_processing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,35 +39,17 @@ _ani_backend_system_processing_get_led_rgb(default_frame_info_t *frame, int led_
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_system_processing_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_system_processing_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
-
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
+       default_frame_info_t *key_frame;
 
        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;
-       }
+
        for (int i = 0; i < key_frame->num_led; i++)
        {
                int idx = (i - ani_info->frame_idx + key_frame->num_led) % key_frame->num_led;
-               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)
@@ -75,7 +59,7 @@ _ani_backend_system_processing_get_frame(default_ani_info *ani_info)
                ani_info->frame_idx = 0;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -109,7 +93,7 @@ _ani_backend_system_processing_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_system_processing_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -164,6 +148,10 @@ _ani_system_processing_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_system_processing_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -195,6 +183,11 @@ _ani_system_processing_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;
 }
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;
 }
 
index b4a7ebb..c0b3a06 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_processing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,35 +39,17 @@ _ani_backend_processing_get_led_rgb(default_frame_info_t *frame, int led_idx, un
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_processing_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_processing_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
-
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
+       default_frame_info_t *key_frame;
 
        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;
-       }
+
        for (int i = 0; i < key_frame->num_led; i++)
        {
                int idx = (i - ani_info->frame_idx + key_frame->num_led) % key_frame->num_led;
-               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)
@@ -75,7 +59,7 @@ _ani_backend_processing_get_frame(default_ani_info *ani_info)
                ani_info->frame_idx = 0;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -109,7 +93,7 @@ _ani_backend_processing_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_processing_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -164,6 +148,10 @@ _ani_processing_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_processing_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -195,6 +183,11 @@ _ani_processing_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;
 }
index 13f1897..43a2a11 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_speaking_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_speaking_get_led_rgb(default_frame_info_t *frame, int led_idx, unsi
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_speaking_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_speaking_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,7 @@ _ani_backend_speaking_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       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;
-       }
+
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
        for (int i = 0; i < key_frame->num_led; i++)
@@ -85,7 +69,7 @@ _ani_backend_speaking_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
        ani_info->frame_idx++;
 
@@ -97,7 +81,7 @@ _ani_backend_speaking_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -131,7 +115,7 @@ _ani_backend_speaking_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_speaking_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -181,6 +165,10 @@ _ani_speaking_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_speaking_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -212,6 +200,11 @@ _ani_speaking_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;
 }
index be6657d..39da2a4 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_streaming_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_streaming_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_streaming_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_streaming_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,7 @@ _ani_backend_streaming_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       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;
-       }
+
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
        for (int i = 0; i < key_frame->num_led; i++)
@@ -85,7 +69,7 @@ _ani_backend_streaming_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= ani_info->frame_max)
@@ -96,7 +80,7 @@ _ani_backend_streaming_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -130,7 +114,7 @@ _ani_backend_streaming_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_streaming_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -180,6 +164,10 @@ _ani_streaming_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_streaming_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -211,6 +199,11 @@ _ani_streaming_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;
 }
index 9608114..4862ac5 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_timeout_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_timeout_get_led_rgb(default_frame_info_t *frame, int led_idx, unsig
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_timeout_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_timeout_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,7 @@ _ani_backend_timeout_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       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;
-       }
+
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
        for (int i = 0; i < key_frame->num_led; i++)
@@ -85,7 +69,7 @@ _ani_backend_timeout_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= ani_info->frame_max)
@@ -96,7 +80,7 @@ _ani_backend_timeout_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -130,7 +114,7 @@ _ani_backend_timeout_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_timeout_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -180,6 +164,10 @@ _ani_timeout_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_timeout_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -211,6 +199,11 @@ _ani_timeout_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;
 }
@@ -225,4 +218,3 @@ pui_default_backend_ani_timeout_func_set(pui_backend_ani_func *func)
        func->ani_stop = _ani_timeout_stop;
 }
 
-