#define INVALID_DEFAULT_VALUE -1
+typedef struct {
+ tbm_fd tfd;
+ char* buffer;
+} _player_recv_data;
+
typedef struct {
int int_data;
- char *buf;
callback_cb_info_s *cb_info;
+ _player_recv_data *recv_data;
GMutex event_mutex;
} _player_cb_data;
}
}
-static int player_recv_msg(callback_cb_info_s * cb_info)
+static int player_recv_msg(callback_cb_info_s * cb_info, tbm_fd *tfd)
{
int recvLen = 0;
msg_buff_s *buff = &cb_info->buff;
memset(buff->recvMsg, 0x00, sizeof(char)*buff->bufLen);
- recvLen = muse_core_ipc_recv_fd_msg(cb_info->fd, buff->recvMsg, &cb_info->tfd);
+ recvLen = muse_core_ipc_recv_fd_msg(cb_info->fd, buff->recvMsg, tfd);
/* check the first msg */
if (buff->part_of_msg && buff->recvMsg[0] != '{')
return ret;
}
-static void __prepare_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __prepare_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_PREPARE;
set_null_user_cb(cb_info, ev);
}
-static void __complete_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __complete_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_COMPLETE;
((player_completed_cb) cb_info->user_cb[ev]) (cb_info->user_data[ev]);
}
}
-static void __interrupt_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __interrupt_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
int code;
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_INTERRUPT;
- if (player_msg_get(code, recvMsg)) {
+ if (player_msg_get(code, recv_data->buffer)) {
if (code >= PLAYER_INTERRUPTED_COMPLETED &&
code <= PLAYER_INTERRUPTED_BY_NOTIFICATION &&
}
}
-static void __error_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __error_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
int code;
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_ERROR;
- if (player_msg_get(code, recvMsg))
+ if (player_msg_get(code, recv_data->buffer))
((player_error_cb) cb_info->user_cb[ev]) (code, cb_info->user_data[ev]);
}
-static void __buffering_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __buffering_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
int percent;
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_BUFFERING;
- if (player_msg_get(percent, recvMsg))
+ if (player_msg_get(percent, recv_data->buffer))
((player_buffering_cb) cb_info->user_cb[ev]) (percent, cb_info->user_data[ev]);
}
-static void __subtitle_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __subtitle_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
int duration = 0;
char text[MUSE_URI_MAX_LENGTH] = { 0, };
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_SUBTITLE;
bool ret = TRUE;
- player_msg_get1_string(recvMsg, duration, INT, text, ret);
+ player_msg_get1_string(recv_data->buffer, duration, INT, text, ret);
if (ret)
((player_subtitle_updated_cb) cb_info->user_cb[ev]) (duration, text, cb_info->user_data[ev]);
}
-static void __capture_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __capture_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
unsigned char *data = NULL;
int width = 0;
int key = INVALID_DEFAULT_VALUE;
bool ret_val = TRUE;
- player_msg_get4(recvMsg, width, INT, height, INT, size, INT, key, INT, ret_val);
+ player_msg_get4(recv_data->buffer, width, INT, height, INT, size, INT, key, INT, ret_val);
if (ret_val) {
- if (cb_info->tfd < 0) {
+ if (recv_data->tfd < 0) {
LOGE("There is no valid tbm_fd");
goto EXIT;
}
- bo = tbm_bo_import_fd(cb_info->bufmgr, cb_info->tfd);
+ bo = tbm_bo_import_fd(cb_info->bufmgr, recv_data->tfd);
if (bo == NULL) {
LOGE("TBM get error : bo is NULL");
goto EXIT;
}
EXIT:
- if (cb_info->tfd > INVALID_DEFAULT_VALUE)
- close(cb_info->tfd);
- cb_info->tfd = INVALID_DEFAULT_VALUE;
+ if (recv_data->tfd > INVALID_DEFAULT_VALUE)
+ close(recv_data->tfd);
+ recv_data->tfd = INVALID_DEFAULT_VALUE;
if (bo)
tbm_bo_unref(bo);
set_null_user_cb(cb_info, MUSE_PLAYER_EVENT_TYPE_CAPTURE);
}
-static void __seek_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __seek_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_SEEK;
return NULL;
}
-static void __media_packet_video_frame_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __media_packet_video_frame_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
tbm_bo bo[4] = { NULL, };
tbm_key key[4] = { 0, };
int i = 0;
muse_core_msg_parse_err_e err = MUSE_MSG_PARSE_ERROR_NONE;
- void *jobj = muse_core_msg_json_object_new(recvMsg, NULL, &err);
+ void *jobj = muse_core_msg_json_object_new(recv_data->buffer, NULL, &err);
if (!jobj ||
!muse_core_msg_json_object_get_value("key[0]", jobj, &key[0], MUSE_TYPE_ANY) ||
!muse_core_msg_json_object_get_value("key[1]", jobj, &key[1], MUSE_TYPE_ANY) ||
return;
}
-static void __audio_frame_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __audio_frame_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
tbm_bo bo = NULL;
tbm_bo_handle thandle;
int key = INVALID_DEFAULT_VALUE;
player_audio_raw_data_s audio;
- if (!player_msg_get(key, recvMsg)) {
+ if (!player_msg_get(key, recv_data->buffer)) {
LOGE("failed to get key value from msg.");
return;
}
- if (cb_info->tfd < 0) {
+ if (recv_data->tfd < 0) {
LOGE("failed to get tbm_fd(key:%d)", key);
goto EXIT;
}
- bo = tbm_bo_import_fd(cb_info->bufmgr, cb_info->tfd);
+ bo = tbm_bo_import_fd(cb_info->bufmgr, recv_data->tfd);
if (bo == NULL) {
- LOGE("TBM get error : bo is NULL, tbm_fd:%d(key:%d)", cb_info->tfd, key);
+ LOGE("TBM get error : bo is NULL, tbm_fd:%d(key:%d)", recv_data->tfd, key);
goto EXIT;
}
tbm_bo_unmap(bo);
EXIT:
- if (cb_info->tfd > INVALID_DEFAULT_VALUE)
- close(cb_info->tfd);
- cb_info->tfd = INVALID_DEFAULT_VALUE;
+ if (recv_data->tfd > INVALID_DEFAULT_VALUE)
+ close(recv_data->tfd);
+ recv_data->tfd = INVALID_DEFAULT_VALUE;
if (bo)
tbm_bo_unref(bo);
}
}
-static void __video_frame_render_error_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __video_frame_render_error_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
}
-static void __pd_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __pd_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
int type;
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_PD;
- if (player_msg_get(type, recvMsg))
+ if (player_msg_get(type, recv_data->buffer))
((player_pd_message_cb) cb_info->user_cb[ev]) (type, cb_info->user_data[ev]);
}
-static void __supported_audio_effect_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __supported_audio_effect_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
}
-static void __supported_audio_effect_freset_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __supported_audio_effect_freset_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
}
-static void __missed_plugin_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __missed_plugin_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
}
-static void __media_stream_video_buffer_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __media_stream_video_buffer_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
/* player_media_stream_buffer_status_e status; */
int status;
- if (player_msg_get(status, recvMsg)) {
+ if (player_msg_get(status, recv_data->buffer)) {
((player_media_stream_buffer_status_cb)
cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS]) ((player_media_stream_buffer_status_e) status, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS]);
}
}
-static void __media_stream_audio_buffer_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __media_stream_audio_buffer_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
/* player_media_stream_buffer_status_e status; */
int status;
- if (player_msg_get(status, recvMsg)) {
+ if (player_msg_get(status, recv_data->buffer)) {
((player_media_stream_buffer_status_cb)
cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS])
((player_media_stream_buffer_status_e) status, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS]);
}
-static void __media_stream_video_buffer_cb_handler_ex(callback_cb_info_s * cb_info, char *recvMsg)
+static void __media_stream_video_buffer_cb_handler_ex(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
/* player_media_stream_buffer_status_e status; */
int status;
unsigned long long bytes;
bool ret = TRUE;
- player_msg_get2(recvMsg, status, INT, bytes, INT64, ret);
+ player_msg_get2(recv_data->buffer, status, INT, bytes, INT64, ret);
if (ret == TRUE) {
((player_media_stream_buffer_status_cb_ex)
cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS_WITH_INFO])
}
}
-static void __media_stream_audio_buffer_cb_handler_ex(callback_cb_info_s * cb_info, char *recvMsg)
+static void __media_stream_audio_buffer_cb_handler_ex(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
/* player_media_stream_buffer_status_e status; */
int status;
unsigned long long bytes;
bool ret = TRUE;
- player_msg_get2(recvMsg, status, INT, bytes, INT64, ret);
+ player_msg_get2(recv_data->buffer, status, INT, bytes, INT64, ret);
if (ret == TRUE) {
((player_media_stream_buffer_status_cb_ex)
cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS_WITH_INFO])
}
-static void __media_stream_video_seek_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __media_stream_video_seek_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
unsigned long long offset;
- if (player_msg_get_type(offset, recvMsg, INT64)) {
+ if (player_msg_get_type(offset, recv_data->buffer, INT64)) {
((player_media_stream_seek_cb)
cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK])
(offset, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK]);
}
}
-static void __media_stream_audio_seek_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __media_stream_audio_seek_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
unsigned long long offset;
- if (player_msg_get_type(offset, recvMsg, INT64)) {
+ if (player_msg_get_type(offset, recv_data->buffer, INT64)) {
((player_media_stream_seek_cb)
cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK])
(offset, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK]);
}
}
-static void __video_stream_changed_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
+static void __video_stream_changed_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data)
{
int width;
int height;
int bit_rate;
bool ret_val = TRUE;
- player_msg_get4(recvMsg, width, INT, height, INT, fps, INT, bit_rate, INT, ret_val);
+ player_msg_get4(recv_data->buffer, width, INT, height, INT, fps, INT, bit_rate, INT, ret_val);
if (ret_val) {
((player_video_stream_changed_cb) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED])
(width, height, fps, bit_rate, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED]);
}
}
-static void (*_user_callbacks[MUSE_PLAYER_EVENT_TYPE_NUM]) (callback_cb_info_s * cb_info, char *recvMsg) = {
+static void (*_user_callbacks[MUSE_PLAYER_EVENT_TYPE_NUM]) (callback_cb_info_s * cb_info, _player_recv_data *recv_data) = {
__prepare_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_PREPARE */
__complete_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_COMPLETE */
__interrupt_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_INTERRUPT */
g_mutex_unlock(&data->cb_info->event_queue.idle_ev_mutex);
if (data->cb_info->user_cb[ev])
- _user_callbacks[ev] (data->cb_info, data->buf);
+ _user_callbacks[ev] (data->cb_info, data->recv_data);
else
LOGW("user callback is unset. type : %d", ev);
g_mutex_unlock(&data->event_mutex);
g_mutex_clear(&data->event_mutex);
- g_free(data->buf);
+ g_free(data->recv_data->buffer);
+ g_free(data->recv_data);
g_free(data);
return FALSE; /* remove from the event list */
while (!g_queue_is_empty(ev->queue)) {
event_data = (_player_cb_data *) g_queue_pop_head(ev->queue);
if (event_data) {
- g_free(event_data->buf);
+ g_free(event_data->recv_data->buffer);
+ g_free(event_data->recv_data);
g_free(event_data);
}
}
if (cb_data && cb_data->int_data == ev) {
LOGD("removing '%p (ev:%d)' from event queue", cb_data, cb_data->int_data);
- g_free(cb_data->buf);
+ g_free(cb_data->recv_data->buffer);
+ g_free(cb_data->recv_data);
g_free(cb_data);
g_queue_delete_link(ev_queue->queue, item);
}
}
-static void _user_callback_handler(callback_cb_info_s * cb_info, muse_player_event_e event, char *buffer)
+static void _user_callback_handler(callback_cb_info_s * cb_info, muse_player_event_e event, _player_recv_data *recv_data)
{
LOGD("get event %d", event);
}
data->int_data = (int)event;
data->cb_info = cb_info;
- data->buf = buffer;
+ data->recv_data = recv_data;
g_mutex_init(&data->event_mutex);
_player_event_queue_add(&cb_info->event_queue, data);
}
callback_cb_info_s *cb_info = data;
char *recvMsg = NULL;
muse_core_msg_parse_err_e err;
+ tbm_fd tfd = INVALID_DEFAULT_VALUE;
while (g_atomic_int_get(&cb_info->running)) {
len = 0;
err = MUSE_MSG_PARSE_ERROR_NONE;
- len = player_recv_msg(cb_info);
+ len = player_recv_msg(cb_info, &tfd);
if (len <= 0)
break;
g_mutex_lock(&cb_info->player_mutex);
cb_info->buff.recved++;
_add_ret_msg(api, cb_info, offset, parse_len);
+ if (api == MUSE_PLAYER_API_GET_ALBUM_ART && tfd != INVALID_DEFAULT_VALUE) {
+ LOGD("get tbm fd for album art.");
+ cb_info->tfd = tfd;
+ }
g_cond_signal(&cb_info->player_cond[api]);
g_mutex_unlock(&cb_info->player_mutex);
if (api == MUSE_PLAYER_API_DESTROY)
g_atomic_int_set(&cb_info->running, 0);
} else if (api == MUSE_PLAYER_CB_EVENT) {
int event;
- char *buffer;
+ _player_recv_data *recv_data = NULL;
g_mutex_lock(&cb_info->player_mutex);
- buffer = strndup(recvMsg + offset, parse_len);
+ recv_data = g_new0(_player_recv_data, 1);
+ if (recv_data != NULL) {
+ recv_data->tfd = tfd;
+ recv_data->buffer = strndup(recvMsg+offset, parse_len);
+ } else {
+ LOGE("failed to alloc recv_data.");
+ g_mutex_unlock(&cb_info->player_mutex);
+ muse_core_msg_json_object_free(jobj);
+ break;
+ }
g_mutex_unlock(&cb_info->player_mutex);
if (muse_core_msg_json_object_get_value("event", jobj, &event, MUSE_TYPE_INT))
- _user_callback_handler(cb_info, event, buffer);
+ _user_callback_handler(cb_info, event, recv_data);
} else if (api == MUSE_PLAYER_CB_CREATE_ACK) {
g_mutex_lock(&cb_info->player_mutex);
cb_info->buff.recved++;