From: jeon Date: Thu, 19 Sep 2019 11:46:35 +0000 (+0900) Subject: default_backend: do not allocate frame whenever each frames X-Git-Tag: accepted/tizen/5.5/unified/20200102.014046~7 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Flibpui.git;a=commitdiff_plain;h=f844e4e165654a5b5b0908f4d2ac84b048631ebb default_backend: do not allocate frame whenever each frames Change-Id: I089ad4b075fbb68214fea0baeaa6948374776210 --- diff --git a/backends/bt/default_ani_connected.c b/backends/bt/default_ani_connected.c index d76c23e..dbe27d1 100644 --- a/backends/bt/default_ani_connected.c +++ b/backends/bt/default_ani_connected.c @@ -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; } diff --git a/backends/bt/default_ani_pairing.c b/backends/bt/default_ani_pairing.c index b2bbf99..08306c0 100644 --- a/backends/bt/default_ani_pairing.c +++ b/backends/bt/default_ani_pairing.c @@ -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; } diff --git a/backends/default_backend.c b/backends/default_backend.c index c13deb4..7c7f6c9 100644 --- a/backends/default_backend.c +++ b/backends/default_backend.c @@ -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) { diff --git a/backends/default_backend.h b/backends/default_backend.h index b7b7047..62c6786 100644 --- a/backends/default_backend.h +++ b/backends/default_backend.h @@ -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); diff --git a/backends/notification/default_ani_alarm.c b/backends/notification/default_ani_alarm.c index 31d58b7..c915d75 100644 --- a/backends/notification/default_ani_alarm.c +++ b/backends/notification/default_ani_alarm.c @@ -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; } diff --git a/backends/notification/default_ani_emergency.c b/backends/notification/default_ani_emergency.c index f4dd476..889d465 100644 --- a/backends/notification/default_ani_emergency.c +++ b/backends/notification/default_ani_emergency.c @@ -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; } diff --git a/backends/notification/default_ani_error.c b/backends/notification/default_ani_error.c index 9f1a18d..2520af8 100644 --- a/backends/notification/default_ani_error.c +++ b/backends/notification/default_ani_error.c @@ -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; } diff --git a/backends/notification/default_ani_networkerror.c b/backends/notification/default_ani_networkerror.c index 5f7a794..7824398 100644 --- a/backends/notification/default_ani_networkerror.c +++ b/backends/notification/default_ani_networkerror.c @@ -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; } diff --git a/backends/notification/default_ani_normal.c b/backends/notification/default_ani_normal.c index 5228062..b0a72fa 100644 --- a/backends/notification/default_ani_normal.c +++ b/backends/notification/default_ani_normal.c @@ -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; } diff --git a/backends/system/default_ani_easysetup.c b/backends/system/default_ani_easysetup.c index 3f00c13..cad2d53 100644 --- a/backends/system/default_ani_easysetup.c +++ b/backends/system/default_ani_easysetup.c @@ -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; } diff --git a/backends/system/default_ani_micoff.c b/backends/system/default_ani_micoff.c index 14ae00a..4c991c2 100644 --- a/backends/system/default_ani_micoff.c +++ b/backends/system/default_ani_micoff.c @@ -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; } diff --git a/backends/system/default_ani_swupdatedone.c b/backends/system/default_ani_swupdatedone.c index 3b95b0c..17a024d 100644 --- a/backends/system/default_ani_swupdatedone.c +++ b/backends/system/default_ani_swupdatedone.c @@ -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; } diff --git a/backends/system/default_ani_system_processing.c b/backends/system/default_ani_system_processing.c index e4ac723..713a90a 100644 --- a/backends/system/default_ani_system_processing.c +++ b/backends/system/default_ani_system_processing.c @@ -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; } diff --git a/backends/voice/default_ani_listening.c b/backends/voice/default_ani_listening.c index e1307e1..cc86e1a 100644 --- a/backends/voice/default_ani_listening.c +++ b/backends/voice/default_ani_listening.c @@ -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; } diff --git a/backends/voice/default_ani_processing.c b/backends/voice/default_ani_processing.c index b4a7ebb..c0b3a06 100644 --- a/backends/voice/default_ani_processing.c +++ b/backends/voice/default_ani_processing.c @@ -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; } diff --git a/backends/voice/default_ani_speaking.c b/backends/voice/default_ani_speaking.c index 13f1897..43a2a11 100644 --- a/backends/voice/default_ani_speaking.c +++ b/backends/voice/default_ani_speaking.c @@ -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; } diff --git a/backends/voice/default_ani_streaming.c b/backends/voice/default_ani_streaming.c index be6657d..39da2a4 100644 --- a/backends/voice/default_ani_streaming.c +++ b/backends/voice/default_ani_streaming.c @@ -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; } diff --git a/backends/voice/default_ani_timeout.c b/backends/voice/default_ani_timeout.c index 9608114..4862ac5 100644 --- a/backends/voice/default_ani_timeout.c +++ b/backends/voice/default_ani_timeout.c @@ -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; } -