2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <sys/types.h>
26 #include <tbm_bufmgr.h>
27 #include <tbm_surface.h>
28 #include <tbm_surface_internal.h>
31 #include <muse_core.h>
32 #include <muse_client.h>
33 #include <muse_player.h>
34 #include <muse_player_msg.h>
35 #include <sound_manager.h>
36 #include <sound_manager_internal.h>
37 #include <storage-internal.h>
38 #include <system_info.h>
39 #include "player_internal.h"
40 #include "player_private.h"
41 #include "player_msg.h"
43 #define INVALID_MUSE_TYPE_VALUE 0
44 #define MAX_S_PATH_LEN 32
45 #define MODULE_NAME "player"
46 #define PLAYER_FEATURE_SOUND_STREAM "http://tizen.org/feature/multimedia.player.stream_info"
47 #define PLAYER_FEATURE_OPENGL "http://tizen.org/feature/opengles.version.2_0"
48 #define PLAYER_FEATURE_SPHERICAL_VIDEO "http://tizen.org/feature/multimedia.player.spherical_video"
49 #define PLAYER_FEATURE_AUDIO_OFFLOAD "http://tizen.org/feature/multimedia.player.audio_offload"
51 #define M_PI 3.14159265358979323846
55 tbm_fd tfd[MUSE_NUM_FD];
61 callback_cb_info_s *cb_info;
62 _player_recv_data *recv_data;
67 intptr_t remote_v_data;
71 } _media_pkt_video_fin_data;
78 } _media_pkt_audio_fin_data;
80 static int _player_deinit_memory_buffer(player_cli_s *pc);
81 static void _player_event_queue_add(player_event_queue *ev, _player_cb_data *data);
82 static bool _player_need_sync_context(int event_id);
83 static void _player_remove_idle_event(callback_cb_info_s *cb_info, muse_player_event_e event_type, bool remove_all);
84 typedef void (*player_retrieve_buffer_cb)(void *user_data);
85 static void __retrieve_buffer_cb(void *user_data);
86 static void __player_media_packet_video_decoded_cb(media_packet_h packet, void *user_data);
87 static int __player_set_retrieve_buffer_cb(player_h player, player_retrieve_buffer_cb callback, void *user_data);
88 static int __player_unset_retrieve_buffer_cb(player_h player);
89 static void _player_release_internal_memory(player_cli_s *pc, bool deinit_server_mem);
92 * Internal Implementation
94 int _player_send_msg(muse_player_api_e api, player_cli_s *player, char *msg, tbm_fd tfd, char **retbuf)
96 int ret = PLAYER_ERROR_NONE;
98 int send_fd = INVALID_DEFAULT_VALUE;
99 int send_tfd[MUSE_NUM_FD];
100 int timeout = client_get_api_timeout(player, api);
102 memset(send_tfd, INVALID_DEFAULT_VALUE, sizeof(send_tfd));
104 if (player && CALLBACK_INFO(player)) {
105 send_fd = MSG_FD(player);
107 LOGE("can not access to cb_info");
108 return PLAYER_ERROR_INVALID_STATE;
111 if ((send_fd <= 0) || !muse_core_fd_is_valid(send_fd)) {
112 LOGE("invalid socket fd %d", send_fd);
113 return PLAYER_ERROR_INVALID_OPERATION;
116 if (tfd != INVALID_DEFAULT_VALUE) {
118 send_len = muse_core_msg_send_fd(send_fd, send_tfd, msg);
120 send_len = muse_core_msg_send(send_fd, msg);
123 LOGE("sending message failed");
124 return PLAYER_ERROR_INVALID_OPERATION;
126 ret = client_wait_for_cb_return(api, CALLBACK_INFO(player), retbuf, timeout);
132 int _player_send_msg_async(int send_fd, char *msg)
136 if ((send_fd <= 0) || !muse_core_fd_is_valid(send_fd)) {
137 LOGE("invalid socket fd %d", send_fd);
138 return PLAYER_ERROR_INVALID_OPERATION;
141 send_len = muse_core_msg_send(send_fd, msg);
143 LOGE("sending message failed");
144 return PLAYER_ERROR_INVALID_OPERATION;
147 return PLAYER_ERROR_NONE;
150 static int _get_current_state(player_cli_s *pc, player_state_e *pstate)
152 PLAYER_INSTANCE_CHECK(pc);
153 PLAYER_NULL_ARG_CHECK(pstate);
154 muse_player_api_e api = MUSE_PLAYER_API_GET_STATE;
155 int ret = PLAYER_ERROR_NONE;
156 int state = PLAYER_STATE_NONE;
157 char *ret_buf = NULL;
159 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
161 if (ret == PLAYER_ERROR_NONE) {
162 player_msg_get(state, ret_buf);
164 LOGD("current state %d", *pstate);
171 static bool _player_get_param_value(char *buf, ...)
173 muse_core_msg_parse_err_e err = MUSE_MSG_PARSE_ERROR_NONE;
176 int type = MUSE_TYPE_ANY;
177 char *param_name = NULL;
182 void *jobj = muse_core_msg_object_new(buf, NULL, &err);
185 LOGE("failed to get msg object. err:%d", err);
189 va_start(var_args, buf);
191 while ((type = va_arg(var_args, int)) != INVALID_MUSE_TYPE_VALUE) {
192 param_name = va_arg(var_args, char *);
195 case MUSE_TYPE_INT64:
196 case MUSE_TYPE_DOUBLE:
197 case MUSE_TYPE_STRING:
198 case MUSE_TYPE_POINTER:
199 value = va_arg(var_args, void *);
201 if (!muse_core_msg_object_get_value(param_name, jobj, type, value)) {
203 LOGE("failed to get %s value", param_name);
207 LOGE("Unexpected type");
213 muse_core_msg_object_free(jobj);
219 int _player_video_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data)
221 int ret = MEDIA_PACKET_FINALIZE;
222 muse_player_api_e api = MUSE_PLAYER_API_RETURN_VIDEO_DATA;
223 _media_pkt_video_fin_data *fin_data = (_media_pkt_video_fin_data *)user_data;
225 char *snd_msg = NULL;
229 LOGE("invalid parameter buffer %p, user_data %p", pkt, user_data);
233 if (!fin_data || fin_data->fd <= INVALID_DEFAULT_VALUE) {
234 LOGE("invalid parameter, fd: %d", (fin_data) ? (fin_data->fd) : (-1));
238 if (!fin_data->use_tsurf_pool) {
239 tbm_surface_h tsurf = NULL;
240 if (media_packet_get_tbm_surface(pkt, &tsurf) != MEDIA_PACKET_ERROR_NONE) {
241 LOGE("media_packet_get_tbm_surface failed");
242 /* continue the remained job */
245 /* LOGD("tsurf destroy %p", tsurf); */
246 tbm_surface_destroy(tsurf);
250 /* Do not destroy tbm surface here to reuse during playback *
251 * they will be destroyed at player_unprepare() or player_destroy(). *
252 * ref: __player_remove_tsurf_list() */
254 tbm_surface_h tsurf = NULL;
256 if (media_packet_get_tbm_surface(pkt, &tsurf) == MEDIA_PACKET_ERROR_NONE) {
257 /* LOGD("tsurf set to null %p", tsurf); */
262 if (muse_core_fd_is_valid(fin_data->fd)) {
263 if (muse_client_check_fd_id_value(fin_data->fd, fin_data->fd_id) == FALSE) {
264 LOGE("[fd:%d,id:%d] is invalid.", fin_data->fd, fin_data->fd_id);
268 v_data = fin_data->remote_v_data;
269 snd_msg = muse_core_msg_new(api, MUSE_TYPE_POINTER, "v_data", v_data, 0);
270 snd_len = muse_core_msg_send(fin_data->fd, snd_msg);
271 muse_core_msg_free(snd_msg);
274 LOGE("[fd:%d] fail to send msg.", fin_data->fd);
276 LOGE("[fd:%d] is invalid.", fin_data->fd);
288 int _player_audio_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data)
290 int ret = MEDIA_PACKET_FINALIZE;
291 muse_player_api_e api = MUSE_PLAYER_API_RETURN_BUFFER;
292 _media_pkt_audio_fin_data *fin_data = (_media_pkt_audio_fin_data *)user_data;
295 LOGE("invalid parameter buffer %p, user_data %p", pkt, user_data);
300 LOGE("invalid fin_data");
305 /* LOGD("release memory - %p", fin_data->bo); */
306 tbm_bo_unref(fin_data->bo);
309 if (fin_data->fd > INVALID_DEFAULT_VALUE && muse_core_fd_is_valid(fin_data->fd)) {
310 if (muse_client_check_fd_id_value(fin_data->fd, fin_data->fd_id) == FALSE) {
311 LOGE("[fd:%d,id:%d] is invalid.", fin_data->fd, fin_data->fd_id);
315 PLAYER_SEND_MSG_ASYNC_WITH_NO_RETURN(api, fin_data->fd, MUSE_TYPE_INT, "key", fin_data->key);
317 LOGE("[fd:%d] is invalid.", fin_data->fd);
329 static bool _player_video_roi_area_is_valid(double x_scale, double y_scale,
330 double w_scale, double h_scale)
332 if (x_scale >= 0.0 && x_scale <= 1.0 && y_scale >= 0.0 && y_scale <= 1.0
333 && w_scale > 0.0 && w_scale <= 1.0 && h_scale > 0.0 && h_scale <= 1.0)
336 LOGE("Video roi area is not valid");
340 static bool _player_check_network_availability(void)
342 #define _FEATURE_NAME_WIFI "http://tizen.org/feature/network.wifi"
343 #define _FEATURE_NAME_TELEPHONY "http://tizen.org/feature/network.telephony"
344 #define _FEATURE_NAME_ETHERNET "http://tizen.org/feature/network.ethernet"
345 bool enabled = FALSE;
346 bool supported = FALSE;
348 if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_WIFI, &enabled)) {
349 LOGI("wifi status = %d", enabled);
353 LOGE("SYSTEM_INFO_ERROR");
356 if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_TELEPHONY, &enabled)) {
357 LOGI("telephony status = %d", enabled);
361 LOGE("SYSTEM_INFO_ERROR");
364 if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_ETHERNET, &enabled)) {
365 LOGI("ethernet status = %d", enabled);
369 LOGE("SYSTEM_INFO_ERROR");
378 static void *_get_mem(player_cli_s *player, int size)
380 player_data_s *mem = g_new(player_data_s, sizeof(player_data_s));
382 mem->data = g_new(void, size);
383 mem->next = player->head;
390 static void _del_mem(player_cli_s *player)
393 while (player->head) {
394 mem = player->head->next;
395 g_free(player->head->data);
396 g_free(player->head);
401 static int player_recv_msg(callback_cb_info_s *cb_info, tbm_fd *tfd)
404 msg_buff_s *buff = &cb_info->buff;
406 memset(buff->recvMsg, 0x00, sizeof(char) * buff->bufLen);
407 memset(tfd, INVALID_DEFAULT_VALUE, sizeof(*tfd) * MUSE_NUM_FD);
408 recvLen = muse_core_msg_recv_fd(cb_info->fd, buff->recvMsg, MUSE_MSG_MAX_LENGTH, tfd);
410 LOGE("failed to recv msg %d", recvLen);
414 /* check the first msg */
415 if (buff->part_of_msg && buff->recvMsg[0] != '{')
417 gchar *tmp = g_strndup(buff->recvMsg, recvLen);
419 LOGE("failed to copy msg.");
423 LOGD("get remained part of msg %d + %zu, %d", recvLen, strlen(buff->part_of_msg), buff->bufLen);
426 if (recvLen + strlen(buff->part_of_msg) >= buff->bufLen) {
427 LOGD("realloc Buffer %d -> %d", buff->bufLen, (int)(recvLen + strlen(buff->part_of_msg) + 1));
428 buff->bufLen = recvLen + strlen(buff->part_of_msg) + 1;
429 buff->recvMsg = g_renew(char, buff->recvMsg, buff->bufLen);
430 if (!buff->recvMsg) {
431 LOGE("failed renew buffer.");
435 memset(buff->recvMsg, 0x00, sizeof(char) * buff->bufLen);
437 g_snprintf(buff->recvMsg, buff->bufLen, "%s%s", buff->part_of_msg, tmp);
438 recvLen += strlen(buff->part_of_msg);
440 g_free(buff->part_of_msg);
441 buff->part_of_msg = NULL;
446 /* check the last msg */
447 if (buff->recvMsg[recvLen - 1] != '}') {
448 char *part_pos = strrchr(buff->recvMsg, '}');
449 int part_len = ((part_pos) ? (strlen(part_pos + 1)) : (0));
452 buff->part_of_msg = g_strndup(part_pos + 1, part_len);
453 if (!buff->part_of_msg) {
454 LOGE("failed to alloc buffer for part of msg.");
457 LOGD("get part of msg: %zu, %s", strlen(buff->part_of_msg), buff->part_of_msg);
465 static void set_null_user_cb(callback_cb_info_s *cb_info, muse_player_event_e event)
467 if (cb_info && event < MUSE_PLAYER_EVENT_TYPE_NUM) {
468 cb_info->user_cb[event] = NULL;
469 cb_info->user_data[event] = NULL;
473 /* Notice : have to be called via API to avoid deadlock
474 * to clear the cb setting at the cb thread, set_null_user_cb() have to be called instead.
476 static void set_null_user_cb_lock(callback_cb_info_s *cb_info, muse_player_event_e event)
480 LOGD("event %d cb will be cleared", event);
483 LOGE("cb_info is NULL, event: %d", event);
487 lock = (g_thread_self() != cb_info->event_queue.thread);
490 g_mutex_lock(&cb_info->event_queue.mutex);
492 if (_player_need_sync_context(event))
493 _player_remove_idle_event(cb_info, event, false);
495 set_null_user_cb(cb_info, event);
498 g_mutex_unlock(&cb_info->event_queue.mutex);
501 static int __set_callback(muse_player_event_e type, player_h player, void *callback, void *user_data)
503 int ret = PLAYER_ERROR_NONE;
504 player_cli_s *pc = (player_cli_s *)player;
505 muse_player_api_e api = MUSE_PLAYER_API_SET_CALLBACK;
506 char *ret_buf = NULL;
509 PLAYER_INSTANCE_CHECK(player);
510 PLAYER_NULL_ARG_CHECK(callback);
512 if (type == MUSE_PLAYER_EVENT_TYPE_BUFFERING) {
513 if (!_player_check_network_availability())
514 return PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE;
515 pc->cb_info->drop_buffering_message = FALSE;
518 if (!CALLBACK_INFO(pc))
519 return PLAYER_ERROR_INVALID_OPERATION;
521 LOGI("Event type : %d ", type);
522 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
523 MUSE_TYPE_INT, "type", type,
524 MUSE_TYPE_INT, "set", set);
526 if (ret == PLAYER_ERROR_NONE) {
527 pc->cb_info->user_cb[type] = callback;
528 pc->cb_info->user_data[type] = user_data;
535 static int __unset_callback(muse_player_event_e type, player_h player)
537 int ret = PLAYER_ERROR_NONE;
538 player_cli_s *pc = (player_cli_s *)player;
539 muse_player_api_e api = MUSE_PLAYER_API_SET_CALLBACK;
540 char *ret_buf = NULL;
543 PLAYER_INSTANCE_CHECK(player);
545 LOGI("Event type : %d ", type);
547 PLAYER_NULL_ARG_CHECK(CALLBACK_INFO(pc));
549 if ((type == MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME) ||
550 (type == MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME)) {
551 /* check state condition */
552 player_state_e state = PLAYER_STATE_NONE;
554 if (_get_current_state(pc, &state) != PLAYER_ERROR_NONE) {
555 LOGE("Failed to get current state");
556 return PLAYER_ERROR_INVALID_OPERATION;
559 if (state > PLAYER_STATE_READY) {
560 LOGE("Invalid state %d", state);
561 return PLAYER_ERROR_INVALID_STATE;
565 set_null_user_cb_lock(CALLBACK_INFO(pc), type);
567 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
568 MUSE_TYPE_INT, "type", type,
569 MUSE_TYPE_INT, "set", set);
575 static void __prepare_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
577 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_PREPARE;
579 ((player_prepared_cb)cb_info->user_cb[ev])(cb_info->user_data[ev]);
581 set_null_user_cb(cb_info, ev);
584 static void __complete_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
586 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_COMPLETE;
587 ((player_completed_cb)cb_info->user_cb[ev])(cb_info->user_data[ev]);
590 static void __player_media_packet_video_decoded_cb(media_packet_h packet, void *user_data)
592 if (!packet || !user_data) {
593 LOGE("invalid param [packet:%p, user_data:%p]", packet, user_data);
597 LOGD("render packet %p", packet);
599 mm_display_interface_evas_render(DP_INTERFACE((player_cli_s *)user_data), packet);
602 static void __retrieve_buffer_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
605 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER;
606 ((player_retrieve_buffer_cb)cb_info->user_cb[ev])(cb_info->user_data[ev]);
609 static void __interrupt_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
611 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_INTERRUPT;
612 ((player_interrupted_cb)cb_info->user_cb[ev])(PLAYER_INTERRUPTED_BY_RESOURCE_CONFLICT, cb_info->user_data[ev]);
615 static void __error_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
618 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_ERROR;
620 if (player_msg_get(code, recv_data->buffer)) {
621 if (code == PLAYER_ERROR_NOT_SUPPORTED_FILE) {
622 if (cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
623 LOGW("failed to pause, so prepare cb will be released soon");
624 set_null_user_cb(cb_info, MUSE_PLAYER_EVENT_TYPE_PREPARE);
627 ((player_error_cb)cb_info->user_cb[ev])(code, cb_info->user_data[ev]);
631 static void __disconnected_error_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
633 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_ERROR;
635 ((player_error_cb)cb_info->user_cb[ev])(PLAYER_ERROR_SERVICE_DISCONNECTED, cb_info->user_data[ev]);
638 static void __buffering_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
641 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_BUFFERING;
643 if (player_msg_get(percent, recv_data->buffer)) {
644 g_mutex_lock(&cb_info->buffering_cb_mutex);
645 if (cb_info->drop_buffering_message) {
646 LOGD("Drop buffering callback");
647 g_mutex_unlock(&cb_info->buffering_cb_mutex);
650 g_mutex_unlock(&cb_info->buffering_cb_mutex);
651 ((player_buffering_cb)cb_info->user_cb[ev])(percent, cb_info->user_data[ev]);
656 static void __subtitle_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
659 char text[MUSE_URI_MAX_LENGTH] = { 0, };
660 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_SUBTITLE;
663 ret = _player_get_param_value(recv_data->buffer,
664 MUSE_TYPE_INT, "duration", (void *)&duration,
665 MUSE_TYPE_STRING, "text", (void *)text,
666 INVALID_MUSE_TYPE_VALUE);
668 ((player_subtitle_updated_cb)cb_info->user_cb[ev])(duration, text, cb_info->user_data[ev]);
671 static void __capture_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
673 unsigned char *data = NULL;
676 unsigned int size = 0;
678 tbm_bo_handle thandle;
679 int key = INVALID_DEFAULT_VALUE;
681 get_ret = _player_get_param_value(recv_data->buffer,
682 MUSE_TYPE_INT, "width", (void *)&width,
683 MUSE_TYPE_INT, "height", (void *)&height,
684 MUSE_TYPE_INT, "size", (void *)&size,
685 MUSE_TYPE_INT, "key", (void *)&key,
686 INVALID_MUSE_TYPE_VALUE);
688 if (recv_data->tfd[0] < 0) {
689 LOGE("There is no valid tbm_fd");
693 bo = tbm_bo_import_fd(cb_info->bufmgr, recv_data->tfd[0]);
695 LOGE("TBM get error : bo is NULL");
698 thandle = tbm_bo_map(bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE | TBM_OPTION_READ);
699 if (thandle.ptr == NULL) {
700 LOGE("TBM get error : handle pointer is NULL");
703 data = g_new(unsigned char, size);
705 memcpy(data, thandle.ptr, size);
706 ((player_video_captured_cb)cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE])(data, width, height, size, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE]);
709 LOGE("g_new failure");
716 PLAYER_CLOSE_FD(recv_data->tfd[0]);
718 memset(recv_data->tfd, INVALID_DEFAULT_VALUE, sizeof(recv_data->tfd));
724 if (key > INVALID_DEFAULT_VALUE) {
725 LOGD("send msg to release buffer. key:%d", key);
726 PLAYER_SEND_MSG_ASYNC_WITH_NO_RETURN(MUSE_PLAYER_API_RETURN_BUFFER, cb_info->fd, MUSE_TYPE_INT, "key", key);
729 set_null_user_cb(cb_info, MUSE_PLAYER_EVENT_TYPE_CAPTURE);
732 static void __seek_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
734 int ret = MM_ERROR_NONE;
735 muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_SEEK;
736 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
738 g_mutex_lock(&cb_info->seek_cb_mutex);
740 switch (cb_info->seek_cb_state) {
741 case PLAYER_SEEK_CB_STATE_NONE:
743 if (!cb_info->user_cb[ev]) {
744 LOGW("invalid seek callback info, skip");
748 ret = mm_display_interface_get_type(cb_info->dp_info.interface, &display_type);
749 if (ret == MM_ERROR_NONE && display_type == MM_DISPLAY_TYPE_EVAS &&
750 cb_info->dp_info.visible != PLAYER_VISIBLE_INFO_FALSE) {
751 LOGW("set display visible true for EVAS");
752 if (mm_display_interface_evas_set_visible(cb_info->dp_info.interface, true) != MM_ERROR_NONE)
753 LOGE("mm_display_interface_evas_set_visible failed");
755 LOGW("get display type ret 0x%x, type %d", ret, display_type);
758 LOGD("call seek cb");
759 ((player_seek_completed_cb)cb_info->user_cb[ev])(cb_info->user_data[ev]);
760 set_null_user_cb(cb_info, ev);
764 case PLAYER_SEEK_CB_STATE_DROP:
765 case PLAYER_SEEK_CB_STATE_WAIT: /* not expected */
766 LOGW("ignored. seek cb %p, state %d", cb_info->user_cb[ev], cb_info->seek_cb_state);
769 LOGE("invalid state value");
773 g_mutex_unlock(&cb_info->seek_cb_mutex);
776 static void __player_remove_tsurf_list(player_cli_s *pc)
780 g_mutex_lock(&pc->cb_info->data_mutex);
781 if (pc->cb_info->tsurf_list) {
782 LOGD("total num of tsurf list = %d", g_list_length(pc->cb_info->tsurf_list));
784 for (l = g_list_first(pc->cb_info->tsurf_list); l; l = g_list_next(l)) {
785 player_tsurf_info_s *tmp = (player_tsurf_info_s *)l->data;
787 LOGD("%p will be removed", tmp);
790 tbm_surface_destroy(tmp->tsurf);
796 g_list_free(pc->cb_info->tsurf_list);
797 pc->cb_info->tsurf_list = NULL;
799 g_mutex_unlock(&pc->cb_info->data_mutex);
803 static player_tsurf_info_s *__player_get_tsurf_from_list(callback_cb_info_s *cb_info, int *key, int height, int width)
807 g_mutex_lock(&cb_info->data_mutex);
808 for (l = g_list_first(cb_info->tsurf_list); l; l = g_list_next(l)) {
809 player_tsurf_info_s *tmp = (player_tsurf_info_s *)l->data;
810 if (tmp && key && (tmp->key[0] == key[0])) {
811 LOGD("found tsurf_data of tbm_key %d", key[0]);
813 /* need to check tsuf info to support DRC */
814 if ((tbm_surface_get_height(tmp->tsurf) != height) ||
815 (tbm_surface_get_width(tmp->tsurf) != width)) {
817 cb_info->tsurf_list = g_list_remove(cb_info->tsurf_list, tmp);
818 LOGW("tsurf info is changed. need to create new tsurf.");
819 tbm_surface_destroy(tmp->tsurf);
822 g_mutex_unlock(&cb_info->data_mutex);
826 g_mutex_unlock(&cb_info->data_mutex);
831 g_mutex_unlock(&cb_info->data_mutex);
835 static media_packet_rotate_method_e __convert_packet_orient_info(int orientation)
837 media_packet_rotate_method_e rotate = MEDIA_PACKET_ROTATE_IDENTITY;
839 switch (orientation) {
841 rotate = MEDIA_PACKET_ROTATE_90;
844 rotate = MEDIA_PACKET_ROTATE_180;
847 rotate = MEDIA_PACKET_ROTATE_270;
850 rotate = MEDIA_PACKET_ROTATE_IDENTITY;
857 static void __media_packet_video_frame_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
859 tbm_bo bo[4] = { NULL, };
860 int key[4] = { INVALID_DEFAULT_VALUE, };
861 tbm_surface_info_s sinfo;
862 char *surface_info = (char *)&sinfo;
863 media_packet_h pkt = NULL;
864 tbm_surface_h tsurf = NULL;
865 player_tsurf_info_s *tsurf_data = NULL;
867 media_format_mimetype_e mimetype = MEDIA_FORMAT_NV12;
868 bool make_pkt_fmt = false;
869 int ret = MEDIA_FORMAT_ERROR_NONE;
870 _media_pkt_video_fin_data *fin_data = NULL;
873 int i = 0, orientation = 0;
874 muse_core_msg_parse_err_e err = MUSE_MSG_PARSE_ERROR_NONE;
876 void *jobj = muse_core_msg_object_new(recv_data->buffer, NULL, &err);
878 !muse_core_msg_object_get_value("key[0]", jobj, MUSE_TYPE_ANY, &key[0]) ||
879 !muse_core_msg_object_get_value("key[1]", jobj, MUSE_TYPE_ANY, &key[1]) ||
880 !muse_core_msg_object_get_value("key[2]", jobj, MUSE_TYPE_ANY, &key[2]) ||
881 !muse_core_msg_object_get_value("key[3]", jobj, MUSE_TYPE_ANY, &key[3]) ||
882 !muse_core_msg_object_get_value("v_data", jobj, MUSE_TYPE_POINTER, &v_data) ||
883 !muse_core_msg_object_get_value("mimetype", jobj, MUSE_TYPE_ANY, &mimetype) ||
884 !muse_core_msg_object_get_value("pts", jobj, MUSE_TYPE_INT64, &pts) ||
885 !muse_core_msg_object_get_value("orientation", jobj, MUSE_TYPE_INT, &orientation) ||
886 !muse_core_msg_object_get_value("surface_info", jobj, MUSE_TYPE_ARRAY, surface_info)) {
888 LOGE("failed to get value from msg. jobj:%p, err:%d", jobj, err);
890 muse_core_msg_object_free(jobj);
893 muse_core_msg_object_free(jobj);
895 LOGD("width %d, height %d", sinfo.width, sinfo.height);
898 LOGE("cb_info is null");
902 if (!cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME]) {
903 /* send msg to release v_data. */
904 LOGE("_video_decoded_cb is not set");
908 if (recv_data->tfd[0] <= INVALID_DEFAULT_VALUE) {
909 LOGE("tbm fd is invalid");
913 tsurf_data = __player_get_tsurf_from_list(cb_info, key, (int)sinfo.height, (int)sinfo.width);
915 for (i = 0; i < MUSE_NUM_FD; i++) {
916 if (recv_data->tfd[i] <= INVALID_DEFAULT_VALUE)
920 bo[i] = tbm_bo_import_fd(cb_info->bufmgr, recv_data->tfd[i]);
923 tsurf = tbm_surface_internal_create_with_bos(&sinfo, bo, bo_num);
925 LOGE("failed to create tbm surface");
929 if (cb_info->use_tsurf_pool) {
930 tsurf_data = g_try_new(player_tsurf_info_s, 1);
932 LOGE("failed to alloc tsurf info");
935 memset(tsurf_data->key, INVALID_DEFAULT_VALUE, sizeof(tsurf_data->key));
937 memcpy(tsurf_data->key, key, sizeof(tsurf_data->key));
938 tsurf_data->tsurf = tsurf;
940 g_mutex_lock(&cb_info->data_mutex);
941 cb_info->tsurf_list = g_list_append(cb_info->tsurf_list, tsurf_data);
942 LOGD("key %d is added to the pool", key[0]);
943 if (cb_info->video_frame_pool_size < g_list_length(cb_info->tsurf_list))
944 LOGE("need to check the pool size: %d < %d", cb_info->video_frame_pool_size, g_list_length(cb_info->tsurf_list));
945 g_mutex_unlock(&cb_info->data_mutex);
948 if (tsurf_data->tsurf) {
949 tsurf = tsurf_data->tsurf;
951 LOGE("tsurf_data->tsurf is null (never enter here)");
956 /* check media packet format */
957 if (cb_info->pkt_fmt) {
958 int pkt_fmt_width = 0;
959 int pkt_fmt_height = 0;
960 media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12;
962 media_format_get_video_info(cb_info->pkt_fmt, &pkt_fmt_mimetype, &pkt_fmt_width, &pkt_fmt_height, NULL, NULL);
963 if (pkt_fmt_mimetype != mimetype || pkt_fmt_width != sinfo.width || pkt_fmt_height != sinfo.height) {
964 LOGW("different format. current 0x%x, %dx%d, new 0x%x, %dx%d", pkt_fmt_mimetype, pkt_fmt_width, pkt_fmt_height, mimetype, sinfo.width, sinfo.height);
965 media_format_unref(cb_info->pkt_fmt);
966 cb_info->pkt_fmt = NULL;
972 /* create packet format */
974 LOGI("make new pkt_fmt - mimetype 0x%x, %dx%d", mimetype, sinfo.width, sinfo.height);
975 ret = media_format_create(&cb_info->pkt_fmt);
976 if (ret == MEDIA_FORMAT_ERROR_NONE) {
977 ret = media_format_set_video_mime(cb_info->pkt_fmt, mimetype);
978 ret |= media_format_set_video_width(cb_info->pkt_fmt, sinfo.width);
979 ret |= media_format_set_video_height(cb_info->pkt_fmt, sinfo.height);
980 LOGI("media_format_set_video_mime,width,height ret : 0x%x", ret);
982 LOGE("media_format_create failed");
986 fin_data = g_try_new0(_media_pkt_video_fin_data, 1);
988 LOGE("failed to alloc fin_data");
991 fin_data->remote_v_data = v_data;
992 fin_data->fd = cb_info->fd;
993 fin_data->use_tsurf_pool = cb_info->use_tsurf_pool;
995 /* Keep the fd id to check validation when the pkt is destroyed. */
996 fin_data->fd_id = muse_client_get_fd_id_value(fin_data->fd);
998 ret = media_packet_create_from_tbm_surface(cb_info->pkt_fmt, tsurf, (media_packet_finalize_cb)_player_video_media_packet_finalize, (void *)fin_data, &pkt);
999 if (ret != MEDIA_PACKET_ERROR_NONE || !pkt) {
1000 LOGE("media_packet_create_from_tbm_surface failed %d %p", ret, pkt);
1005 ret = media_packet_set_pts(pkt, (uint64_t)pts);
1006 if (ret != MEDIA_PACKET_ERROR_NONE)
1007 LOGE("media_packet_set_pts failed");
1010 ret = media_packet_set_rotate_method(pkt, __convert_packet_orient_info(orientation));
1011 if (ret != MEDIA_PACKET_ERROR_NONE)
1012 LOGE("media_packet_set_rotate_method failed");
1014 if (cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME]) {
1015 /* call media packet callback */
1016 ((player_media_packet_video_decoded_cb)cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME])(pkt, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME]);
1018 LOGE("_video_decoded_cb is not set");
1019 media_packet_destroy(pkt);
1022 /* if tsruf pool is enabled, bo_num can be zero. */
1023 for (i = 0; i < MUSE_NUM_FD; i++)
1024 PLAYER_CLOSE_FD(recv_data->tfd[i]);
1026 for (i = 0; i < bo_num; i++) {
1028 tbm_bo_unref(bo[i]);
1031 memset(recv_data->tfd, INVALID_DEFAULT_VALUE, sizeof(recv_data->tfd));
1036 media_packet_destroy(pkt);
1037 else if (!tsurf_data && tsurf)
1038 tbm_surface_destroy(tsurf);
1043 /* if tsruf pool is enabled, bo_num can be zero. */
1044 for (i = 0; i < MUSE_NUM_FD; i++)
1045 PLAYER_CLOSE_FD(recv_data->tfd[i]);
1047 for (i = 0; i < bo_num; i++) {
1049 tbm_bo_unref(bo[i]);
1051 memset(recv_data->tfd, INVALID_DEFAULT_VALUE, sizeof(recv_data->tfd));
1053 if (cb_info && v_data)
1054 PLAYER_SEND_MSG_ASYNC_WITH_NO_RETURN(MUSE_PLAYER_API_RETURN_VIDEO_DATA, cb_info->fd, MUSE_TYPE_POINTER, "v_data", v_data);
1059 static void __media_packet_audio_frame_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1061 int ret = MEDIA_FORMAT_ERROR_NONE;
1063 tbm_bo_handle thandle;
1064 int key = INVALID_DEFAULT_VALUE;
1065 player_audio_decoded_data_info_t audio;
1066 media_packet_h pkt = NULL;
1067 media_format_h fmt = NULL;
1068 _media_pkt_audio_fin_data *fin_data = NULL;
1070 if (!player_msg_get(key, recv_data->buffer)) {
1071 LOGE("failed to get key value from msg.");
1075 if (recv_data->tfd[0] < 0) {
1076 LOGE("failed to get tbm_fd(key:%d)", key);
1080 bo = tbm_bo_import_fd(cb_info->bufmgr, recv_data->tfd[0]);
1082 LOGE("TBM get error : bo is NULL, tbm_fd:%d(key:%d)", recv_data->tfd[0], key);
1086 thandle = tbm_bo_map(bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE | TBM_OPTION_READ);
1087 if (thandle.ptr == NULL) {
1088 LOGE("TBM get error : handle pointer is NULL");
1092 memcpy(&audio, thandle.ptr, sizeof(player_audio_decoded_data_info_t));
1093 audio.data = thandle.ptr + sizeof(player_audio_decoded_data_info_t);
1096 /* LOGD("user callback data %p, size %d", audio.data, audio.size); */
1097 if (cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME]) {
1098 ret = media_format_create(&fmt);
1099 if (ret != MEDIA_FORMAT_ERROR_NONE || !fmt) {
1100 LOGE("failed to create media format 0x%X %p", ret, fmt);
1104 ret = media_format_set_audio_mime(fmt, audio.pcm_format);
1105 ret |= media_format_set_audio_samplerate(fmt, audio.rate);
1106 ret |= media_format_set_audio_channel(fmt, audio.channel);
1107 ret |= media_format_set_audio_channel_mask(fmt, audio.channel_mask);
1108 if (ret != MEDIA_FORMAT_ERROR_NONE) {
1109 LOGE("failed to set audio format 0x%X", ret);
1113 fin_data = g_new0(_media_pkt_audio_fin_data, 1);
1115 LOGE("failed to alloc fin_data");
1119 fin_data->key = key;
1120 fin_data->fd = cb_info->fd;
1123 /* Keep the fd id to check validation when the pkt is destroyed. */
1124 fin_data->fd_id = muse_client_get_fd_id_value(fin_data->fd);
1126 ret = media_packet_create_from_external_memory(fmt, audio.data, audio.size,
1127 (media_packet_finalize_cb)_player_audio_media_packet_finalize, (void *)fin_data, &pkt);
1128 if (ret != MEDIA_PACKET_ERROR_NONE || !pkt) {
1129 LOGE("failed to create media packet 0x%X %p", ret, pkt);
1131 media_packet_destroy(pkt); /* fin_data will be free in finalize function. */
1137 media_format_unref(fmt);
1140 ((player_media_packet_audio_decoded_cb)cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME])
1141 (pkt, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME]);
1143 LOGE("there is no registered cb");
1148 PLAYER_CLOSE_FD(recv_data->tfd[0]);
1150 memset(recv_data->tfd, INVALID_DEFAULT_VALUE, sizeof(recv_data->tfd));
1153 media_format_unref(fmt);
1156 if ((cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME] == NULL) &&
1157 (key > INVALID_DEFAULT_VALUE)) {
1159 if (bo) tbm_bo_unref(bo);
1161 /* LOGD("send msg to release buffer. key:%d", key); */
1162 PLAYER_SEND_MSG_ASYNC_WITH_NO_RETURN(MUSE_PLAYER_API_RETURN_BUFFER, cb_info->fd, MUSE_TYPE_INT, "key", key);
1168 static void __video_frame_render_error_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1172 static void __supported_audio_effect_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1176 static void __supported_audio_effect_preset_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1180 static void __missed_plugin_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1184 static void __media_stream_video_buffer_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1186 /* player_media_stream_buffer_status_e status; */
1189 if (player_msg_get(status, recv_data->buffer)) {
1190 ((player_media_stream_buffer_status_cb)
1191 cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS])
1192 ((player_media_stream_buffer_status_e)status,
1193 cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS]);
1197 static void __media_stream_audio_buffer_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1199 /* player_media_stream_buffer_status_e status; */
1202 if (player_msg_get(status, recv_data->buffer)) {
1203 ((player_media_stream_buffer_status_cb)
1204 cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS])
1205 ((player_media_stream_buffer_status_e) status,
1206 cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS]);
1211 static void __media_stream_video_buffer_cb_handler_ex(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1213 /* player_media_stream_buffer_status_e status; */
1215 unsigned long long bytes;
1218 ret = _player_get_param_value(recv_data->buffer,
1219 MUSE_TYPE_INT, "status", (void *)&status,
1220 MUSE_TYPE_INT64, "bytes", (void *)&bytes,
1221 INVALID_MUSE_TYPE_VALUE);
1223 ((player_media_stream_buffer_status_cb_ex)
1224 cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS_WITH_INFO])
1225 ((player_media_stream_buffer_status_e) status, bytes, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS_WITH_INFO]);
1229 static void __media_stream_audio_buffer_cb_handler_ex(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1231 /* player_media_stream_buffer_status_e status; */
1233 unsigned long long bytes;
1236 ret = _player_get_param_value(recv_data->buffer,
1237 MUSE_TYPE_INT, "status", (void *)&status,
1238 MUSE_TYPE_INT64, "bytes", (void *)&bytes,
1239 INVALID_MUSE_TYPE_VALUE);
1241 ((player_media_stream_buffer_status_cb_ex)
1242 cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS_WITH_INFO])
1243 ((player_media_stream_buffer_status_e) status, bytes, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS_WITH_INFO]);
1248 static void __media_stream_video_seek_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1250 unsigned long long offset;
1252 if (player_msg_get_type(offset, recv_data->buffer, INT64)) {
1253 ((player_media_stream_seek_cb)
1254 cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK])
1255 (offset, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK]);
1259 static void __media_stream_audio_seek_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1261 unsigned long long offset;
1263 if (player_msg_get_type(offset, recv_data->buffer, INT64)) {
1264 ((player_media_stream_seek_cb)
1265 cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK])
1266 (offset, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK]);
1270 static void __video_stream_changed_cb_handler(callback_cb_info_s *cb_info, _player_recv_data *recv_data)
1276 bool ret_val = TRUE;
1277 ret_val = _player_get_param_value(recv_data->buffer,
1278 MUSE_TYPE_INT, "width", (void *)&width,
1279 MUSE_TYPE_INT, "height", (void *)&height,
1280 MUSE_TYPE_INT, "fps", (void *)&fps,
1281 MUSE_TYPE_INT, "bit_rate", (void *)&bit_rate,
1282 INVALID_MUSE_TYPE_VALUE);
1284 ((player_video_stream_changed_cb)cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED])
1285 (width, height, fps, bit_rate, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED]);
1289 static void (*_user_callbacks[MUSE_PLAYER_EVENT_TYPE_NUM])(callback_cb_info_s *cb_info, _player_recv_data *recv_data) = {
1290 __prepare_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_PREPARE */
1291 __complete_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_COMPLETE */
1292 __interrupt_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_INTERRUPT */
1293 __error_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_ERROR */
1294 __buffering_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_BUFFERING */
1295 __subtitle_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_SUBTITLE */
1296 __capture_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_CAPTURE */
1297 __seek_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_SEEK */
1298 __media_packet_video_frame_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME */
1299 __media_packet_audio_frame_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME */
1300 __video_frame_render_error_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_VIDEO_FRAME_RENDER_ERROR */
1301 __supported_audio_effect_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_SUPPORTED_AUDIO_EFFECT */
1302 __supported_audio_effect_preset_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_SUPPORTED_AUDIO_EFFECT_PRESET */
1303 __missed_plugin_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_MISSED_PLUGIN */
1304 #ifdef _PLAYER_FOR_PRODUCT
1305 NULL, /* MUSE_PLAYER_EVENT_TYPE_IMAGE_BUFFER */
1306 NULL, /* MUSE_PLAYER_EVENT_TYPE_SELECTED_SUBTITLE_LANGUAGE */
1308 __media_stream_video_buffer_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS */
1309 __media_stream_audio_buffer_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS */
1310 __media_stream_video_buffer_cb_handler_ex, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS_WITH_INFO */
1311 __media_stream_audio_buffer_cb_handler_ex, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS_WITH_INFO */
1312 __media_stream_video_seek_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK */
1313 __media_stream_audio_seek_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK */
1314 NULL, /* MUSE_PLAYER_EVENT_TYPE_AUDIO_STREAM_CHANGED */
1315 __video_stream_changed_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED */
1316 __retrieve_buffer_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER */
1317 __disconnected_error_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_SERVICE_DISCONNECTED */
1320 gboolean _player_event_job_function(void *user_data)
1322 _player_cb_data *data = (_player_cb_data *)user_data;
1323 muse_player_event_e ev;
1326 LOGE("data is null");
1330 ev = data->int_data;
1331 if ((ev != MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME) &&
1332 (ev != MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME))
1333 LOGD("enter ev:%d(%p)", ev, data);
1335 g_mutex_lock(&data->event_mutex);
1337 if (data->cb_info == NULL) {
1338 /* tried to remove before at _player_remove_idle_event */
1339 LOGW("cb_info is NULL. event %d", data->int_data);
1343 /* remove event from list */
1344 g_mutex_lock(&data->cb_info->event_queue.idle_ev_mutex);
1345 if (data->cb_info->event_queue.idle_ev_list) {
1346 /* LOGD("remove idle event %p, %p", data, data->cb_info->event_queue.idle_ev_list); */
1347 data->cb_info->event_queue.idle_ev_list = g_list_remove(data->cb_info->event_queue.idle_ev_list, (gpointer)data);
1349 g_mutex_unlock(&data->cb_info->event_queue.idle_ev_mutex);
1351 if ((data->cb_info->user_cb[ev] || ev == MUSE_PLAYER_EVENT_TYPE_SERVICE_DISCONNECTED) &&
1352 (_user_callbacks[ev]))
1353 _user_callbacks[ev](data->cb_info, data->recv_data);
1355 LOGW("user callback is unset. type : %d", ev);
1358 /* unlock and release event */
1359 g_mutex_unlock(&data->event_mutex);
1360 g_mutex_clear(&data->event_mutex);
1361 if (data->recv_data) {
1362 g_free(data->recv_data->buffer);
1363 data->recv_data->buffer = NULL;
1364 g_free(data->recv_data);
1365 data->recv_data = NULL;
1369 return FALSE; /* remove from the event list */
1372 static bool _player_need_sync_context(int event_id)
1374 if ((event_id == MUSE_PLAYER_EVENT_TYPE_INTERRUPT) ||
1375 (event_id == MUSE_PLAYER_EVENT_TYPE_BUFFERING) ||
1376 (event_id == MUSE_PLAYER_EVENT_TYPE_COMPLETE) ||
1377 (event_id == MUSE_PLAYER_EVENT_TYPE_ERROR) ||
1378 (event_id == MUSE_PLAYER_EVENT_TYPE_SERVICE_DISCONNECTED) ||
1379 (event_id == MUSE_PLAYER_EVENT_TYPE_PREPARE)) {
1380 LOGD("%d callback will be issued in the mainloop.", event_id);
1387 static void *_player_event_queue_loop(void *param)
1390 LOGE("NULL parameter");
1393 callback_cb_info_s *cb_info = param;
1394 player_event_queue *ev = &cb_info->event_queue;
1395 _player_cb_data *event_data = NULL;
1397 g_mutex_lock(&ev->mutex);
1398 while (ev->running) {
1399 g_mutex_lock(&ev->qlock);
1400 if (g_queue_is_empty(ev->queue)) {
1401 g_mutex_unlock(&ev->qlock);
1402 g_cond_wait(&ev->cond, &ev->mutex);
1406 g_mutex_unlock(&ev->qlock);
1409 g_mutex_lock(&ev->qlock);
1410 event_data = (_player_cb_data *)g_queue_pop_head(ev->queue);
1411 g_mutex_unlock(&ev->qlock);
1413 muse_player_event_e event_type = event_data->int_data;
1415 if (event_type == MUSE_PLAYER_EVENT_TYPE_SEEK) {
1416 g_mutex_lock(&cb_info->seek_cb_mutex);
1417 if (cb_info->seek_cb_state == PLAYER_SEEK_CB_STATE_WAIT) {
1418 /* push event into queue again. */
1419 _player_event_queue_add(ev, event_data);
1420 g_mutex_unlock(&cb_info->seek_cb_mutex);
1423 g_mutex_unlock(&cb_info->seek_cb_mutex);
1424 } else if (event_type == MUSE_PLAYER_EVENT_TYPE_BUFFERING) {
1425 g_mutex_lock(&cb_info->buffering_cb_mutex);
1426 if (cb_info->drop_buffering_message) {
1427 LOGD("Drop buffering event");
1428 g_mutex_unlock(&cb_info->buffering_cb_mutex);
1431 g_mutex_unlock(&cb_info->buffering_cb_mutex);
1434 if (_player_need_sync_context(event_type)) {
1435 if ((cb_info->user_cb[event_type] || (event_type == MUSE_PLAYER_EVENT_TYPE_SERVICE_DISCONNECTED)) &&
1436 _user_callbacks[event_type]) {
1437 g_mutex_lock(&ev->idle_ev_mutex);
1438 ev->idle_ev_list = g_list_append(ev->idle_ev_list, (gpointer)event_data);
1439 g_mutex_unlock(&ev->idle_ev_mutex);
1441 LOGD("add ev %d to main loop", event_type);
1443 g_idle_add_full(G_PRIORITY_DEFAULT,
1444 (GSourceFunc)_player_event_job_function,
1445 (gpointer)event_data,
1448 LOGW("there is no registered cb for ev:%d", event_type);
1449 if (event_data->recv_data) {
1450 g_free(event_data->recv_data->buffer);
1451 g_free(event_data->recv_data);
1456 _player_event_job_function(event_data);
1463 g_mutex_unlock(&ev->mutex);
1464 LOGI("Exit event loop");
1468 static gboolean _player_event_queue_new(callback_cb_info_s *cb_info)
1470 g_return_val_if_fail(cb_info, FALSE);
1471 player_event_queue *ev = &cb_info->event_queue;
1473 ev->queue = g_queue_new();
1474 g_return_val_if_fail(ev->queue, FALSE);
1475 g_mutex_init(&ev->qlock);
1477 g_mutex_init(&ev->mutex);
1478 g_cond_init(&ev->cond);
1481 g_mutex_init(&ev->idle_ev_mutex);
1483 ev->thread = g_thread_new("cb_event_thread", _player_event_queue_loop, (gpointer)cb_info);
1484 g_return_val_if_fail(ev->thread, FALSE);
1485 LOGI("event queue thread %p", ev->thread);
1491 static void _player_remove_idle_event(callback_cb_info_s *cb_info, muse_player_event_e event_type, bool remove_all)
1493 g_return_if_fail(cb_info);
1494 player_event_queue *ev = &cb_info->event_queue;
1495 _player_cb_data *event_data = NULL;
1498 g_mutex_lock(&ev->idle_ev_mutex);
1500 if (ev->idle_ev_list == NULL) {
1501 LOGD("No idle event is remained.");
1502 g_mutex_unlock(&ev->idle_ev_mutex);
1506 LOGD("remove idle event[%d] or all[%d]", event_type, remove_all);
1508 list = ev->idle_ev_list;
1510 event_data = list->data;
1511 list = g_list_next(list);
1514 LOGW("Fail to remove idle event. The data is NULL");
1518 if (g_mutex_trylock(&event_data->event_mutex)) {
1520 gboolean ret = FALSE;
1521 if (remove_all || (event_data->int_data == event_type)) {
1522 GSource *source = NULL;
1523 gboolean check_in_call = FALSE;
1525 LOGD("remove idle event [%p:%d]", event_data, event_data->int_data);
1526 source = g_main_context_find_source_by_user_data (
1527 g_main_context_default (), event_data);
1529 check_in_call = source->flags & G_HOOK_FLAG_IN_CALL;
1531 ret = g_idle_remove_by_data(event_data);
1532 if (!ret || check_in_call) {
1533 /* will be handled at _player_event_job_function() as an exception */
1534 event_data->cb_info = NULL;
1535 LOGW("failed to remove, idle callback will be called later");
1538 /* set cb to null */
1540 set_null_user_cb(cb_info, event_data->int_data);
1542 ev->idle_ev_list = g_list_remove(ev->idle_ev_list, (gpointer)event_data);
1544 g_mutex_unlock(&event_data->event_mutex);
1546 if (ret && !check_in_call) {
1547 g_mutex_clear(&event_data->event_mutex);
1548 if (event_data->recv_data) {
1549 g_free(event_data->recv_data->buffer);
1550 event_data->recv_data->buffer = NULL;
1551 g_free(event_data->recv_data);
1552 event_data->recv_data = NULL;
1556 LOGD("remove idle event done");
1557 } /* else : will be handled if the cb is called. */
1559 g_mutex_unlock(&event_data->event_mutex);
1562 LOGW("event(%d) lock failed. it's being called...", event_data->int_data);
1565 /* continue: keep checking next event_data */
1569 g_list_free(ev->idle_ev_list);
1570 ev->idle_ev_list = NULL;
1573 g_mutex_unlock(&ev->idle_ev_mutex);
1579 static void _player_event_queue_destroy(callback_cb_info_s *cb_info)
1581 g_return_if_fail(cb_info);
1582 player_event_queue *ev = &cb_info->event_queue;
1583 _player_cb_data *event_data;
1585 LOGI("event queue thread %p", ev->thread);
1587 g_mutex_lock(&ev->mutex);
1588 ev->running = FALSE;
1589 g_cond_broadcast(&ev->cond);
1590 g_mutex_unlock(&ev->mutex);
1592 g_thread_join(ev->thread);
1595 while (!g_queue_is_empty(ev->queue)) {
1596 event_data = (_player_cb_data *)g_queue_pop_head(ev->queue);
1598 g_free(event_data->recv_data->buffer);
1599 g_free(event_data->recv_data);
1603 g_queue_free(ev->queue);
1604 g_mutex_clear(&ev->qlock);
1605 g_mutex_clear(&ev->mutex);
1606 g_cond_clear(&ev->cond);
1607 g_mutex_clear(&ev->idle_ev_mutex);
1610 static void _player_event_queue_remove(player_event_queue *ev_queue, int ev)
1614 g_mutex_lock(&ev_queue->qlock);
1616 item = g_queue_peek_head_link(ev_queue->queue);
1618 GList *next = item->next;
1619 _player_cb_data *cb_data = (_player_cb_data *)item->data;
1621 if (cb_data && cb_data->int_data == ev) {
1622 LOGD("removing '%p (ev:%d)' from event queue", cb_data, cb_data->int_data);
1623 g_free(cb_data->recv_data->buffer);
1624 g_free(cb_data->recv_data);
1627 g_queue_delete_link(ev_queue->queue, item);
1631 g_mutex_unlock(&ev_queue->qlock);
1634 static void _player_event_queue_add(player_event_queue *ev, _player_cb_data *data)
1637 g_mutex_lock(&ev->qlock);
1638 g_queue_push_tail(ev->queue, (gpointer)data);
1639 g_mutex_unlock(&ev->qlock);
1640 g_cond_signal(&ev->cond);
1644 static bool _user_callback_handler(callback_cb_info_s *cb_info, muse_player_event_e event, _player_recv_data *recv_data)
1646 /* LOGD("get event %d", event); */
1648 if (event < MUSE_PLAYER_EVENT_TYPE_NUM) {
1649 if (cb_info->user_cb[event] && _user_callbacks[event]) {
1650 _player_cb_data *data = NULL;
1651 data = g_new(_player_cb_data, 1);
1653 LOGE("fail to alloc mem");
1656 data->int_data = (int)event;
1657 data->cb_info = cb_info;
1658 data->recv_data = recv_data;
1659 g_mutex_init(&data->event_mutex);
1660 _player_event_queue_add(&cb_info->event_queue, data);
1666 LOGE("failed to add event to queue %d", event);
1670 static void _add_ret_msg(muse_player_api_e api, callback_cb_info_s *cb_info, int offset, int parse_len)
1672 ret_msg_s *msg = NULL;
1673 ret_msg_s *last = cb_info->buff.retMsgHead;
1675 msg = g_new(ret_msg_s, 1);
1678 msg->msg = g_strndup(cb_info->buff.recvMsg + offset, parse_len);
1681 cb_info->buff.retMsgHead = msg;
1688 LOGE("g_new failure");
1691 static ret_msg_s *_get_ret_msg(muse_player_api_e api, callback_cb_info_s *cb_info)
1693 ret_msg_s *msg = cb_info->buff.retMsgHead;
1694 ret_msg_s *prev = NULL;
1696 if (msg->api == api) {
1698 cb_info->buff.retMsgHead = msg->next;
1700 prev->next = msg->next;
1709 static void _remove_all_ret_msg(callback_cb_info_s *cb_info)
1711 ret_msg_s *msg = cb_info->buff.retMsgHead;
1712 ret_msg_s *prev = NULL;
1716 LOGI("Remove %s", prev->msg);
1723 static void _notify_disconnected(callback_cb_info_s *cb_info)
1725 muse_player_event_e event = MUSE_PLAYER_EVENT_TYPE_SERVICE_DISCONNECTED;
1726 if (!cb_info || !cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])
1729 if (_user_callbacks[event]) {
1730 _player_cb_data *data = NULL;
1731 data = g_new(_player_cb_data, 1);
1733 LOGE("fail to alloc mem");
1736 data->int_data = (int)event;
1737 data->cb_info = cb_info;
1738 data->recv_data = NULL;
1739 g_mutex_init(&data->event_mutex);
1740 _player_event_queue_add(&cb_info->event_queue, data);
1744 static void *client_cb_handler(gpointer data)
1750 callback_cb_info_s *cb_info = data;
1751 char *recvMsg = NULL;
1752 muse_core_msg_parse_err_e err;
1753 tbm_fd tfd[MUSE_NUM_FD];
1755 while (g_atomic_int_get(&cb_info->running)) {
1757 err = MUSE_MSG_PARSE_ERROR_NONE;
1759 len = player_recv_msg(cb_info, tfd);
1763 recvMsg = cb_info->buff.recvMsg;
1764 recvMsg[len] = '\0';
1768 while (offset < len) {
1769 api = MUSE_PLAYER_API_MAX;
1770 // LOGD(">>>>>> [%d/%d] %p, %s", offset, len, recvMsg + offset, recvMsg + offset);
1771 // usleep(10 * 1000);
1773 void *jobj = muse_core_msg_object_new(recvMsg + offset, &parse_len, &err);
1775 if (muse_core_msg_object_get_value("api", jobj, MUSE_TYPE_INT, &api)) {
1776 if (api < MUSE_PLAYER_API_MAX) {
1777 g_mutex_lock(&cb_info->player_mutex);
1778 cb_info->buff.recved++;
1779 _add_ret_msg(api, cb_info, offset, parse_len);
1780 if (api == MUSE_PLAYER_API_GET_ALBUM_ART && tfd[0] != INVALID_DEFAULT_VALUE) {
1781 LOGD("get tbm fd for album art.");
1782 cb_info->tfd = tfd[0];
1784 g_cond_signal(&cb_info->player_cond[api]);
1785 g_mutex_unlock(&cb_info->player_mutex);
1786 if (api == MUSE_PLAYER_API_DESTROY)
1787 g_atomic_int_set(&cb_info->running, 0);
1788 } else if (api == MUSE_PLAYER_CB_EVENT) {
1790 _player_recv_data *recv_data = NULL;
1791 g_mutex_lock(&cb_info->player_mutex);
1792 recv_data = g_new0(_player_recv_data, 1);
1793 if (recv_data != NULL) {
1794 memcpy(recv_data->tfd, tfd, sizeof(recv_data->tfd));
1795 recv_data->buffer = g_strndup(recvMsg + offset, parse_len);
1797 LOGE("failed to alloc recv_data.");
1798 g_mutex_unlock(&cb_info->player_mutex);
1799 muse_core_msg_object_free(jobj);
1802 g_mutex_unlock(&cb_info->player_mutex);
1803 if (!muse_core_msg_object_get_value("event", jobj, MUSE_TYPE_INT, &event) ||
1804 !_user_callback_handler(cb_info, event, recv_data)) {
1805 LOGE("failed to get value or add event to the queue.");
1807 g_free(recv_data->buffer);
1811 } else if (api == MUSE_PLAYER_CB_CREATE_ACK) {
1812 g_mutex_lock(&cb_info->player_mutex);
1813 cb_info->buff.recved++;
1814 g_cond_signal(&cb_info->server_ack_cond);
1815 g_mutex_unlock(&cb_info->player_mutex);
1818 LOGE("Failed to get value. offset:%d/%d, [msg][ %s ]", offset, len, (recvMsg + offset));
1820 muse_core_msg_object_free(jobj);
1822 LOGE("Failed to get msg obj. err:%d", err);
1825 if (parse_len == 0 || err != MUSE_MSG_PARSE_ERROR_NONE)
1828 offset += parse_len;
1829 parse_len = len - offset;
1832 if (g_atomic_int_get(&cb_info->running))
1833 _notify_disconnected(cb_info);
1835 g_atomic_int_set(&cb_info->running, 0);
1836 LOGD("client cb exit");
1841 static callback_cb_info_s *callback_new(gint sockfd)
1843 callback_cb_info_s *cb_info;
1847 g_return_val_if_fail(sockfd > 0, NULL);
1849 cb_info = g_new(callback_cb_info_s, 1);
1852 memset(cb_info, 0, sizeof(callback_cb_info_s));
1854 g_mutex_init(&cb_info->player_mutex);
1855 for (i = 0; i < MUSE_PLAYER_API_MAX; i++)
1856 g_cond_init(&cb_info->player_cond[i]);
1857 g_cond_init(&cb_info->server_ack_cond);
1859 g_mutex_init(&cb_info->data_mutex);
1860 g_mutex_init(&cb_info->seek_cb_mutex);
1861 g_mutex_init(&cb_info->buffering_cb_mutex);
1862 cb_info->drop_buffering_message = FALSE;
1864 buff = &cb_info->buff;
1865 buff->recvMsg = g_new(char, MUSE_MSG_MAX_LENGTH + 1);
1866 buff->bufLen = MUSE_MSG_MAX_LENGTH + 1;
1868 buff->retMsgHead = NULL;
1869 buff->part_of_msg = NULL;
1871 g_atomic_int_set(&cb_info->running, 1);
1872 cb_info->fd = sockfd;
1873 cb_info->tfd = INVALID_DEFAULT_VALUE;
1874 cb_info->data_fd = INVALID_DEFAULT_VALUE;
1875 cb_info->thread = g_thread_new("callback_thread", client_cb_handler, (gpointer) cb_info);
1880 static void callback_destroy(callback_cb_info_s *cb_info)
1883 g_return_if_fail(cb_info);
1885 if (cb_info->fd > INVALID_DEFAULT_VALUE)
1886 muse_client_close(cb_info->fd);
1887 if (cb_info->data_fd > INVALID_DEFAULT_VALUE)
1888 muse_client_close(cb_info->data_fd);
1890 cb_info->fd = cb_info->data_fd = INVALID_DEFAULT_VALUE;
1892 g_thread_join(cb_info->thread);
1893 cb_info->thread = NULL;
1895 LOGI("%p Callback destroyed", cb_info);
1897 for (i = 0; i < MUSE_PLAYER_API_MAX; i++) {
1898 g_mutex_lock(&cb_info->player_mutex);
1899 g_cond_signal(&cb_info->player_cond[i]);
1900 g_mutex_unlock(&cb_info->player_mutex);
1901 g_cond_clear(&cb_info->player_cond[i]);
1904 /* to make sure the return of other pending api */
1906 g_mutex_lock(&cb_info->player_mutex);
1907 g_mutex_unlock(&cb_info->player_mutex);
1908 g_mutex_clear(&cb_info->player_mutex);
1910 g_cond_clear(&cb_info->server_ack_cond);
1912 g_mutex_clear(&cb_info->data_mutex);
1913 g_mutex_clear(&cb_info->seek_cb_mutex);
1914 g_mutex_clear(&cb_info->buffering_cb_mutex);
1916 g_free(cb_info->buff.recvMsg);
1917 _remove_all_ret_msg(cb_info);
1918 g_free(cb_info->buff.part_of_msg);
1923 int client_get_api_timeout(player_cli_s *pc, muse_player_api_e api)
1928 case MUSE_PLAYER_API_PREPARE:
1929 case MUSE_PLAYER_API_PREPARE_ASYNC:
1930 case MUSE_PLAYER_API_UNPREPARE:
1931 case MUSE_PLAYER_API_START:
1932 case MUSE_PLAYER_API_STOP:
1933 case MUSE_PLAYER_API_PAUSE:
1934 timeout += SERVER_TIMEOUT(pc);
1937 /* check prepare async is done */
1938 if (pc && CALLBACK_INFO(pc) && CALLBACK_INFO(pc)->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE])
1939 timeout += SERVER_TIMEOUT(pc);
1942 timeout += CALLBACK_TIME_OUT;
1943 return timeout; /* ms */
1946 int client_wait_for_cb_return(muse_player_api_e api, callback_cb_info_s *cb_info, char **ret_buf, int time_out)
1948 int ret = PLAYER_ERROR_NONE;
1949 gint64 end_time = g_get_monotonic_time() + time_out * G_TIME_SPAN_MILLISECOND;
1950 msg_buff_s *buff = &cb_info->buff;
1951 ret_msg_s *msg = NULL;
1953 g_mutex_lock(&cb_info->player_mutex);
1955 msg = _get_ret_msg(api, cb_info);
1957 if (!buff->recved || !msg) {
1958 if (!g_cond_wait_until(&cb_info->player_cond[api], &cb_info->player_mutex, end_time)) {
1959 LOGW("api %d return msg does not received %dms", api, time_out);
1960 ret = PLAYER_ERROR_INVALID_OPERATION;
1966 msg = _get_ret_msg(api, cb_info);
1968 *ret_buf = msg->msg;
1971 if (!player_msg_get(ret, *ret_buf))
1972 ret = PLAYER_ERROR_INVALID_OPERATION;
1973 else if (ret != PLAYER_ERROR_NONE)
1974 LOGE("Get error return from server 0x%X", ret);
1978 if (!g_atomic_int_get(&cb_info->running)) {
1979 LOGE("callback thread is stopped. %d api did not get return in time", api);
1980 ret = PLAYER_ERROR_INVALID_OPERATION;
1983 LOGW("api %d is the spurious wakeup, wait again", api);
1985 } while (!msg && g_atomic_int_get(&cb_info->running));
1987 g_mutex_unlock(&cb_info->player_mutex);
1991 int client_wait_for_server_ack(muse_player_api_e api, callback_cb_info_s *cb_info, int time_out)
1993 int ret = PLAYER_ERROR_NONE;
1994 gint64 end_time = g_get_monotonic_time() + time_out * G_TIME_SPAN_MILLISECOND;
1995 msg_buff_s *buff = &cb_info->buff;
1997 g_mutex_lock(&cb_info->player_mutex);
1999 if (!buff->recved) {
2000 if (!g_cond_wait_until(&cb_info->server_ack_cond, &cb_info->player_mutex, end_time)) {
2001 LOGW("server ack msg does not received %dms", time_out);
2003 ret = PLAYER_ERROR_INVALID_OPERATION;
2005 LOGD("Another msg is received, continue create handle");
2006 g_mutex_unlock(&cb_info->player_mutex);
2012 g_mutex_unlock(&cb_info->player_mutex);
2019 * Public Implementation
2022 int player_create(player_h *player)
2024 int ret = PLAYER_ERROR_NONE;
2025 int sock_fd = INVALID_DEFAULT_VALUE;
2028 muse_player_api_e api = MUSE_PLAYER_API_CREATE;
2029 int module_index = INVALID_DEFAULT_VALUE;
2030 player_cli_s *pc = NULL;
2031 gchar *ret_buf = NULL;
2032 int retry_count = CONNECTION_RETRY;
2034 PLAYER_INSTANCE_CHECK(player);
2038 pc = g_new0(player_cli_s, 1);
2040 return PLAYER_ERROR_OUT_OF_MEMORY;
2042 while (retry_count--) {
2043 ret = PLAYER_ERROR_NONE;
2044 sock_fd = muse_client_new();
2045 if (sock_fd <= INVALID_DEFAULT_VALUE) {
2046 LOGE("connection failure %d", errno);
2047 ret = PLAYER_ERROR_INVALID_OPERATION;
2048 usleep(CONNECTION_TIME_OUT * G_TIME_SPAN_MILLISECOND);
2052 if (muse_client_get_module_index(MODULE_NAME, &module_index) != MM_ERROR_NONE) {
2053 LOGE("muse client get module index failed");
2054 ret = PLAYER_ERROR_INVALID_OPERATION;
2058 PLAYER_SEND_MSG_ASYNC(api, sock_fd, ret,
2059 MUSE_TYPE_INT, "module", module_index,
2060 MUSE_TYPE_INT, "pid", pid);
2061 if (ret == PLAYER_ERROR_INVALID_OPERATION)
2064 pc->cb_info = callback_new(sock_fd);
2066 LOGE("fail to create callback");
2067 ret = PLAYER_ERROR_INVALID_OPERATION;
2071 ret = client_wait_for_server_ack(api, pc->cb_info, CREATE_CB_TIME_OUT);
2072 if (ret == PLAYER_ERROR_INVALID_OPERATION)
2075 if (!_player_event_queue_new(pc->cb_info)) {
2076 LOGE("fail to create event queue");
2077 ret = PLAYER_ERROR_INVALID_OPERATION;
2081 ret = client_wait_for_cb_return(api, pc->cb_info, &ret_buf, CALLBACK_TIME_OUT * 2);
2082 if (ret == PLAYER_ERROR_NONE) {
2083 intptr_t module_addr = 0;
2084 *player = (player_h)pc;
2085 if (player_msg_get_type(module_addr, ret_buf, POINTER)) {
2086 pc->cb_info->data_fd = muse_client_new_data_ch();
2087 if ((pc->cb_info->data_fd < 0) || (!muse_core_fd_is_valid(pc->cb_info->data_fd))) {
2088 LOGE("Failed to get data_fd");
2089 ret = PLAYER_ERROR_INVALID_OPERATION;
2093 /* share the module addr info to the data_fd */
2094 PLAYER_SEND_MSG_ASYNC(MUSE_PLAYER_API_CREATE, pc->cb_info->data_fd, ret,
2095 MUSE_TYPE_POINTER, "module_addr", module_addr);
2096 if (ret != PLAYER_ERROR_NONE) {
2097 LOGE("Failed to send module address to the data fd");
2100 LOGD("Data channel fd %d, muse module addr %"PRIxPTR, pc->cb_info->data_fd, module_addr);
2102 ret = PLAYER_ERROR_INVALID_OPERATION;
2105 SERVER_TIMEOUT(pc) = MAX_SERVER_TIME_OUT; /* will be update after prepare phase. */
2110 pc->cb_info->bufmgr = tbm_bufmgr_init(-1);
2111 pc->push_media_stream = FALSE;
2113 /* get display interface handle */
2114 if (mm_display_interface_init(&DP_INTERFACE(pc)) != MM_ERROR_NONE)
2115 LOGW("display interface init failed");
2119 LOGD("LEAVE 0x%X", ret);
2125 if (pc && pc->cb_info) {
2126 if (pc->cb_info->event_queue.running)
2127 _player_event_queue_destroy(pc->cb_info);
2128 callback_destroy(pc->cb_info);
2130 } else if (sock_fd > INVALID_DEFAULT_VALUE) {
2131 muse_client_close(sock_fd);
2133 sock_fd = INVALID_DEFAULT_VALUE;
2137 LOGE("ret value : %d, retry #%d", ret, CONNECTION_RETRY - retry_count);
2143 LOGD("LEAVE 0x%X", ret);
2147 int player_destroy(player_h player)
2149 int ret = PLAYER_ERROR_NONE;
2150 muse_player_api_e api = MUSE_PLAYER_API_DESTROY;
2151 player_cli_s *pc = (player_cli_s *)player;
2152 char *ret_buf = NULL;
2153 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
2155 PLAYER_INSTANCE_CHECK(player);
2157 LOGD("ENTER %p", pc);
2159 /* clear cb and release mem */
2160 set_null_user_cb_lock(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_SEEK);
2161 set_null_user_cb_lock(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_PREPARE);
2162 _player_release_internal_memory(pc, true);
2164 if (DP_INTERFACE(pc)) {
2165 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
2167 if (display_type == MM_DISPLAY_TYPE_EVAS) {
2168 player_unset_media_packet_video_frame_decoded_cb(player);
2169 __player_unset_retrieve_buffer_cb(player);
2172 mm_display_interface_deinit(DP_INTERFACE(pc));
2173 DP_INTERFACE(pc) = NULL;
2176 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2178 if (CALLBACK_INFO(pc)) {
2179 __player_remove_tsurf_list(pc);
2180 _player_remove_idle_event(CALLBACK_INFO(pc), MUSE_PLAYER_EVENT_TYPE_NUM, true);
2181 _player_event_queue_destroy(CALLBACK_INFO(pc));
2182 tbm_bufmgr_deinit(TBM_BUFMGR(pc));
2184 callback_destroy(CALLBACK_INFO(pc));
2192 LOGD("LEAVE 0x%X", ret);
2196 int player_prepare_async(player_h player, player_prepared_cb callback, void *user_data)
2198 int ret = PLAYER_ERROR_NONE;
2199 muse_player_api_e api = MUSE_PLAYER_API_PREPARE_ASYNC;
2200 player_cli_s *pc = (player_cli_s *)player;
2201 char *ret_buf = NULL;
2203 PLAYER_INSTANCE_CHECK(player);
2205 LOGD("ENTER %p %p", pc, callback);
2207 if (pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
2208 LOGE("PLAYER_ERROR_INVALID_OPERATION (0x%08x) : preparing...", PLAYER_ERROR_INVALID_OPERATION);
2209 return PLAYER_ERROR_INVALID_OPERATION;
2211 pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = callback;
2212 pc->cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = user_data;
2214 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2215 if (ret == PLAYER_ERROR_NONE) {
2217 player_msg_get_type(timeout, ret_buf, INT);
2219 LOGD("server timeout will be %d sec", timeout);
2220 SERVER_TIMEOUT(pc) = timeout * G_TIME_SPAN_MILLISECOND;
2222 LOGW("failed to realize, so prepare cb will be released soon");
2223 if (pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE])
2224 set_null_user_cb(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_PREPARE);
2231 int player_prepare(player_h player)
2233 int ret = PLAYER_ERROR_NONE;
2234 muse_player_api_e api = MUSE_PLAYER_API_PREPARE;
2235 player_cli_s *pc = (player_cli_s *)player;
2236 char *ret_buf = NULL;
2238 PLAYER_INSTANCE_CHECK(player);
2240 LOGD("ENTER %p", pc);
2242 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2243 if (ret == PLAYER_ERROR_NONE) {
2245 player_msg_get_type(timeout, ret_buf, INT);
2247 LOGD("server timeout will be %d sec", timeout);
2248 SERVER_TIMEOUT(pc) = timeout * G_TIME_SPAN_MILLISECOND;
2253 LOGD("LEAVE 0x%X", ret);
2257 int player_unprepare(player_h player)
2259 int ret = PLAYER_ERROR_NONE;
2260 int mm_ret = MM_ERROR_NONE;
2261 muse_player_api_e api = MUSE_PLAYER_API_UNPREPARE;
2262 player_cli_s *pc = (player_cli_s *)player;
2263 char *ret_buf = NULL;
2264 player_state_e state = PLAYER_STATE_NONE;
2265 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
2267 PLAYER_INSTANCE_CHECK(player);
2269 LOGD("ENTER %p", pc);
2271 if (_get_current_state(pc, &state) != PLAYER_ERROR_NONE) {
2272 LOGE("Failed to get state");
2273 ret = PLAYER_ERROR_INVALID_OPERATION;
2277 if (state < PLAYER_STATE_READY) {
2278 if ((!CALLBACK_INFO(pc)) || (!CALLBACK_INFO(pc)->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE])) {
2279 LOGE("Invalid state %d", state);
2280 ret = PLAYER_ERROR_INVALID_STATE;
2285 set_null_user_cb_lock(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_SEEK);
2286 set_null_user_cb_lock(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_PREPARE);
2288 if (!DP_INTERFACE(pc))
2289 goto _PLAYER_UNPREPARE;
2292 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
2294 if (display_type != MM_DISPLAY_TYPE_EVAS)
2295 goto _PLAYER_UNPREPARE;
2297 if (CALLBACK_INFO(pc)->dp_info.visible != PLAYER_VISIBLE_INFO_FALSE) {
2298 mm_ret = mm_display_interface_evas_set_visible(DP_INTERFACE(pc), false);
2299 if (mm_ret != MM_ERROR_NONE) {
2300 LOGE("mm_display_interface_evas_set_visible failed 0x%x", mm_ret);
2301 return PLAYER_ERROR_INVALID_OPERATION;
2305 mm_ret = mm_display_interface_evas_flush(DP_INTERFACE(pc), false);
2306 if (mm_ret != MM_ERROR_NONE) {
2307 LOGE("mm_display_interface_evas_flush failed 0x%x", mm_ret);
2308 return PLAYER_ERROR_INVALID_OPERATION;
2312 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2314 _player_release_internal_memory(pc, false);
2315 pc->cb_info->video_frame_pool_size = 0;
2316 __player_remove_tsurf_list(pc);
2321 LOGD("LEAVE 0x%X", ret);
2325 /* 1. correct the protocol prefix to lower case
2326 * 2. remove 'file://' prefix
2327 * 3. covert '/opt/usr/media/xxx' file path to '/opt/usr/home/owner/media/xxx' */
2328 int _player_get_valid_path(const char *uri, char *valid_path)
2330 gchar *file_path = NULL;
2332 gchar *colon = NULL;
2334 if (!uri || !valid_path) {
2335 LOGD("invalid parameter");
2336 return PLAYER_ERROR_INVALID_PARAMETER;
2339 if ((colon = strstr(uri, "://")) != NULL) {
2340 gchar *protocol = g_ascii_strdown(uri, colon - uri);
2344 file_path = g_strconcat(protocol, uri + strlen(protocol), NULL);
2345 strncpy(valid_path, (file_path) ? (file_path) : (uri), MAX_URL_LEN - 1);
2351 if (strstr(valid_path, "file://")) { /* handle the 'file://' prefix */
2353 file_path = g_filename_from_uri(valid_path, NULL, &err);
2354 if (!file_path || (err != NULL)) {
2355 SECURE_LOGE("Invalid URI '%s', err: %s", uri,
2356 (err != NULL) ? err->message : "unknown error");
2361 return PLAYER_ERROR_INVALID_PARAMETER;
2363 LOGD("get file path from uri");
2365 LOGD("use the original path.");
2366 return PLAYER_ERROR_NONE;
2371 if (storage_get_origin_internal_path((file_path) ? (file_path) : (uri), MAX_URL_LEN, valid_path) < 0) {
2372 /* cannot convert path. use the original one. */
2373 strncpy(valid_path, (file_path) ? (file_path) : (uri), MAX_URL_LEN - 1);
2375 /* need to use converted path. */
2376 SECURE_LOGD("Converted path : %s -> %s", uri, valid_path);
2381 return PLAYER_ERROR_NONE;
2384 int player_set_uri(player_h player, const char *uri)
2386 int ret = PLAYER_ERROR_NONE;
2387 muse_player_api_e api = MUSE_PLAYER_API_SET_URI;
2388 player_cli_s *pc = (player_cli_s *)player;
2389 char *ret_buf = NULL;
2390 char path[MAX_URL_LEN] = {0, };
2392 PLAYER_INSTANCE_CHECK(player);
2393 PLAYER_NULL_ARG_CHECK(uri);
2397 if (_player_get_valid_path(uri, path) != PLAYER_ERROR_NONE)
2398 return PLAYER_ERROR_INVALID_PARAMETER;
2400 SECURE_LOGD("new path : %s", path);
2402 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_STRING, "path", (const char *)path);
2403 pc->push_media_stream = FALSE;
2409 int player_set_memory_buffer(player_h player, const void *data, int size)
2411 int ret = PLAYER_ERROR_NONE;
2412 muse_player_api_e api = MUSE_PLAYER_API_SET_MEMORY_BUFFER;
2413 player_cli_s *pc = (player_cli_s *)player;
2414 char *ret_buf = NULL;
2416 tbm_bo_handle thandle;
2417 tbm_fd tfd = INVALID_DEFAULT_VALUE;
2419 PLAYER_INSTANCE_CHECK(player);
2420 PLAYER_NULL_ARG_CHECK(data);
2424 /* before setting mem buffer, player state have to be checked. */
2425 PLAYER_STATE_CHECK(pc, PLAYER_STATE_IDLE);
2427 if (SERVER_TBM_BO(pc)) {
2428 LOGW("The previous memory buffer will be cleared.");
2429 _player_deinit_memory_buffer(pc);
2432 bo = tbm_bo_alloc(pc->cb_info->bufmgr, size, TBM_BO_DEFAULT);
2434 LOGE("TBM get error : bo is NULL");
2435 return PLAYER_ERROR_INVALID_OPERATION;
2437 thandle = tbm_bo_map(bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE);
2438 if (thandle.ptr == NULL) {
2439 LOGE("TBM get error : handle pointer is NULL");
2440 ret = PLAYER_ERROR_INVALID_OPERATION;
2443 memcpy(thandle.ptr, data, size);
2446 tfd = tbm_bo_export_fd(bo);
2448 LOGE("tbm_bo_export_fd err 0x%x", tfd);
2449 ret = PLAYER_ERROR_INVALID_OPERATION;
2453 PLAYER_SEND_MSG_WITH_TFD(api, pc, tfd, ret_buf, ret, MUSE_TYPE_INT, "size", size);
2454 pc->push_media_stream = FALSE;
2457 PLAYER_CLOSE_FD(tfd);
2461 if (ret == PLAYER_ERROR_NONE) {
2462 intptr_t bo_addr = 0;
2463 if (player_msg_get_type(bo_addr, ret_buf, POINTER))
2464 SERVER_TBM_BO(pc) = (intptr_t) bo_addr;
2471 static void _player_release_internal_memory(player_cli_s *pc, bool deinit_server_mem)
2478 if (deinit_server_mem)
2479 _player_deinit_memory_buffer(pc);
2482 static int _player_deinit_memory_buffer(player_cli_s *pc)
2484 PLAYER_INSTANCE_CHECK(pc);
2485 int ret = PLAYER_ERROR_NONE;
2486 muse_player_api_e api = MUSE_PLAYER_API_DEINIT_MEMORY_BUFFER;
2487 intptr_t bo_addr = SERVER_TBM_BO(pc);
2489 if (!bo_addr || !CALLBACK_INFO(pc))
2492 PLAYER_SEND_MSG_ASYNC(api, MSG_FD(pc), ret, MUSE_TYPE_POINTER, "bo_addr", bo_addr);
2493 SERVER_TBM_BO(pc) = 0;
2498 int player_get_state(player_h player, player_state_e *pstate)
2500 int ret = PLAYER_ERROR_NONE;
2501 player_cli_s *pc = (player_cli_s *)player;
2503 PLAYER_INSTANCE_CHECK(player);
2504 PLAYER_NULL_ARG_CHECK(pstate);
2508 ret = _get_current_state(pc, pstate);
2512 int player_set_volume(player_h player, float left, float right)
2514 int ret = PLAYER_ERROR_NONE;
2515 muse_player_api_e api = MUSE_PLAYER_API_SET_VOLUME;
2516 player_cli_s *pc = (player_cli_s *)player;
2517 char *ret_buf = NULL;
2519 PLAYER_INSTANCE_CHECK(player);
2520 PLAYER_RANGE_ARG_CHECK(left, 0, 1.0);
2521 PLAYER_RANGE_ARG_CHECK(right, 0, 1.0);
2523 /* not support to set different value into each channel */
2524 PLAYER_CHECK_CONDITION(left == right, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
2526 LOGD("ENTER %f", left);
2528 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
2529 MUSE_TYPE_DOUBLE, "volume", (double)left);
2535 int player_get_volume(player_h player, float *left, float *right)
2537 int ret = PLAYER_ERROR_NONE;
2538 muse_player_api_e api = MUSE_PLAYER_API_GET_VOLUME;
2539 player_cli_s *pc = (player_cli_s *)player;
2540 double volume = 0.0;
2541 char *ret_buf = NULL;
2543 PLAYER_INSTANCE_CHECK(player);
2544 PLAYER_NULL_ARG_CHECK(left && right);
2548 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2550 if (ret == PLAYER_ERROR_NONE) {
2551 bool ret_val = true;
2552 ret_val = _player_get_param_value(ret_buf,
2553 MUSE_TYPE_DOUBLE, "volume", (void *)&volume,
2554 INVALID_MUSE_TYPE_VALUE);
2556 *left = (float)volume;
2557 *right = (float)volume;
2559 LOGE("failed to get value from msg");
2560 ret = PLAYER_ERROR_INVALID_OPERATION;
2568 int player_set_sound_stream_info(player_h player, sound_stream_info_h stream_info)
2570 muse_player_api_e api = MUSE_PLAYER_API_SET_SOUND_STREAM_INFO;
2571 player_cli_s *pc = (player_cli_s *)player;
2572 bool is_available = false;
2573 char *ret_buf = NULL;
2575 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SOUND_STREAM);
2576 PLAYER_INSTANCE_CHECK(player);
2577 PLAYER_NULL_ARG_CHECK(stream_info);
2581 /* check if stream_info is valid */
2582 int ret = sound_manager_is_available_stream_information(stream_info, NATIVE_API_PLAYER, &is_available);
2583 if (ret != SOUND_MANAGER_ERROR_NONE) {
2584 LOGE("failed to checking available stream info");
2585 return PLAYER_ERROR_INVALID_OPERATION;
2588 if (is_available == false) {
2589 ret = PLAYER_ERROR_INVALID_PARAMETER;
2591 char *stream_type = NULL;
2592 int stream_index = 0;
2593 ret = sound_manager_get_type_from_stream_information(stream_info, &stream_type);
2594 ret = sound_manager_get_index_from_stream_information(stream_info, &stream_index);
2595 if (ret == SOUND_MANAGER_ERROR_NONE)
2596 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
2597 MUSE_TYPE_STRING, "stream_type", (const char *)stream_type,
2598 MUSE_TYPE_INT, "stream_index", stream_index);
2600 ret = PLAYER_ERROR_INVALID_OPERATION;
2603 LOGD("LEAVE ret: 0x%X", ret);
2610 int player_set_audio_latency_mode(player_h player, audio_latency_mode_e latency_mode)
2612 int ret = PLAYER_ERROR_NONE;
2613 muse_player_api_e api = MUSE_PLAYER_API_SET_AUDIO_LATENCY_MODE;
2614 player_cli_s *pc = (player_cli_s *)player;
2615 char *ret_buf = NULL;
2617 PLAYER_INSTANCE_CHECK(player);
2618 PLAYER_RANGE_ARG_CHECK(latency_mode, AUDIO_LATENCY_MODE_LOW, AUDIO_LATENCY_MODE_HIGH);
2622 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "latency_mode", (int)latency_mode);
2627 int player_get_audio_latency_mode(player_h player, audio_latency_mode_e *platency_mode)
2629 int ret = PLAYER_ERROR_NONE;
2630 muse_player_api_e api = MUSE_PLAYER_API_GET_AUDIO_LATENCY_MODE;
2631 player_cli_s *pc = (player_cli_s *)player;
2632 char *ret_buf = NULL;
2633 int latency_mode = -1;
2635 PLAYER_INSTANCE_CHECK(player);
2636 PLAYER_NULL_ARG_CHECK(platency_mode);
2640 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2642 if (ret == PLAYER_ERROR_NONE) {
2643 player_msg_get(latency_mode, ret_buf);
2644 *platency_mode = latency_mode;
2652 int player_start(player_h player)
2654 int ret = PLAYER_ERROR_NONE;
2655 muse_player_api_e api = MUSE_PLAYER_API_START;
2656 player_cli_s *pc = (player_cli_s *)player;
2657 char *ret_buf = NULL;
2658 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
2660 PLAYER_INSTANCE_CHECK(player);
2662 LOGD("ENTER %p", pc);
2664 if (!DP_INTERFACE(pc))
2667 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
2669 if (display_type != MM_DISPLAY_TYPE_EVAS ||
2670 CALLBACK_INFO(pc)->dp_info.visible == PLAYER_VISIBLE_INFO_FALSE)
2673 /* set proper visible to evas renderer */
2674 if (mm_display_interface_evas_set_visible(DP_INTERFACE(pc), true) != MM_ERROR_NONE) {
2675 LOGE("mm_display_interface_evas_set_visible failed");
2676 return PLAYER_ERROR_INVALID_OPERATION;
2679 /* avoid setting true at all times, when player is resumed */
2680 CALLBACK_INFO(pc)->dp_info.visible = PLAYER_VISIBLE_INFO_TRUE;
2683 g_mutex_lock(&pc->cb_info->buffering_cb_mutex);
2684 pc->cb_info->drop_buffering_message = TRUE;
2685 g_mutex_unlock(&pc->cb_info->buffering_cb_mutex);
2687 _player_remove_idle_event(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_BUFFERING, false);
2689 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2691 g_mutex_lock(&pc->cb_info->buffering_cb_mutex);
2692 pc->cb_info->drop_buffering_message = FALSE;
2693 g_mutex_unlock(&pc->cb_info->buffering_cb_mutex);
2697 LOGD("LEAVE 0x%X", ret);
2701 int player_stop(player_h player)
2703 int ret = PLAYER_ERROR_NONE;
2704 int mm_ret = MM_ERROR_NONE;
2705 muse_player_api_e api = MUSE_PLAYER_API_STOP;
2706 player_cli_s *pc = (player_cli_s *)player;
2707 char *ret_buf = NULL;
2708 player_state_e state = PLAYER_STATE_NONE;
2709 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
2711 PLAYER_INSTANCE_CHECK(player);
2713 LOGD("ENTER %p", pc);
2715 /* check player state */
2716 if (_get_current_state(pc, &state) != PLAYER_ERROR_NONE) {
2717 LOGE("Failed to get state");
2718 return PLAYER_ERROR_INVALID_OPERATION;
2721 if ((state != PLAYER_STATE_PLAYING) && (state != PLAYER_STATE_PAUSED)) {
2722 LOGE("Invalid state %d", state);
2723 return PLAYER_ERROR_INVALID_STATE;
2726 if (!DP_INTERFACE(pc))
2729 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
2731 if (display_type != MM_DISPLAY_TYPE_EVAS ||
2732 CALLBACK_INFO(pc)->dp_info.visible == PLAYER_VISIBLE_INFO_FALSE)
2735 mm_ret = mm_display_interface_evas_set_visible(DP_INTERFACE(pc), false);
2736 if (mm_ret != MM_ERROR_NONE) {
2737 LOGE("mm_display_interface_evas_set_visible failed 0x%x", mm_ret);
2738 return PLAYER_ERROR_INVALID_OPERATION;
2742 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2743 if (ret == PLAYER_ERROR_NONE)
2744 set_null_user_cb_lock(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_SEEK);
2748 LOGD("LEAVE 0x%X", ret);
2752 int player_pause(player_h player)
2754 int ret = PLAYER_ERROR_NONE;
2755 muse_player_api_e api = MUSE_PLAYER_API_PAUSE;
2756 player_cli_s *pc = (player_cli_s *)player;
2757 char *ret_buf = NULL;
2759 PLAYER_INSTANCE_CHECK(player);
2761 LOGD("ENTER %p", pc);
2763 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2766 LOGD("LEAVE 0x%X", ret);
2770 static int _set_play_position(player_h player, int64_t pos, bool accurate, player_seek_completed_cb callback, void *user_data)
2772 int ret = PLAYER_ERROR_NONE;
2773 muse_player_api_e api = MUSE_PLAYER_API_SET_PLAY_POSITION;
2774 player_cli_s *pc = (player_cli_s *)player;
2775 char *ret_buf = NULL;
2777 PLAYER_INSTANCE_CHECK(player);
2778 PLAYER_CHECK_CONDITION(pos >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
2780 LOGD("ENTER %p", pc);
2783 LOGE("cb_info is null");
2784 return PLAYER_ERROR_INVALID_OPERATION;
2787 g_mutex_lock(&pc->cb_info->seek_cb_mutex);
2788 if ((pc->push_media_stream == FALSE) &&
2789 (pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK])) {
2790 LOGE("PLAYER_ERROR_SEEK_FAILED (0x%08x) : seeking...", PLAYER_ERROR_SEEK_FAILED);
2791 g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
2792 return PLAYER_ERROR_SEEK_FAILED;
2794 if (pc->push_media_stream == TRUE)
2795 pc->cb_info->seek_cb_state = PLAYER_SEEK_CB_STATE_DROP;
2797 pc->cb_info->seek_cb_state = PLAYER_SEEK_CB_STATE_WAIT;
2798 LOGI("Event type : %d, pos : %"PRId64", accurate : %d", MUSE_PLAYER_EVENT_TYPE_SEEK, pos, accurate);
2799 pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = callback;
2800 pc->cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = user_data;
2802 g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
2804 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
2805 MUSE_TYPE_INT64, "pos", pos,
2806 MUSE_TYPE_INT, "accurate", (int)accurate);
2808 if (ret != PLAYER_ERROR_NONE) {
2809 g_mutex_lock(&pc->cb_info->seek_cb_mutex);
2810 set_null_user_cb(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_SEEK);
2811 g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
2814 if (pc->push_media_stream == TRUE)
2815 _player_event_queue_remove(&pc->cb_info->event_queue, MUSE_PLAYER_EVENT_TYPE_SEEK);
2819 g_mutex_lock(&pc->cb_info->seek_cb_mutex);
2820 pc->cb_info->seek_cb_state = PLAYER_SEEK_CB_STATE_NONE;
2821 g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
2823 LOGD("LEAVE 0x%X", ret);
2828 int player_set_play_position(player_h player, int milliseconds, bool accurate, player_seek_completed_cb callback, void *user_data)
2830 int ret = PLAYER_ERROR_NONE;
2831 int64_t pos = (int64_t)(milliseconds * G_GINT64_CONSTANT(1000000));
2833 PLAYER_INSTANCE_CHECK(player);
2834 PLAYER_CHECK_CONDITION(milliseconds >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
2838 ret = _set_play_position(player, pos, accurate, callback, user_data);
2840 LOGD("LEAVE 0x%X", ret);
2844 int player_set_play_position_nsec(player_h player, int64_t nanoseconds, bool accurate, player_seek_completed_cb callback, void *user_data)
2846 int ret = PLAYER_ERROR_NONE;
2847 int64_t pos = nanoseconds;
2849 PLAYER_INSTANCE_CHECK(player);
2850 PLAYER_CHECK_CONDITION(nanoseconds >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
2854 ret = _set_play_position(player, pos, accurate, callback, user_data);
2856 LOGD("LEAVE 0x%X", ret);
2860 static int _get_play_position(player_h player, int64_t *pos)
2862 int ret = PLAYER_ERROR_NONE;
2863 muse_player_api_e api = MUSE_PLAYER_API_GET_PLAY_POSITION;
2864 player_cli_s *pc = (player_cli_s *)player;
2865 char *ret_buf = NULL;
2867 PLAYER_INSTANCE_CHECK(player);
2868 PLAYER_NULL_ARG_CHECK(pos);
2870 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2872 if (ret == PLAYER_ERROR_NONE) {
2873 bool ret_val = true;
2874 ret_val = _player_get_param_value(ret_buf,
2875 MUSE_TYPE_INT64, "pos", (void *)pos,
2876 INVALID_MUSE_TYPE_VALUE);
2878 ret = PLAYER_ERROR_INVALID_OPERATION;
2886 int player_get_play_position(player_h player, int *milliseconds)
2888 int ret = PLAYER_ERROR_NONE;
2891 PLAYER_INSTANCE_CHECK(player);
2892 PLAYER_NULL_ARG_CHECK(milliseconds);
2894 /* LOGD("ENTER"); */
2896 ret = _get_play_position(player, &pos);
2897 if (ret == PLAYER_ERROR_NONE)
2898 *milliseconds = (int)(pos / G_GINT64_CONSTANT(1000000));
2903 int player_get_play_position_nsec(player_h player, int64_t *nanoseconds)
2905 int ret = PLAYER_ERROR_NONE;
2908 PLAYER_INSTANCE_CHECK(player);
2909 PLAYER_NULL_ARG_CHECK(nanoseconds);
2911 /* LOGD("ENTER"); */
2913 ret = _get_play_position(player, &pos);
2914 if (ret == PLAYER_ERROR_NONE)
2920 int player_set_mute(player_h player, bool muted)
2922 int ret = PLAYER_ERROR_NONE;
2923 muse_player_api_e api = MUSE_PLAYER_API_SET_MUTE;
2924 player_cli_s *pc = (player_cli_s *)player;
2925 char *ret_buf = NULL;
2926 int mute = (int)muted;
2928 PLAYER_INSTANCE_CHECK(player);
2932 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "mute", mute);
2937 int player_is_muted(player_h player, bool *muted)
2939 int ret = PLAYER_ERROR_NONE;
2940 muse_player_api_e api = MUSE_PLAYER_API_IS_MUTED;
2941 player_cli_s *pc = (player_cli_s *)player;
2942 char *ret_buf = NULL;
2945 PLAYER_INSTANCE_CHECK(player);
2946 PLAYER_NULL_ARG_CHECK(muted);
2950 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2951 if (ret == PLAYER_ERROR_NONE) {
2952 player_msg_get(mute, ret_buf);
2953 *muted = (bool)mute;
2960 int player_set_looping(player_h player, bool looping)
2962 int ret = PLAYER_ERROR_NONE;
2963 muse_player_api_e api = MUSE_PLAYER_API_SET_LOOPING;
2964 player_cli_s *pc = (player_cli_s *)player;
2965 char *ret_buf = NULL;
2967 PLAYER_INSTANCE_CHECK(player);
2971 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "looping", (int)looping);
2976 int player_is_looping(player_h player, bool *plooping)
2978 int ret = PLAYER_ERROR_NONE;
2979 muse_player_api_e api = MUSE_PLAYER_API_IS_LOOPING;
2980 player_cli_s *pc = (player_cli_s *)player;
2981 char *ret_buf = NULL;
2984 PLAYER_INSTANCE_CHECK(player);
2985 PLAYER_NULL_ARG_CHECK(plooping);
2989 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
2990 if (ret == PLAYER_ERROR_NONE) {
2991 player_msg_get(looping, ret_buf);
2992 *plooping = looping;
2998 static int _get_duration(player_h player, int64_t *duration)
3000 int ret = PLAYER_ERROR_NONE;
3001 muse_player_api_e api = MUSE_PLAYER_API_GET_DURATION;
3002 player_cli_s *pc = (player_cli_s *)player;
3003 char *ret_buf = NULL;
3005 PLAYER_INSTANCE_CHECK(player);
3006 PLAYER_NULL_ARG_CHECK(duration);
3010 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3011 if (ret == PLAYER_ERROR_NONE) {
3012 bool ret_val = true;
3013 ret_val = _player_get_param_value(ret_buf,
3014 MUSE_TYPE_INT64, "duration", (void *)duration,
3015 INVALID_MUSE_TYPE_VALUE);
3017 ret = PLAYER_ERROR_INVALID_OPERATION;
3025 int player_get_duration(player_h player, int *milliseconds)
3027 int ret = PLAYER_ERROR_NONE;
3028 int64_t duration = 0; /* nsec */
3030 PLAYER_INSTANCE_CHECK(player);
3031 PLAYER_NULL_ARG_CHECK(milliseconds);
3035 ret = _get_duration(player, &duration);
3036 if (ret == PLAYER_ERROR_NONE) {
3037 /* convert time from ns to ms */
3038 *milliseconds = (int)(duration / G_GINT64_CONSTANT(1000000));
3041 LOGD("LEAVE 0x%X", ret);
3045 int player_get_duration_nsec(player_h player, int64_t *nanoseconds)
3047 int ret = PLAYER_ERROR_NONE;
3048 int64_t duration = 0; /* nsec */
3050 PLAYER_INSTANCE_CHECK(player);
3051 PLAYER_NULL_ARG_CHECK(nanoseconds);
3055 ret = _get_duration(player, &duration);
3056 if (ret == PLAYER_ERROR_NONE)
3057 *nanoseconds = duration;
3059 LOGD("LEAVE 0x%X", ret);
3063 /* The player_display_type_e is different at wearable profile */
3064 int _player_convert_display_type(player_display_type_e type, mm_display_type_e *out_type)
3066 int ret = PLAYER_ERROR_NONE;
3068 PLAYER_NULL_ARG_CHECK(out_type);
3071 case PLAYER_DISPLAY_TYPE_OVERLAY:
3072 *out_type = MM_DISPLAY_TYPE_OVERLAY;
3074 case PLAYER_DISPLAY_TYPE_EVAS:
3075 *out_type = MM_DISPLAY_TYPE_EVAS;
3077 case PLAYER_DISPLAY_TYPE_NONE:
3078 *out_type = MM_DISPLAY_TYPE_NONE;
3081 ret = PLAYER_ERROR_INVALID_PARAMETER;
3085 LOGD("display type(%d) -> (%d)", type, *out_type);
3090 int player_set_display(player_h player, player_display_type_e type, player_display_h display)
3092 int ret = PLAYER_ERROR_NONE;
3093 int mm_ret = MM_ERROR_NONE;
3094 muse_player_api_e api = MUSE_PLAYER_API_SET_DISPLAY;
3095 player_cli_s *pc = (player_cli_s *)player;
3096 char *ret_buf = NULL;
3097 wl_win_msg_type wl_win;
3098 char *wl_win_msg = (char *)&wl_win;
3099 mm_display_type_e conv_type = MM_DISPLAY_TYPE_NONE;
3100 int arr_msg_len = 0;
3101 pid_t pid = getpid();
3102 pid_t tid = syscall(SYS_gettid);
3104 PLAYER_INSTANCE_CHECK(player);
3106 if (type != PLAYER_DISPLAY_TYPE_NONE) {
3107 LOGD("Check if API is called in main thread. pid [%d], tid [%d]", pid, tid);
3109 LOGE("API isn't called in main thread");
3110 return PLAYER_ERROR_INVALID_OPERATION;
3114 /* check display interface handle */
3115 if (!DP_INTERFACE(pc)) {
3116 LOGE("display interface not supported");
3117 return PLAYER_ERROR_INVALID_OPERATION;
3120 LOGD("ENTER type: %d", type);
3122 /* before setting display, player state have to be checked. */
3123 PLAYER_STATE_CHECK(pc, PLAYER_STATE_IDLE);
3125 ret = _player_convert_display_type(type, &conv_type);
3126 if (ret != PLAYER_ERROR_NONE)
3129 if (conv_type != MM_DISPLAY_TYPE_NONE) {
3131 LOGE("type[%d] NULL handle for display", type);
3132 return PLAYER_ERROR_INVALID_PARAMETER;
3135 mm_ret = mm_display_interface_set_display(DP_INTERFACE(pc), conv_type, display, &wl_win.surface_id);
3136 if (mm_ret != MM_ERROR_NONE) {
3137 LOGE("[INVALID_OPERATION] set display failed[0x%x]", mm_ret);
3138 return PLAYER_ERROR_INVALID_OPERATION;
3141 if (conv_type == MM_DISPLAY_TYPE_EVAS) {
3142 /* before evas handle is created, user could set display information */
3143 player_display_mode_e mode = PLAYER_DISPLAY_MODE_LETTER_BOX;
3144 player_display_rotation_e rotation = PLAYER_DISPLAY_ROTATION_NONE;
3145 bool visible = false;
3147 ret = player_get_display_mode(player, &mode);
3148 ret |= player_get_display_rotation(player, &rotation);
3149 ret |= player_is_display_visible(player, &visible);
3151 if (ret != PLAYER_ERROR_NONE) {
3152 LOGE("get current display settings");
3153 return PLAYER_ERROR_INVALID_OPERATION;
3156 LOGD("current setting : mode %d, rotation %d, visible %d, roi %d,%d,%dx%d",
3157 mode, rotation, visible,
3158 CALLBACK_INFO(pc)->dp_info.roi_x,
3159 CALLBACK_INFO(pc)->dp_info.roi_y,
3160 CALLBACK_INFO(pc)->dp_info.roi_w,
3161 CALLBACK_INFO(pc)->dp_info.roi_h);
3163 mm_ret = mm_display_interface_evas_set_mode(DP_INTERFACE(pc), mode);
3164 mm_ret |= mm_display_interface_evas_set_rotation(DP_INTERFACE(pc), rotation);
3165 mm_ret |= mm_display_interface_evas_set_visible(DP_INTERFACE(pc), visible);
3166 if (mode == PLAYER_DISPLAY_MODE_DST_ROI) {
3167 mm_ret |= mm_display_interface_evas_set_roi_area(DP_INTERFACE(pc),
3168 CALLBACK_INFO(pc)->dp_info.roi_x, CALLBACK_INFO(pc)->dp_info.roi_y,
3169 CALLBACK_INFO(pc)->dp_info.roi_w, CALLBACK_INFO(pc)->dp_info.roi_h);
3172 if (mm_ret != MM_ERROR_NONE) {
3173 LOGE("set mm_display_interface failed");
3174 return PLAYER_ERROR_INVALID_OPERATION;
3177 if (player_set_media_packet_video_frame_decoded_cb(player,
3178 __player_media_packet_video_decoded_cb, player) != MM_ERROR_NONE) {
3179 LOGE("fail to set decoded callback");
3180 return PLAYER_ERROR_INVALID_OPERATION;
3183 if (__player_set_retrieve_buffer_cb(player, __retrieve_buffer_cb, pc))
3184 LOGW("fail to set __retrieve_buffer_cb");
3188 wl_win.type = conv_type;
3190 arr_msg_len = (sizeof(wl_win_msg_type) / sizeof(int) + (sizeof(wl_win_msg_type) % sizeof(int) ? 1 : 0));
3191 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
3192 MUSE_TYPE_ARRAY, "wl_win_msg", arr_msg_len, (int *)wl_win_msg);
3199 int player_set_display_mode(player_h player, player_display_mode_e mode)
3201 int ret = PLAYER_ERROR_NONE;
3202 int mm_ret = MM_ERROR_NONE;
3203 muse_player_api_e api = MUSE_PLAYER_API_SET_DISPLAY_MODE;
3204 player_cli_s *pc = (player_cli_s *)player;
3205 char *ret_buf = NULL;
3206 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
3208 PLAYER_INSTANCE_CHECK(player);
3209 PLAYER_RANGE_ARG_CHECK(mode, PLAYER_DISPLAY_MODE_LETTER_BOX, PLAYER_DISPLAY_MODE_DST_ROI);
3213 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
3215 if (display_type == MM_DISPLAY_TYPE_EVAS) {
3216 mm_ret = mm_display_interface_evas_set_mode(DP_INTERFACE(pc), mode);
3217 if (mm_ret != MM_ERROR_NONE) {
3218 LOGE("mm_display_interface_evas_set_mode failed 0x%x", mm_ret);
3219 return PLAYER_ERROR_INVALID_OPERATION;
3223 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "mode", (int)mode);
3230 int player_get_display_mode(player_h player, player_display_mode_e *pmode)
3232 int ret = PLAYER_ERROR_NONE;
3233 muse_player_api_e api = MUSE_PLAYER_API_GET_DISPLAY_MODE;
3234 player_cli_s *pc = (player_cli_s *)player;
3235 char *ret_buf = NULL;
3238 PLAYER_INSTANCE_CHECK(player);
3239 PLAYER_NULL_ARG_CHECK(pmode);
3243 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3245 if (ret == PLAYER_ERROR_NONE) {
3246 player_msg_get_type(mode, ret_buf, INT);
3255 int player_set_video_roi_area(player_h player, double x_scale, double y_scale,
3256 double w_scale, double h_scale)
3258 int ret = PLAYER_ERROR_NONE;
3259 muse_player_api_e api = MUSE_PLAYER_API_SET_VIDEO_ROI_AREA;
3260 player_cli_s *pc = (player_cli_s *)player;
3261 char *ret_buf = NULL;
3262 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
3264 PLAYER_INSTANCE_CHECK(player);
3268 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
3270 if (display_type == MM_DISPLAY_TYPE_EVAS) {
3271 LOGE("Display type is EVAS, video display interface is not supported");
3272 return PLAYER_ERROR_INVALID_OPERATION;
3275 if (!_player_video_roi_area_is_valid(x_scale, y_scale, w_scale, h_scale))
3276 return PLAYER_ERROR_INVALID_PARAMETER;
3278 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
3279 MUSE_TYPE_DOUBLE, "x_scale", x_scale,
3280 MUSE_TYPE_DOUBLE, "y_scale", y_scale,
3281 MUSE_TYPE_DOUBLE, "w_scale", w_scale,
3282 MUSE_TYPE_DOUBLE, "h_scale", h_scale);
3290 int player_get_video_roi_area(player_h player, double *x_scale, double *y_scale,
3291 double *w_scale, double *h_scale)
3293 int ret = PLAYER_ERROR_NONE;
3294 muse_player_api_e api = MUSE_PLAYER_API_GET_VIDEO_ROI_AREA;
3295 player_cli_s *pc = (player_cli_s *)player;
3296 char *ret_buf = NULL;
3297 double scale_x = 0, scale_y = 0, scale_w = 0, scale_h = 0;
3299 PLAYER_INSTANCE_CHECK(player);
3300 PLAYER_NULL_ARG_CHECK(x_scale && y_scale && w_scale && h_scale);
3302 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3304 if (ret == PLAYER_ERROR_NONE) {
3305 if (player_msg_get_type(scale_x, ret_buf, DOUBLE))
3308 LOGE("failed to get value from msg");
3309 if (player_msg_get_type(scale_y, ret_buf, DOUBLE))
3312 LOGE("failed to get value from msg");
3313 if (player_msg_get_type(scale_w, ret_buf, DOUBLE))
3316 LOGE("failed to get value from msg");
3317 if (player_msg_get_type(scale_h, ret_buf, DOUBLE))
3320 LOGE("failed to get value from msg");
3329 int player_set_display_roi_area(player_h player, int x, int y, int width, int height)
3331 int ret = PLAYER_ERROR_NONE;
3332 int mm_ret = MM_ERROR_NONE;
3333 muse_player_api_e api = MUSE_PLAYER_API_SET_DISPLAY_ROI_AREA;
3334 player_cli_s *pc = (player_cli_s *)player;
3335 char *ret_buf = NULL;
3336 wl_win_msg_type wl_win;
3337 char *wl_win_msg = (char *)&wl_win;
3338 int arr_msg_len = 0;
3339 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
3341 PLAYER_INSTANCE_CHECK(player);
3342 PLAYER_CHECK_CONDITION(width > 0 && height > 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
3346 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
3348 if (display_type == MM_DISPLAY_TYPE_EVAS) {
3349 mm_ret = mm_display_interface_evas_set_roi_area(DP_INTERFACE(pc), x, y, width, height);
3350 if (mm_ret == MM_ERROR_EVASRENDER_INVALID_ARGUMENT)
3351 return PLAYER_ERROR_INVALID_PARAMETER;
3352 else if (mm_ret != MM_ERROR_NONE)
3353 return PLAYER_ERROR_INVALID_OPERATION;
3356 wl_win.win_roi_x = x;
3357 wl_win.win_roi_y = y;
3358 wl_win.win_roi_width = width;
3359 wl_win.win_roi_height = height;
3361 arr_msg_len = (sizeof(wl_win_msg_type) / sizeof(int) + (sizeof(wl_win_msg_type) % sizeof(int) ? 1 : 0));
3362 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
3363 MUSE_TYPE_ARRAY, "wl_win_msg", arr_msg_len, (int *)wl_win_msg);
3365 if (ret == PLAYER_ERROR_NONE) {
3366 CALLBACK_INFO(pc)->dp_info.roi_x = x;
3367 CALLBACK_INFO(pc)->dp_info.roi_y = y;
3368 CALLBACK_INFO(pc)->dp_info.roi_w = width;
3369 CALLBACK_INFO(pc)->dp_info.roi_h = height;
3377 int player_set_playback_rate(player_h player, float rate)
3379 int ret = PLAYER_ERROR_NONE;
3380 muse_player_api_e api = MUSE_PLAYER_API_SET_PLAYBACK_RATE;
3381 player_cli_s *pc = (player_cli_s *)player;
3382 char *ret_buf = NULL;
3384 PLAYER_INSTANCE_CHECK(player);
3385 PLAYER_RANGE_ARG_CHECK(rate, -5.0, 5.0);
3389 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_DOUBLE, "rate", (double)rate);
3392 LOGD("LEAVE 0x%X", ret);
3396 int player_set_display_rotation(player_h player, player_display_rotation_e rotation)
3398 int ret = PLAYER_ERROR_NONE;
3399 int mm_ret = MM_ERROR_NONE;
3400 muse_player_api_e api = MUSE_PLAYER_API_SET_DISPLAY_ROTATION;
3401 player_cli_s *pc = (player_cli_s *)player;
3402 char *ret_buf = NULL;
3403 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
3405 PLAYER_INSTANCE_CHECK(player);
3406 PLAYER_RANGE_ARG_CHECK(rotation, PLAYER_DISPLAY_ROTATION_NONE, PLAYER_DISPLAY_ROTATION_270);
3410 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
3412 if (display_type == MM_DISPLAY_TYPE_EVAS) {
3413 mm_ret = mm_display_interface_evas_set_rotation(DP_INTERFACE(pc), rotation);
3414 if (mm_ret != MM_ERROR_NONE) {
3415 LOGE("mm_display_interface_evas_set_rotation failed 0x%x", mm_ret);
3416 return PLAYER_ERROR_INVALID_OPERATION;
3420 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "rotation", (int)rotation);
3427 int player_get_display_rotation(player_h player, player_display_rotation_e *protation)
3429 int ret = PLAYER_ERROR_NONE;
3430 player_cli_s *pc = (player_cli_s *)player;
3431 muse_player_api_e api = MUSE_PLAYER_API_GET_DISPLAY_ROTATION;
3432 char *ret_buf = NULL;
3435 PLAYER_INSTANCE_CHECK(player);
3436 PLAYER_NULL_ARG_CHECK(protation);
3440 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3442 if (ret == PLAYER_ERROR_NONE) {
3443 player_msg_get_type(rotation, ret_buf, INT);
3444 *protation = rotation;
3452 int player_set_display_visible(player_h player, bool visible)
3454 int ret = PLAYER_ERROR_NONE;
3455 int mm_ret = MM_ERROR_NONE;
3456 player_cli_s *pc = (player_cli_s *)player;
3457 muse_player_api_e api = MUSE_PLAYER_API_SET_DISPLAY_VISIBLE;
3458 char *ret_buf = NULL;
3459 mm_display_type_e display_type = MM_DISPLAY_TYPE_NONE;
3461 PLAYER_INSTANCE_CHECK(player);
3465 PLAYER_GET_DISPLAY_TYPE(pc, display_type);
3467 if (display_type == MM_DISPLAY_TYPE_EVAS) {
3468 mm_ret = mm_display_interface_evas_set_visible(DP_INTERFACE(pc), visible);
3469 if (mm_ret != MM_ERROR_NONE) {
3470 LOGE("mm_display_interface_evas_set_visible failed 0x%x", mm_ret);
3471 return PLAYER_ERROR_INVALID_OPERATION;
3475 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "visible", (int)visible);
3479 if (ret == PLAYER_ERROR_NONE)
3480 CALLBACK_INFO(pc)->dp_info.visible = visible ? PLAYER_VISIBLE_INFO_TRUE : PLAYER_VISIBLE_INFO_FALSE;
3485 int player_is_display_visible(player_h player, bool *pvisible)
3487 int ret = PLAYER_ERROR_NONE;
3488 player_cli_s *pc = (player_cli_s *)player;
3489 muse_player_api_e api = MUSE_PLAYER_API_IS_DISPLAY_VISIBLE;
3490 char *ret_buf = NULL;
3493 PLAYER_INSTANCE_CHECK(player);
3494 PLAYER_NULL_ARG_CHECK(pvisible);
3498 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3500 if (ret == PLAYER_ERROR_NONE) {
3501 player_msg_get_type(value, ret_buf, INT);
3514 int player_get_content_info(player_h player, player_content_info_e key, char **pvalue)
3516 int ret = PLAYER_ERROR_NONE;
3517 muse_player_api_e api = MUSE_PLAYER_API_GET_CONTENT_INFO;
3518 player_cli_s *pc = (player_cli_s *)player;
3519 char *ret_buf = NULL;
3520 char value[MUSE_MSG_MAX_LENGTH] = { 0, };
3522 PLAYER_INSTANCE_CHECK(player);
3523 PLAYER_NULL_ARG_CHECK(pvalue);
3527 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "key", (int)key);
3528 if (ret == PLAYER_ERROR_NONE) {
3529 player_msg_get_string(value, ret_buf);
3530 *pvalue = strndup(value, MUSE_MSG_MAX_LENGTH);
3536 int player_get_codec_info(player_h player, char **paudio_codec, char **pvideo_codec)
3538 int ret = PLAYER_ERROR_NONE;
3539 muse_player_api_e api = MUSE_PLAYER_API_GET_CODEC_INFO;
3540 player_cli_s *pc = (player_cli_s *)player;
3541 char *ret_buf = NULL;
3542 char video_codec[MUSE_MSG_MAX_LENGTH] = { 0, };
3543 char audio_codec[MUSE_MSG_MAX_LENGTH] = { 0, };
3544 bool ret_val = TRUE;
3546 PLAYER_INSTANCE_CHECK(player);
3547 PLAYER_NULL_ARG_CHECK(paudio_codec || pvideo_codec);
3551 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3552 if (ret == PLAYER_ERROR_NONE) {
3553 ret_val = _player_get_param_value(ret_buf,
3554 MUSE_TYPE_STRING, "video_codec", (void *)video_codec,
3555 MUSE_TYPE_STRING, "audio_codec", (void *)audio_codec,
3556 INVALID_MUSE_TYPE_VALUE);
3559 *pvideo_codec = strndup(video_codec, MUSE_MSG_MAX_LENGTH);
3561 *paudio_codec = strndup(audio_codec, MUSE_MSG_MAX_LENGTH);
3563 ret = PLAYER_ERROR_INVALID_OPERATION;
3570 int player_get_audio_stream_info(player_h player, int *psample_rate, int *pchannel, int *pbit_rate)
3572 int ret = PLAYER_ERROR_NONE;
3573 muse_player_api_e api = MUSE_PLAYER_API_GET_AUDIO_STREAM_INFO;
3574 player_cli_s *pc = (player_cli_s *)player;
3575 char *ret_buf = NULL;
3576 int sample_rate = 0;
3580 PLAYER_INSTANCE_CHECK(player);
3581 PLAYER_NULL_ARG_CHECK(psample_rate || pchannel || pbit_rate);
3585 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3586 if (ret == PLAYER_ERROR_NONE) {
3587 bool ret_val = true;
3588 ret_val = _player_get_param_value(ret_buf,
3589 MUSE_TYPE_INT, "sample_rate", (void *)&sample_rate,
3590 MUSE_TYPE_INT, "channel", (void *)&channel,
3591 MUSE_TYPE_INT, "bit_rate", (void *)&bit_rate,
3592 INVALID_MUSE_TYPE_VALUE);
3595 *psample_rate = sample_rate;
3597 *pchannel = channel;
3599 *pbit_rate = bit_rate;
3601 ret = PLAYER_ERROR_INVALID_OPERATION;
3608 int player_get_video_stream_info(player_h player, int *pfps, int *pbit_rate)
3610 int ret = PLAYER_ERROR_NONE;
3611 muse_player_api_e api = MUSE_PLAYER_API_GET_VIDEO_STREAM_INFO;
3612 player_cli_s *pc = (player_cli_s *)player;
3613 char *ret_buf = NULL;
3617 PLAYER_INSTANCE_CHECK(player);
3618 PLAYER_NULL_ARG_CHECK(pfps || pbit_rate);
3622 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3623 if (ret == PLAYER_ERROR_NONE) {
3624 bool ret_val = true;
3625 ret_val = _player_get_param_value(ret_buf,
3626 MUSE_TYPE_INT, "fps", (void *)&fps,
3627 MUSE_TYPE_INT, "bit_rate", (void *)&bit_rate,
3628 INVALID_MUSE_TYPE_VALUE);
3633 *pbit_rate = bit_rate;
3635 ret = PLAYER_ERROR_INVALID_OPERATION;
3642 int player_get_video_size(player_h player, int *pwidth, int *pheight)
3644 int ret = PLAYER_ERROR_NONE;
3645 muse_player_api_e api = MUSE_PLAYER_API_GET_VIDEO_SIZE;
3646 player_cli_s *pc = (player_cli_s *)player;
3647 char *ret_buf = NULL;
3651 PLAYER_INSTANCE_CHECK(player);
3652 PLAYER_NULL_ARG_CHECK(pwidth && pheight);
3656 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3657 if (ret == PLAYER_ERROR_NONE) {
3658 bool ret_val = true;
3659 ret_val = _player_get_param_value(ret_buf,
3660 MUSE_TYPE_INT, "width", (void *)&width,
3661 MUSE_TYPE_INT, "height", (void *)&height,
3662 INVALID_MUSE_TYPE_VALUE);
3667 ret = PLAYER_ERROR_INVALID_OPERATION;
3674 int player_get_album_art(player_h player, void **palbum_art, int *psize)
3676 int ret = PLAYER_ERROR_NONE;
3677 muse_player_api_e api = MUSE_PLAYER_API_GET_ALBUM_ART;
3678 player_cli_s *pc = (player_cli_s *)player;
3679 char *ret_buf = NULL;
3683 tbm_bo_handle thandle;
3684 tbm_fd tfd = INVALID_DEFAULT_VALUE;
3685 int key = INVALID_DEFAULT_VALUE;
3688 PLAYER_INSTANCE_CHECK(player);
3689 PLAYER_NULL_ARG_CHECK(palbum_art && psize);
3693 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3694 if (ret == PLAYER_ERROR_NONE) {
3695 muse_core_msg_parse_err_e err = MUSE_MSG_PARSE_ERROR_NONE;
3696 jobj = muse_core_msg_object_new(ret_buf, NULL, &err);
3698 LOGE("failed to get msg obj, err:%d", err);
3699 ret = PLAYER_ERROR_INVALID_OPERATION;
3703 if (muse_core_msg_object_get_value("size", jobj, MUSE_TYPE_INT, &size) && (size > 0)) {
3704 LOGD("size : %d", size);
3705 if (!muse_core_msg_object_get_value("key", jobj, MUSE_TYPE_INT, &key)) {
3706 LOGE("failed to get key value");
3707 ret = PLAYER_ERROR_INVALID_OPERATION;
3711 tfd = pc->cb_info->tfd;
3713 LOGE("failed to get tbm fd value");
3714 ret = PLAYER_ERROR_INVALID_OPERATION;
3718 bo = tbm_bo_import_fd(pc->cb_info->bufmgr, tfd);
3720 LOGE("TBM get error : bo is NULL");
3721 ret = PLAYER_ERROR_INVALID_OPERATION;
3724 thandle = tbm_bo_map(bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE | TBM_OPTION_READ);
3725 if (thandle.ptr == NULL) {
3726 LOGE("TBM get error : handle pointer is NULL");
3727 ret = PLAYER_ERROR_INVALID_OPERATION;
3730 album_art = _get_mem(pc, size);
3732 memcpy(album_art, thandle.ptr, size);
3733 *palbum_art = album_art;
3735 LOGE("g_new failure");
3736 ret = PLAYER_ERROR_INVALID_OPERATION;
3748 muse_core_msg_object_free(jobj);
3752 PLAYER_CLOSE_FD(tfd);
3754 if (CALLBACK_INFO(pc))
3755 pc->cb_info->tfd = INVALID_DEFAULT_VALUE;
3761 if (key > INVALID_DEFAULT_VALUE && CALLBACK_INFO(pc)) {
3762 LOGD("send msg to release buffer. key:%d", key);
3763 PLAYER_SEND_MSG_ASYNC(MUSE_PLAYER_API_RETURN_BUFFER, MSG_FD(pc), ret, MUSE_TYPE_INT, "key", key);
3769 int player_audio_effect_get_equalizer_bands_count(player_h player, int *pcount)
3771 int ret = PLAYER_ERROR_NONE;
3772 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_GET_EQUALIZER_BANDS_COUNT;
3773 player_cli_s *pc = (player_cli_s *)player;
3774 char *ret_buf = NULL;
3777 PLAYER_INSTANCE_CHECK(player);
3778 PLAYER_NULL_ARG_CHECK(pcount);
3782 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3783 if (ret == PLAYER_ERROR_NONE) {
3784 player_msg_get(count, ret_buf);
3791 int player_audio_effect_set_equalizer_all_bands(player_h player, int *band_levels, int length)
3793 int ret = PLAYER_ERROR_NONE;
3794 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_SET_EQUALIZER_ALL_BANDS;
3795 player_cli_s *pc = (player_cli_s *)player;
3796 char *ret_buf = NULL;
3798 PLAYER_INSTANCE_CHECK(player);
3799 PLAYER_NULL_ARG_CHECK(band_levels);
3803 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
3804 MUSE_TYPE_INT, "length", length,
3805 MUSE_TYPE_ARRAY, "band_levels", length, band_levels);
3812 int player_audio_effect_set_equalizer_band_level(player_h player, int index, int level)
3814 int ret = PLAYER_ERROR_NONE;
3815 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_SET_EQUALIZER_BAND_LEVEL;
3816 player_cli_s *pc = (player_cli_s *)player;
3817 char *ret_buf = NULL;
3819 PLAYER_INSTANCE_CHECK(player);
3823 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
3824 MUSE_TYPE_INT, "index", index,
3825 MUSE_TYPE_INT, "level", level);
3831 int player_audio_effect_get_equalizer_band_level(player_h player, int index, int *plevel)
3833 int ret = PLAYER_ERROR_NONE;
3834 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_GET_EQUALIZER_BAND_LEVEL;
3835 player_cli_s *pc = (player_cli_s *)player;
3836 char *ret_buf = NULL;
3839 PLAYER_INSTANCE_CHECK(player);
3840 PLAYER_NULL_ARG_CHECK(plevel);
3844 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "index", index);
3845 if (ret == PLAYER_ERROR_NONE) {
3846 player_msg_get(level, ret_buf);
3853 int player_audio_effect_get_equalizer_level_range(player_h player, int *pmin, int *pmax)
3855 int ret = PLAYER_ERROR_NONE;
3856 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_GET_EQUALIZER_LEVEL_RANGE;
3857 player_cli_s *pc = (player_cli_s *)player;
3858 char *ret_buf = NULL;
3859 int min = 0, max = 0;
3861 PLAYER_INSTANCE_CHECK(player);
3862 PLAYER_NULL_ARG_CHECK(pmin && pmax);
3866 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3867 if (ret == PLAYER_ERROR_NONE) {
3868 bool ret_val = true;
3869 ret_val = _player_get_param_value(ret_buf,
3870 MUSE_TYPE_INT, "min", (void *)&min,
3871 MUSE_TYPE_INT, "max", (void *)&max,
3872 INVALID_MUSE_TYPE_VALUE);
3877 ret = PLAYER_ERROR_INVALID_OPERATION;
3884 int player_audio_effect_get_equalizer_band_frequency(player_h player, int index, int *pfrequency)
3886 int ret = PLAYER_ERROR_NONE;
3887 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_GET_EQUALIZER_BAND_FREQUENCY;
3888 player_cli_s *pc = (player_cli_s *)player;
3889 char *ret_buf = NULL;
3892 PLAYER_INSTANCE_CHECK(player);
3893 PLAYER_NULL_ARG_CHECK(pfrequency);
3897 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "index", index);
3898 if (ret == PLAYER_ERROR_NONE) {
3899 player_msg_get(frequency, ret_buf);
3900 *pfrequency = frequency;
3906 int player_audio_effect_get_equalizer_band_frequency_range(player_h player, int index, int *prange)
3908 int ret = PLAYER_ERROR_NONE;
3909 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_GET_EQUALIZER_BAND_FREQUENCY_RANGE;
3910 player_cli_s *pc = (player_cli_s *)player;
3911 char *ret_buf = NULL;
3914 PLAYER_INSTANCE_CHECK(player);
3915 PLAYER_NULL_ARG_CHECK(prange);
3919 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "index", index);
3920 if (ret == PLAYER_ERROR_NONE) {
3921 player_msg_get(range, ret_buf);
3928 int player_audio_effect_equalizer_clear(player_h player)
3930 int ret = PLAYER_ERROR_NONE;
3931 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_EQUALIZER_CLEAR;
3932 player_cli_s *pc = (player_cli_s *)player;
3933 char *ret_buf = NULL;
3935 PLAYER_INSTANCE_CHECK(player);
3939 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3944 int player_audio_effect_equalizer_is_available(player_h player, bool *pavailable)
3946 int ret = PLAYER_ERROR_NONE;
3947 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_EFFECT_EQUALIZER_IS_AVAILABLE;
3948 player_cli_s *pc = (player_cli_s *)player;
3949 char *ret_buf = NULL;
3952 PLAYER_INSTANCE_CHECK(player);
3953 PLAYER_NULL_ARG_CHECK(pavailable);
3957 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
3958 if (ret == PLAYER_ERROR_NONE) {
3959 player_msg_get(available, ret_buf);
3960 *pavailable = available;
3966 int player_set_subtitle_path(player_h player, const char *path)
3968 int ret = PLAYER_ERROR_NONE;
3969 muse_player_api_e api = MUSE_PLAYER_API_SET_SUBTITLE_PATH;
3970 player_cli_s *pc = (player_cli_s *)player;
3971 char *ret_buf = NULL;
3972 char subtitle_path[MAX_URL_LEN] = {0, };
3974 PLAYER_INSTANCE_CHECK(player);
3978 if (path && _player_get_valid_path(path, subtitle_path) != PLAYER_ERROR_NONE)
3979 return PLAYER_ERROR_INVALID_PARAMETER;
3981 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_STRING, "subtitle_path", (const char *)subtitle_path);
3986 int player_set_subtitle_position_offset(player_h player, int milliseconds)
3988 int ret = PLAYER_ERROR_NONE;
3989 muse_player_api_e api = MUSE_PLAYER_API_SET_SUBTITLE_POSITION_OFFSET;
3990 player_cli_s *pc = (player_cli_s *)player;
3991 char *ret_buf = NULL;
3993 PLAYER_INSTANCE_CHECK(player);
3997 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "milliseconds", milliseconds);
4003 int player_capture_video(player_h player, player_video_captured_cb callback, void *user_data)
4005 int ret = PLAYER_ERROR_NONE;
4006 muse_player_api_e api = MUSE_PLAYER_API_CAPTURE_VIDEO;
4007 player_cli_s *pc = (player_cli_s *)player;
4008 char *ret_buf = NULL;
4010 PLAYER_INSTANCE_CHECK(player);
4011 PLAYER_NULL_ARG_CHECK(callback);
4014 if (pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE]) {
4015 LOGE("PLAYER_ERROR_VIDEO_CAPTURE_FAILED (0x%08x) : capturing...", PLAYER_ERROR_VIDEO_CAPTURE_FAILED);
4016 return PLAYER_ERROR_VIDEO_CAPTURE_FAILED;
4018 LOGI("Event type : %d ", MUSE_PLAYER_EVENT_TYPE_CAPTURE);
4019 pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = callback;
4020 pc->cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = user_data;
4023 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4025 if (ret != PLAYER_ERROR_NONE)
4026 set_null_user_cb(pc->cb_info, MUSE_PLAYER_EVENT_TYPE_CAPTURE);
4032 int player_set_streaming_cookie(player_h player, const char *cookie, int size)
4034 int ret = PLAYER_ERROR_NONE;
4035 muse_player_api_e api = MUSE_PLAYER_API_SET_STREAMING_COOKIE;
4036 player_cli_s *pc = (player_cli_s *)player;
4037 char *ret_buf = NULL;
4039 PLAYER_INSTANCE_CHECK(player);
4040 PLAYER_NULL_ARG_CHECK(cookie);
4041 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
4045 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4046 MUSE_TYPE_STRING, "cookie", cookie,
4047 MUSE_TYPE_INT, "size", size);
4052 int player_set_streaming_user_agent(player_h player, const char *user_agent, int size)
4054 int ret = PLAYER_ERROR_NONE;
4055 muse_player_api_e api = MUSE_PLAYER_API_SET_STREAMING_USER_AGENT;
4056 player_cli_s *pc = (player_cli_s *)player;
4057 char *ret_buf = NULL;
4059 PLAYER_INSTANCE_CHECK(player);
4060 PLAYER_NULL_ARG_CHECK(user_agent);
4061 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
4065 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4066 MUSE_TYPE_STRING, "user_agent", user_agent,
4067 MUSE_TYPE_INT, "size", size);
4072 int player_get_streaming_download_progress(player_h player, int *start, int *end)
4074 int ret = PLAYER_ERROR_NONE;
4075 muse_player_api_e api = MUSE_PLAYER_API_GET_STREAMING_DOWNLOAD_PROGRESS;
4076 player_cli_s *pc = (player_cli_s *)player;
4077 char *ret_buf = NULL;
4078 int start_pos = 0, end_pos = 0;
4080 PLAYER_INSTANCE_CHECK(player);
4081 PLAYER_NULL_ARG_CHECK(start && end);
4085 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4086 if (ret == PLAYER_ERROR_NONE) {
4087 bool ret_val = true;
4088 ret_val = _player_get_param_value(ret_buf,
4089 MUSE_TYPE_INT, "start_pos", (void *)&start_pos,
4090 MUSE_TYPE_INT, "end_pos", (void *)&end_pos,
4091 INVALID_MUSE_TYPE_VALUE);
4096 ret = PLAYER_ERROR_INVALID_OPERATION;
4103 int player_set_completed_cb(player_h player, player_completed_cb callback, void *user_data)
4105 return __set_callback(MUSE_PLAYER_EVENT_TYPE_COMPLETE, player, callback, user_data);
4108 static void __retrieve_buffer_cb(void *user_data)
4110 player_cli_s *player = (player_cli_s *)user_data;
4111 int ret = PLAYER_ERROR_NONE;
4112 bool gapless = false;
4114 ret = player_is_gapless((player_h)player, &gapless);
4115 if (ret != PLAYER_ERROR_NONE) {
4116 LOGW("player_is_gapless is failed");
4120 ret = mm_display_interface_evas_flush(DP_INTERFACE(player), gapless);
4122 LOGW("flush all packet : 0x%x [gapless %d]", ret, gapless);
4125 static int __player_set_retrieve_buffer_cb(player_h player, player_retrieve_buffer_cb callback, void *user_data)
4127 return __set_callback(MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER, player, callback, user_data);
4130 static int __player_unset_retrieve_buffer_cb(player_h player)
4132 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER, player);
4135 int player_unset_completed_cb(player_h player)
4137 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_COMPLETE, player);
4140 int player_set_interrupted_cb(player_h player, player_interrupted_cb callback, void *user_data)
4142 return __set_callback(MUSE_PLAYER_EVENT_TYPE_INTERRUPT, player, callback, user_data);
4145 int player_unset_interrupted_cb(player_h player)
4147 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_INTERRUPT, player);
4150 int player_set_error_cb(player_h player, player_error_cb callback, void *user_data)
4152 return __set_callback(MUSE_PLAYER_EVENT_TYPE_ERROR, player, callback, user_data);
4155 int player_unset_error_cb(player_h player)
4157 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_ERROR, player);
4160 int player_set_buffering_cb(player_h player, player_buffering_cb callback, void *user_data)
4162 return __set_callback(MUSE_PLAYER_EVENT_TYPE_BUFFERING, player, callback, user_data);
4165 int player_unset_buffering_cb(player_h player)
4167 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_BUFFERING, player);
4170 int player_set_subtitle_updated_cb(player_h player, player_subtitle_updated_cb callback, void *user_data)
4172 return __set_callback(MUSE_PLAYER_EVENT_TYPE_SUBTITLE, player, callback, user_data);
4175 int player_unset_subtitle_updated_cb(player_h player)
4177 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_SUBTITLE, player);
4180 int player_set_media_packet_video_frame_decoded_cb(player_h player, player_media_packet_video_decoded_cb callback, void *user_data)
4182 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME, player, callback, user_data);
4185 int player_unset_media_packet_video_frame_decoded_cb(player_h player)
4187 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME, player);
4190 int player_set_media_packet_audio_frame_decoded_cb(player_h player, media_format_h format,
4191 player_audio_extract_option_e opt, player_media_packet_audio_decoded_cb callback, void *user_data)
4193 int ret = PLAYER_ERROR_NONE;
4194 player_cli_s *pc = (player_cli_s *)player;
4195 muse_player_api_e api = MUSE_PLAYER_API_SET_MEDIA_PACKET_AUDIO_FRAME_DECODED_CB;
4196 char *ret_buf = NULL;
4197 media_format_mimetype_e mimetype = MEDIA_FORMAT_MAX;
4201 PLAYER_INSTANCE_CHECK(player);
4202 PLAYER_NULL_ARG_CHECK(callback);
4203 PLAYER_RANGE_ARG_CHECK(opt, PLAYER_AUDIO_EXTRACT_DEFAULT, PLAYER_AUDIO_EXTRACT_NO_SYNC_AND_DEINTERLEAVE);
4208 media_format_ref(format);
4209 if (media_format_get_audio_info(format, &mimetype, &channel, &samplerate, NULL, NULL) != MEDIA_FORMAT_ERROR_NONE) {
4210 LOGE("failed to get audio info from media format.");
4211 media_format_unref(format);
4212 return PLAYER_ERROR_INVALID_PARAMETER;
4214 media_format_unref(format);
4216 if (mimetype < MEDIA_FORMAT_PCM || mimetype > MEDIA_FORMAT_PCM_U32BE) {
4217 LOGW("Not supported audio format type : 0x%X", mimetype);
4218 return PLAYER_ERROR_INVALID_PARAMETER;
4222 LOGD("pcm spec : 0x%X, %d, %d", mimetype, channel, samplerate);
4224 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4225 MUSE_TYPE_INT, "opt", opt,
4226 MUSE_TYPE_INT, "mimetype", mimetype,
4227 MUSE_TYPE_INT, "channel", channel,
4228 MUSE_TYPE_INT, "samplerate", samplerate);
4230 if (ret == PLAYER_ERROR_NONE) {
4231 pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME] = callback;
4232 pc->cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME] = user_data;
4233 LOGI("Event type : %d ", MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME);
4240 int player_unset_media_packet_audio_frame_decoded_cb(player_h player)
4242 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME, player);
4245 int player_set_video_stream_changed_cb(player_h player, player_video_stream_changed_cb callback, void *user_data)
4247 return __set_callback(MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED, player, callback, user_data);
4250 int player_unset_video_stream_changed_cb(player_h player)
4252 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED, player);
4255 int player_set_media_stream_buffer_status_cb(player_h player,
4256 player_stream_type_e stream_type, player_media_stream_buffer_status_cb callback, void *user_data)
4258 muse_player_event_e type;
4260 PLAYER_INSTANCE_CHECK(player);
4261 PLAYER_NULL_ARG_CHECK(callback);
4265 if (stream_type == PLAYER_STREAM_TYPE_VIDEO) {
4266 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS;
4267 } else if (stream_type == PLAYER_STREAM_TYPE_AUDIO) {
4268 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS;
4270 LOGE("PLAYER_ERROR_INVALID_PARAMETER(type : %d)", stream_type);
4271 return PLAYER_ERROR_INVALID_PARAMETER;
4274 return __set_callback(type, player, callback, user_data);
4277 int player_unset_media_stream_buffer_status_cb(player_h player, player_stream_type_e stream_type)
4279 muse_player_event_e type;
4281 PLAYER_INSTANCE_CHECK(player);
4285 if (stream_type == PLAYER_STREAM_TYPE_VIDEO) {
4286 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS;
4287 } else if (stream_type == PLAYER_STREAM_TYPE_AUDIO) {
4288 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS;
4290 LOGE("PLAYER_ERROR_INVALID_PARAMETER(type : %d)", stream_type);
4291 return PLAYER_ERROR_INVALID_PARAMETER;
4294 return __unset_callback(type, player);
4297 int player_set_media_stream_seek_cb(player_h player,
4298 player_stream_type_e stream_type, player_media_stream_seek_cb callback, void *user_data)
4300 muse_player_event_e type;
4302 PLAYER_INSTANCE_CHECK(player);
4303 PLAYER_NULL_ARG_CHECK(callback);
4307 if (stream_type == PLAYER_STREAM_TYPE_VIDEO) {
4308 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK;
4309 } else if (stream_type == PLAYER_STREAM_TYPE_AUDIO) {
4310 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK;
4312 LOGE("PLAYER_ERROR_INVALID_PARAMETER(type : %d)", stream_type);
4313 return PLAYER_ERROR_INVALID_PARAMETER;
4316 return __set_callback(type, player, callback, user_data);
4319 int player_unset_media_stream_seek_cb(player_h player, player_stream_type_e stream_type)
4321 muse_player_event_e type;
4323 PLAYER_INSTANCE_CHECK(player);
4327 if (stream_type == PLAYER_STREAM_TYPE_VIDEO) {
4328 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK;
4329 } else if (stream_type == PLAYER_STREAM_TYPE_AUDIO) {
4330 type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK;
4332 LOGE("PLAYER_ERROR_INVALID_PARAMETER(type : %d)", stream_type);
4333 return PLAYER_ERROR_INVALID_PARAMETER;
4336 return __unset_callback(type, player);
4339 /* TODO Implement raw data socket channel */
4340 int player_push_media_stream(player_h player, media_packet_h packet)
4342 int ret = PLAYER_ERROR_NONE;
4343 int packet_ret = MEDIA_PACKET_ERROR_NONE;
4344 player_cli_s *pc = (player_cli_s *)player;
4345 muse_player_api_e api = MUSE_PLAYER_API_PUSH_MEDIA_STREAM;
4346 char *ret_buf = NULL;
4347 player_push_media_msg_type push_media;
4348 char *push_media_msg = (char *)&push_media;
4349 int msg_size = sizeof(player_push_media_msg_type);
4353 tbm_bo_handle thandle;
4354 tbm_fd tfd = INVALID_DEFAULT_VALUE;
4357 media_format_h format;
4361 int arr_msg_len = 0;
4362 char *codec_data = NULL;
4363 unsigned int codec_data_size = 0;
4365 PLAYER_INSTANCE_CHECK(player);
4366 PLAYER_NULL_ARG_CHECK(packet);
4370 if (media_packet_get_buffer_data_ptr(packet, (void **)&buf) != MEDIA_PACKET_ERROR_NONE) {
4371 LOGE("failed to get buffer data ptr");
4372 return PLAYER_ERROR_INVALID_OPERATION;
4375 if (media_packet_get_buffer_size(packet, &push_media.size) != MEDIA_PACKET_ERROR_NONE) {
4376 LOGE("failed to get buffer size");
4377 return PLAYER_ERROR_INVALID_OPERATION;
4380 if (media_packet_get_pts(packet, &push_media.pts) != MEDIA_PACKET_ERROR_NONE) {
4381 LOGE("failed to get buffer pts");
4382 return PLAYER_ERROR_INVALID_OPERATION;
4385 if (media_packet_get_format(packet, &format) != MEDIA_PACKET_ERROR_NONE) { /* format ref count is increased */
4386 LOGE("failed to get media format");
4387 return PLAYER_ERROR_INVALID_OPERATION;
4390 packet_ret = media_packet_get_flags(packet, &push_media.flags);
4391 packet_ret |= media_packet_is_video(packet, &is_video);
4392 packet_ret |= media_packet_is_audio(packet, &is_audio);
4393 packet_ret |= media_packet_is_end_of_stream(packet, &is_eos);
4395 packet_ret |= media_format_get_video_info(format, &push_media.mimetype,
4396 &push_media.width, &push_media.height, NULL, NULL);
4398 packet_ret |= media_format_get_audio_info(format, &push_media.mimetype,
4399 &push_media.channels, &push_media.samplerate, NULL, NULL);
4401 media_format_unref(format);
4403 if (packet_ret != MEDIA_PACKET_ERROR_NONE) {
4404 LOGE("failed to get media packet info");
4405 return PLAYER_ERROR_INVALID_OPERATION;
4408 if (media_packet_get_codec_data(packet, (void **)&codec_data, &codec_data_size) == MEDIA_PACKET_ERROR_NONE) {
4409 if (codec_data_size > 0 && codec_data_size <= sizeof(push_media.codec_data))
4410 memcpy(push_media.codec_data, codec_data, codec_data_size);
4413 push_media.codec_data_size = codec_data_size;
4414 push_media.buf_type = PUSH_MEDIA_BUF_TYPE_RAW;
4417 int arr_buf_len = 0;
4419 if (push_media.buf_type == PUSH_MEDIA_BUF_TYPE_TBM) {
4420 bo = tbm_bo_alloc(pc->cb_info->bufmgr, push_media.size, TBM_BO_DEFAULT);
4422 LOGE("TBM get error : bo is NULL");
4423 return PLAYER_ERROR_INVALID_OPERATION;
4425 thandle = tbm_bo_map(bo, TBM_DEVICE_CPU, TBM_OPTION_WRITE);
4426 if (thandle.ptr == NULL) {
4427 LOGE("TBM get error : handle pointer is NULL");
4428 ret = PLAYER_ERROR_INVALID_OPERATION;
4431 memcpy(thandle.ptr, buf, push_media.size);
4434 tfd = tbm_bo_export_fd(bo);
4436 LOGE("tbm_bo_export_fd err 0x%x", tfd);
4437 ret = PLAYER_ERROR_INVALID_OPERATION;
4441 arr_msg_len = (msg_size / sizeof(int) + (msg_size % sizeof(int) ? 1 : 0));
4442 PLAYER_SEND_MSG_WITH_TFD(api, pc, tfd, ret_buf, ret,
4443 MUSE_TYPE_ARRAY, "push_media_msg", arr_msg_len, (int *)push_media_msg);
4445 } else if (push_media.buf_type == PUSH_MEDIA_BUF_TYPE_MSG) {
4446 buf_size = (int)push_media.size;
4448 arr_msg_len = (msg_size / sizeof(int) + (msg_size % sizeof(int) ? 1 : 0));
4449 arr_buf_len = (buf_size / sizeof(int) + (buf_size % sizeof(int) ? 1 : 0));
4450 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4451 MUSE_TYPE_ARRAY, "push_media_msg", arr_msg_len, (int *)push_media_msg,
4452 MUSE_TYPE_ARRAY, "buf", arr_buf_len, (int *)buf);
4456 if (push_media.buf_type == PUSH_MEDIA_BUF_TYPE_RAW) {
4457 buf_size = (int)push_media.size;
4458 if ((muse_client_ipc_push_data(pc->cb_info->data_fd, buf, buf_size, push_media.pts) < 0) && (!is_eos)) {
4459 LOGE("failed to send data");
4460 return PLAYER_ERROR_INVALID_OPERATION;
4463 arr_msg_len = (msg_size / sizeof(int) + (msg_size % sizeof(int) ? 1 : 0));
4464 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4465 MUSE_TYPE_ARRAY, "push_media_msg", arr_msg_len, (int *)push_media_msg);
4468 LOGD("ret_buf %s", ret_buf);
4473 PLAYER_CLOSE_FD(tfd);
4475 if (push_media.buf_type == PUSH_MEDIA_BUF_TYPE_TBM)
4483 int player_foreach_media_stream_supported_format(player_h player, player_supported_media_format_cb callback, void *user_data)
4485 int ret = PLAYER_ERROR_NONE;
4486 player_cli_s *pc = (player_cli_s *)player;
4487 muse_player_api_e api = MUSE_PLAYER_API_GET_MEDIA_STREAM_SUPPORTED_FORMAT;
4488 char *ret_buf = NULL;
4489 int format_info[MAX_SUPPORTED_MEDIA_FORMAT] = {0,};
4490 int len = 0, idx = 0;
4492 PLAYER_INSTANCE_CHECK(player);
4493 PLAYER_NULL_ARG_CHECK(callback);
4497 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4499 player_msg_get_type(len, ret_buf, INT);
4500 player_msg_get_array(format_info, ret_buf);
4502 LOGD("num of format %d", len);
4503 for (idx = 0 ; idx < len ; idx++) {
4504 if (!callback(format_info[idx], user_data)) {
4505 LOGW("stop foreach callback");
4510 LOGD("LEAVE 0x%X", ret);
4515 int player_set_media_stream_info(player_h player, player_stream_type_e type, media_format_h format)
4517 g_return_val_if_fail(format, PLAYER_ERROR_INVALID_OPERATION);
4518 int ret = PLAYER_ERROR_NONE;
4519 player_cli_s *pc = (player_cli_s *)player;
4520 muse_player_api_e api = MUSE_PLAYER_API_SET_MEDIA_STREAM_INFO;
4521 char *ret_buf = NULL;
4522 media_format_mimetype_e mimetype;
4532 PLAYER_INSTANCE_CHECK(player);
4536 media_format_ref(format);
4537 if (type == PLAYER_STREAM_TYPE_VIDEO) {
4538 if (media_format_get_video_info(format, &mimetype, &width, &height, &avg_bps, &max_bps) != MEDIA_FORMAT_ERROR_NONE ||
4539 media_format_get_video_frame_rate(format, &frame_rate) != MEDIA_FORMAT_ERROR_NONE) {
4540 LOGE("failed to get video info from format.");
4541 return PLAYER_ERROR_INVALID_PARAMETER;
4544 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4545 MUSE_TYPE_INT, "type", type,
4546 MUSE_TYPE_INT, "mimetype", mimetype,
4547 MUSE_TYPE_INT, "width", width,
4548 MUSE_TYPE_INT, "height", height,
4549 MUSE_TYPE_INT, "avg_bps", avg_bps,
4550 MUSE_TYPE_INT, "max_bps", max_bps,
4551 MUSE_TYPE_INT, "frame_rate", frame_rate);
4553 } else if (type == PLAYER_STREAM_TYPE_AUDIO) {
4554 if (media_format_get_audio_info(format, &mimetype, &channel, &samplerate, &bit, &avg_bps) != MEDIA_FORMAT_ERROR_NONE) {
4555 LOGE("failed to get audio info from format.");
4556 return PLAYER_ERROR_INVALID_PARAMETER;
4559 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4560 MUSE_TYPE_INT, "type", type,
4561 MUSE_TYPE_INT, "mimetype", mimetype,
4562 MUSE_TYPE_INT, "channel", channel,
4563 MUSE_TYPE_INT, "samplerate", samplerate,
4564 MUSE_TYPE_INT, "avg_bps", avg_bps,
4565 MUSE_TYPE_INT, "bit", bit);
4568 media_format_unref(format);
4569 pc->push_media_stream = TRUE;
4575 int player_set_media_stream_buffer_max_size(player_h player, player_stream_type_e type, unsigned long long max_size)
4577 int ret = PLAYER_ERROR_NONE;
4578 player_cli_s *pc = (player_cli_s *)player;
4579 muse_player_api_e api = MUSE_PLAYER_API_SET_MEDIA_STREAM_BUFFER_MAX_SIZE;
4580 char *ret_buf = NULL;
4582 PLAYER_INSTANCE_CHECK(player);
4583 PLAYER_RANGE_ARG_CHECK(type, PLAYER_STREAM_TYPE_AUDIO, PLAYER_STREAM_TYPE_VIDEO);
4584 PLAYER_CHECK_CONDITION(max_size > 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
4588 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4589 MUSE_TYPE_INT, "type", type,
4590 MUSE_TYPE_INT64, "max_size", (INT64)max_size);
4596 int player_get_media_stream_buffer_max_size(player_h player, player_stream_type_e type, unsigned long long *pmax_size)
4598 int ret = PLAYER_ERROR_NONE;
4599 player_cli_s *pc = (player_cli_s *)player;
4600 muse_player_api_e api = MUSE_PLAYER_API_GET_MEDIA_STREAM_BUFFER_MAX_SIZE;
4601 char *ret_buf = NULL;
4602 unsigned long long max_size;
4604 PLAYER_INSTANCE_CHECK(player);
4605 PLAYER_NULL_ARG_CHECK(pmax_size);
4606 PLAYER_RANGE_ARG_CHECK(type, PLAYER_STREAM_TYPE_AUDIO, PLAYER_STREAM_TYPE_VIDEO);
4610 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "type", type);
4611 if (ret == PLAYER_ERROR_NONE) {
4612 player_msg_get_type(max_size, ret_buf, INT64);
4613 *pmax_size = max_size;
4619 int player_set_media_stream_buffer_min_threshold(player_h player, player_stream_type_e type, unsigned int percent)
4621 int ret = PLAYER_ERROR_NONE;
4622 player_cli_s *pc = (player_cli_s *)player;
4623 muse_player_api_e api = MUSE_PLAYER_API_SET_MEDIA_STREAM_BUFFER_MIN_THRESHOLD;
4624 char *ret_buf = NULL;
4626 PLAYER_INSTANCE_CHECK(player);
4627 PLAYER_RANGE_ARG_CHECK(type, PLAYER_STREAM_TYPE_DEFAULT, PLAYER_STREAM_TYPE_TEXT);
4631 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4632 MUSE_TYPE_INT, "type", type,
4633 MUSE_TYPE_INT, "percent", (int)percent);
4639 int player_get_media_stream_buffer_min_threshold(player_h player, player_stream_type_e type, unsigned int *ppercent)
4641 int ret = PLAYER_ERROR_NONE;
4642 player_cli_s *pc = (player_cli_s *)player;
4643 muse_player_api_e api = MUSE_PLAYER_API_GET_MEDIA_STREAM_BUFFER_MIN_THRESHOLD;
4644 char *ret_buf = NULL;
4645 unsigned int percent;
4647 PLAYER_INSTANCE_CHECK(player);
4648 PLAYER_NULL_ARG_CHECK(ppercent);
4652 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "type", type);
4653 if (ret == PLAYER_ERROR_NONE) {
4654 player_msg_get(percent, ret_buf);
4655 *ppercent = percent;
4662 int player_get_track_count(player_h player, player_stream_type_e type, int *pcount)
4664 int ret = PLAYER_ERROR_NONE;
4665 player_cli_s *pc = (player_cli_s *)player;
4666 muse_player_api_e api = MUSE_PLAYER_API_GET_TRACK_COUNT;
4667 char *ret_buf = NULL;
4670 PLAYER_INSTANCE_CHECK(player);
4671 PLAYER_NULL_ARG_CHECK(pcount);
4675 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "type", type);
4676 if (ret == PLAYER_ERROR_NONE) {
4677 player_msg_get(count, ret_buf);
4685 int player_get_current_track(player_h player, player_stream_type_e type, int *pindex)
4687 int ret = PLAYER_ERROR_NONE;
4688 player_cli_s *pc = (player_cli_s *)player;
4689 muse_player_api_e api = MUSE_PLAYER_API_GET_CURRENT_TRACK;
4690 char *ret_buf = NULL;
4693 PLAYER_INSTANCE_CHECK(player);
4694 PLAYER_NULL_ARG_CHECK(pindex);
4698 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "type", type);
4699 if (ret == PLAYER_ERROR_NONE) {
4700 player_msg_get(index, ret_buf);
4708 int player_select_track(player_h player, player_stream_type_e type, int index)
4710 int ret = PLAYER_ERROR_NONE;
4711 player_cli_s *pc = (player_cli_s *)player;
4712 muse_player_api_e api = MUSE_PLAYER_API_SELECT_TRACK;
4713 char *ret_buf = NULL;
4715 PLAYER_INSTANCE_CHECK(player);
4719 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "type", type, MUSE_TYPE_INT, "index", index);
4725 int player_get_track_language_code(player_h player, player_stream_type_e type, int index, char **pcode)
4727 int ret = PLAYER_ERROR_NONE;
4728 player_cli_s *pc = (player_cli_s *)player;
4729 muse_player_api_e api = MUSE_PLAYER_API_GET_TRACK_LANGUAGE_CODE;
4730 char *ret_buf = NULL;
4731 char code[MUSE_MSG_MAX_LENGTH] = { 0, };
4734 PLAYER_INSTANCE_CHECK(player);
4735 PLAYER_NULL_ARG_CHECK(pcode);
4739 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "type", type, MUSE_TYPE_INT, "index", index);
4740 if (ret == PLAYER_ERROR_NONE) {
4741 bool recv_ret = true;
4742 recv_ret = _player_get_param_value(ret_buf,
4743 MUSE_TYPE_INT, "code_len", (void *)&code_len,
4744 MUSE_TYPE_STRING, "code", (void *)code,
4745 INVALID_MUSE_TYPE_VALUE);
4747 *pcode = strndup(code, code_len);
4749 ret = PLAYER_ERROR_INVALID_OPERATION;
4755 int player_foreach_adaptive_variant(player_h player, player_adaptive_variant_cb callback, void *user_data)
4757 int ret = PLAYER_ERROR_NONE;
4758 player_cli_s *pc = (player_cli_s *)player;
4759 muse_player_api_e api = MUSE_PLAYER_API_GET_ADAPTIVE_VARIANT_INFO;
4760 char *ret_buf = NULL;
4761 char var_info[MUSE_MSG_MAX_LENGTH] = { 0, };
4762 int idx = 0, num = 0;
4763 int bandwidth = 0, width = 0, height = 0;
4767 PLAYER_INSTANCE_CHECK(player);
4768 PLAYER_NULL_ARG_CHECK(callback);
4772 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4773 if (ret == PLAYER_ERROR_NONE) {
4774 player_msg_get_type(num, ret_buf, INT);
4776 player_msg_get_string(var_info, ret_buf);
4778 LOGW("There is no stream variant info.");
4781 for (idx = 0 ; idx < num ; idx++) {
4782 bandwidth = width = height = 0;
4784 token = strtok_r((ptr != NULL) ? (NULL) : (var_info), ",", &ptr);
4786 bandwidth = atoi(token);
4788 token = strtok_r(NULL, ",", &ptr);
4790 width = atoi(token);
4792 token = strtok_r(NULL, ",", &ptr);
4794 height = atoi(token);
4796 callback(bandwidth, width, height, user_data);
4799 LOGD("LEAVE 0x%X", ret);
4804 int player_set_max_adaptive_variant_limit(player_h player, int bandwidth, int width, int height)
4806 int ret = PLAYER_ERROR_NONE;
4807 player_cli_s *pc = (player_cli_s *)player;
4808 muse_player_api_e api = MUSE_PLAYER_API_SET_MAX_ADAPTIVE_VARIANT_LIMIT;
4809 char *ret_buf = NULL;
4811 PLAYER_INSTANCE_CHECK(player);
4812 PLAYER_CHECK_CONDITION(bandwidth >= -1 && width >= -1 && height >= -1,
4813 PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
4817 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4818 MUSE_TYPE_INT, "bandwidth", bandwidth,
4819 MUSE_TYPE_INT, "width", width,
4820 MUSE_TYPE_INT, "height", height);
4823 LOGD("LEAVE 0x%X", ret);
4828 int player_get_max_adaptive_variant_limit(player_h player, int *pbandwidth, int *pwidth, int *pheight)
4830 int ret = PLAYER_ERROR_NONE;
4831 player_cli_s *pc = (player_cli_s *)player;
4832 muse_player_api_e api = MUSE_PLAYER_API_GET_MAX_ADAPTIVE_VARIANT_LIMIT;
4833 char *ret_buf = NULL;
4834 int bandwidth = -1, width = -1, height = -1;
4836 PLAYER_INSTANCE_CHECK(player);
4837 PLAYER_NULL_ARG_CHECK(pbandwidth || pwidth || pheight);
4841 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4842 if (ret == PLAYER_ERROR_NONE) {
4843 bool ret_val = true;
4844 ret_val = _player_get_param_value(ret_buf,
4845 MUSE_TYPE_INT, "bandwidth", (void *)&bandwidth,
4846 MUSE_TYPE_INT, "width", (void *)&width,
4847 MUSE_TYPE_INT, "height", (void *)&height,
4848 INVALID_MUSE_TYPE_VALUE);
4850 if (pbandwidth) *pbandwidth = bandwidth;
4851 if (pwidth) *pwidth = width;
4852 if (pheight) *pheight = height;
4854 ret = PLAYER_ERROR_INVALID_OPERATION;
4859 LOGD("LEAVE 0x%X", ret);
4863 int player_set_audio_only(player_h player, bool audio_only)
4865 int ret = PLAYER_ERROR_NONE;
4866 player_cli_s *pc = (player_cli_s *)player;
4867 muse_player_api_e api = MUSE_PLAYER_API_SET_AUDIO_ONLY;
4868 char *ret_buf = NULL;
4869 player_state_e state = PLAYER_STATE_NONE;
4871 PLAYER_INSTANCE_CHECK(player);
4873 LOGD("ENTER audio_only: %d", audio_only);
4875 /* check player state */
4876 if (_get_current_state(pc, &state) != PLAYER_ERROR_NONE) {
4877 LOGE("Failed to get state");
4878 return PLAYER_ERROR_INVALID_OPERATION;
4881 if (state < PLAYER_STATE_READY) {
4882 LOGE("Invalid state %d", state);
4883 return PLAYER_ERROR_INVALID_STATE;
4886 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "audio_only", (int)audio_only);
4890 LOGD("LEAVE 0x%X", ret);
4895 int player_is_audio_only(player_h player, bool *paudio_only)
4897 int ret = PLAYER_ERROR_NONE;
4898 muse_player_api_e api = MUSE_PLAYER_API_IS_AUDIO_ONLY;
4899 player_cli_s *pc = (player_cli_s *)player;
4900 char *ret_buf = NULL;
4903 PLAYER_INSTANCE_CHECK(player);
4904 PLAYER_NULL_ARG_CHECK(paudio_only);
4908 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4910 if (ret == PLAYER_ERROR_NONE) {
4911 player_msg_get(audio_only, ret_buf);
4912 *paudio_only = (bool)audio_only;
4917 LOGD("LEAVE 0x%X", ret);
4922 int player_set_streaming_buffering_time(player_h player, int prebuffer_ms, int rebuffer_ms)
4924 #define MIN_BUFFER_TIME -1
4925 int ret = PLAYER_ERROR_NONE;
4926 player_cli_s *pc = (player_cli_s *)player;
4927 muse_player_api_e api = MUSE_PLAYER_API_SET_STREAMING_BUFFERING_TIME;
4928 char *ret_buf = NULL;
4930 PLAYER_INSTANCE_CHECK(player);
4931 PLAYER_CHECK_CONDITION(prebuffer_ms >= MIN_BUFFER_TIME && rebuffer_ms >= MIN_BUFFER_TIME,
4932 PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
4936 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
4937 MUSE_TYPE_INT, "prebuffer_ms", prebuffer_ms,
4938 MUSE_TYPE_INT, "rebuffer_ms", rebuffer_ms);
4941 LOGD("LEAVE 0x%X", ret);
4945 int player_get_streaming_buffering_time(player_h player, int *prebuffer_ms, int *rebuffer_ms)
4947 int ret = PLAYER_ERROR_NONE;
4948 muse_player_api_e api = MUSE_PLAYER_API_GET_STREAMING_BUFFERING_TIME;
4949 player_cli_s *pc = (player_cli_s *)player;
4950 int prebuffering_time = 0, rebuffering_time = 0;
4951 char *ret_buf = NULL;
4953 PLAYER_INSTANCE_CHECK(player);
4954 PLAYER_NULL_ARG_CHECK(prebuffer_ms || rebuffer_ms);
4958 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4960 if (ret == PLAYER_ERROR_NONE) {
4961 bool ret_val = true;
4962 ret_val = _player_get_param_value(ret_buf,
4963 MUSE_TYPE_INT, "prebuffer_ms", (void *)&prebuffering_time,
4964 MUSE_TYPE_INT, "rebuffer_ms", (void *)&rebuffering_time,
4965 INVALID_MUSE_TYPE_VALUE);
4967 if (prebuffer_ms) *prebuffer_ms = prebuffering_time;
4968 if (rebuffer_ms) *rebuffer_ms = rebuffering_time;
4970 ret = PLAYER_ERROR_INVALID_OPERATION;
4976 LOGD("LEAVE 0x%X", ret);
4980 int player_360_is_content_spherical(player_h player, bool *is_spherical)
4982 int ret = PLAYER_ERROR_NONE;
4983 muse_player_api_e api = MUSE_PLAYER_API_360_IS_CONTENT_SPHERICAL;
4984 player_cli_s *pc = (player_cli_s *)player;
4985 char *ret_buf = NULL;
4988 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
4989 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
4990 PLAYER_INSTANCE_CHECK(player);
4991 PLAYER_NULL_ARG_CHECK(is_spherical);
4995 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
4996 if (ret == PLAYER_ERROR_NONE) {
4997 player_msg_get(val, ret_buf);
4998 *is_spherical = val;
5002 LOGD("LEAVE 0x%X", ret);
5006 int player_360_set_enabled(player_h player, bool enabled)
5008 int ret = PLAYER_ERROR_NONE;
5009 muse_player_api_e api = MUSE_PLAYER_API_360_SET_ENABLED;
5010 player_cli_s *pc = (player_cli_s *)player;
5011 char *ret_buf = NULL;
5012 int val = (int)enabled;
5014 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5015 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5016 PLAYER_INSTANCE_CHECK(player);
5018 LOGD("ENTER %d", enabled);
5020 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "val", val);
5023 LOGD("LEAVE 0x%X", ret);
5027 int player_360_is_enabled(player_h player, bool *enabled)
5029 int ret = PLAYER_ERROR_NONE;
5030 muse_player_api_e api = MUSE_PLAYER_API_360_IS_ENABLED;
5031 player_cli_s *pc = (player_cli_s *)player;
5032 char *ret_buf = NULL;
5035 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5036 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5037 PLAYER_INSTANCE_CHECK(player);
5038 PLAYER_NULL_ARG_CHECK(enabled);
5042 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5043 if (ret == PLAYER_ERROR_NONE) {
5044 player_msg_get(val, ret_buf);
5049 LOGD("LEAVE 0x%X", ret);
5053 int player_360_set_direction_of_view(player_h player, float yaw, float pitch)
5055 int ret = PLAYER_ERROR_NONE;
5056 muse_player_api_e api = MUSE_PLAYER_API_360_SET_DIRECTION_OF_VIEW;
5057 player_cli_s *pc = (player_cli_s *)player;
5058 char *ret_buf = NULL;
5060 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5061 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5062 PLAYER_INSTANCE_CHECK(player);
5063 PLAYER_RANGE_ARG_CHECK(yaw, (float)-M_PI, (float)M_PI);
5064 PLAYER_RANGE_ARG_CHECK(pitch, ((float)-M_PI / 2), ((float)M_PI / 2));
5066 LOGD("ENTER %f %f", yaw, pitch);
5068 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
5069 MUSE_TYPE_DOUBLE, "yaw", (double)yaw,
5070 MUSE_TYPE_DOUBLE, "pitch", (double)pitch);
5074 LOGD("LEAVE 0x%X", ret);
5078 int player_360_get_direction_of_view(player_h player, float *yaw, float *pitch)
5080 int ret = PLAYER_ERROR_NONE;
5081 muse_player_api_e api = MUSE_PLAYER_API_360_GET_DIRECTION_OF_VIEW;
5082 player_cli_s *pc = (player_cli_s *)player;
5083 double yaw_val = -1;
5084 double pitch_val = -1;
5085 char *ret_buf = NULL;
5087 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5088 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5089 PLAYER_INSTANCE_CHECK(player);
5090 PLAYER_NULL_ARG_CHECK(yaw && pitch);
5094 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5096 if (ret == PLAYER_ERROR_NONE) {
5097 bool ret_val = true;
5098 ret_val = _player_get_param_value(ret_buf,
5099 MUSE_TYPE_DOUBLE, "yaw_val", (void *)&yaw_val,
5100 MUSE_TYPE_DOUBLE, "pitch_val", (void *)&pitch_val,
5101 INVALID_MUSE_TYPE_VALUE);
5103 *yaw = (float)yaw_val;
5104 *pitch = (float)pitch_val;
5106 LOGE("failed to get value from msg");
5107 ret = PLAYER_ERROR_INVALID_OPERATION;
5113 LOGD("LEAVE 0x%X", ret);
5117 int player_360_set_zoom(player_h player, float level)
5119 int ret = PLAYER_ERROR_NONE;
5120 muse_player_api_e api = MUSE_PLAYER_API_360_SET_ZOOM;
5121 player_cli_s *pc = (player_cli_s *)player;
5122 char *ret_buf = NULL;
5124 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5125 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5126 PLAYER_INSTANCE_CHECK(player);
5127 PLAYER_RANGE_ARG_CHECK(level, 1.0, 10.0);
5129 LOGD("ENTER %f", level);
5131 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_DOUBLE, "level", (double)level);
5134 LOGD("LEAVE 0x%X", ret);
5138 int player_360_get_zoom(player_h player, float *level)
5140 int ret = PLAYER_ERROR_NONE;
5141 muse_player_api_e api = MUSE_PLAYER_API_360_GET_ZOOM;
5142 player_cli_s *pc = (player_cli_s *)player;
5144 char *ret_buf = NULL;
5146 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5147 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5148 PLAYER_INSTANCE_CHECK(player);
5149 PLAYER_NULL_ARG_CHECK(level);
5153 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5155 if (ret == PLAYER_ERROR_NONE) {
5156 if (player_msg_get_type(zoom, ret_buf, DOUBLE)) {
5157 *level = (float)zoom;
5159 LOGE("failed to get value from msg");
5160 ret = PLAYER_ERROR_INVALID_OPERATION;
5166 LOGD("LEAVE 0x%X", ret);
5170 int player_360_set_field_of_view(player_h player, int horizontal_degrees, int vertical_degrees)
5172 int ret = PLAYER_ERROR_NONE;
5173 muse_player_api_e api = MUSE_PLAYER_API_360_SET_FIELD_OF_VIEW;
5174 player_cli_s *pc = (player_cli_s *)player;
5175 char *ret_buf = NULL;
5177 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5178 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5179 PLAYER_INSTANCE_CHECK(player);
5180 PLAYER_RANGE_ARG_CHECK(horizontal_degrees, 1, 360);
5181 PLAYER_RANGE_ARG_CHECK(vertical_degrees, 1, 180);
5183 LOGD("ENTER %d %d", horizontal_degrees, vertical_degrees);
5185 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
5186 MUSE_TYPE_INT, "horizontal_degrees", horizontal_degrees,
5187 MUSE_TYPE_INT, "vertical_degrees", vertical_degrees);
5190 LOGD("LEAVE 0x%X", ret);
5194 int player_360_get_field_of_view(player_h player, int *horizontal_degrees, int *vertical_degrees)
5196 int ret = PLAYER_ERROR_NONE;
5197 muse_player_api_e api = MUSE_PLAYER_API_360_GET_FIELD_OF_VIEW;
5198 player_cli_s *pc = (player_cli_s *)player;
5201 char *ret_buf = NULL;
5203 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5204 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5205 PLAYER_INSTANCE_CHECK(player);
5206 PLAYER_NULL_ARG_CHECK(horizontal_degrees && vertical_degrees);
5210 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5212 if (ret == PLAYER_ERROR_NONE) {
5213 bool ret_val = true;
5214 ret_val = _player_get_param_value(ret_buf,
5215 MUSE_TYPE_INT, "h_val", (void *)&h_val,
5216 MUSE_TYPE_INT, "v_val", (void *)&v_val,
5217 INVALID_MUSE_TYPE_VALUE);
5219 *horizontal_degrees = h_val;
5220 *vertical_degrees = v_val;
5222 LOGE("failed to get value from msg");
5223 ret = PLAYER_ERROR_INVALID_OPERATION;
5229 LOGD("LEAVE 0x%X", ret);
5233 int player_360_set_zoom_with_field_of_view(player_h player, float level, int horizontal_degrees, int vertical_degrees)
5235 int ret = PLAYER_ERROR_NONE;
5236 muse_player_api_e api = MUSE_PLAYER_API_360_SET_ZOOM_WITH_FIELD_OF_VIEW;
5237 player_cli_s *pc = (player_cli_s *)player;
5238 char *ret_buf = NULL;
5240 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_OPENGL);
5241 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_SPHERICAL_VIDEO);
5242 PLAYER_INSTANCE_CHECK(player);
5243 PLAYER_RANGE_ARG_CHECK(horizontal_degrees, 1, 360);
5244 PLAYER_RANGE_ARG_CHECK(vertical_degrees, 1, 180);
5245 PLAYER_RANGE_ARG_CHECK(level, 1.0, 10.0);
5247 LOGD("ENTER %f %d %d", level, horizontal_degrees, vertical_degrees);
5249 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
5250 MUSE_TYPE_DOUBLE, "level", (double)level,
5251 MUSE_TYPE_INT, "horizontal_degrees", horizontal_degrees,
5252 MUSE_TYPE_INT, "vertical_degrees", vertical_degrees);
5255 LOGD("LEAVE 0x%X", ret);
5259 int player_set_replaygain_enabled(player_h player, bool enabled)
5261 int ret = PLAYER_ERROR_NONE;
5262 muse_player_api_e api = MUSE_PLAYER_API_SET_REPLAYGAIN_ENABLED;
5263 player_cli_s *pc = (player_cli_s *)player;
5264 char *ret_buf = NULL;
5265 int val = (int)enabled;
5267 PLAYER_INSTANCE_CHECK(player);
5271 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "val", val);
5276 int player_is_replaygain_enabled(player_h player, bool *enabled)
5278 int ret = PLAYER_ERROR_NONE;
5279 muse_player_api_e api = MUSE_PLAYER_API_IS_REPLAYGAIN_ENABLED;
5280 player_cli_s *pc = (player_cli_s *)player;
5281 char *ret_buf = NULL;
5284 PLAYER_INSTANCE_CHECK(player);
5285 PLAYER_NULL_ARG_CHECK(enabled);
5289 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5290 if (ret == PLAYER_ERROR_NONE) {
5291 player_msg_get(val, ret_buf);
5292 *enabled = (bool)val;
5299 int player_audio_pitch_set_enabled(player_h player, bool enabled)
5301 int ret = PLAYER_ERROR_NONE;
5302 muse_player_api_e api = MUSE_PLAYER_API_PITCH_SET_ENABLED;
5303 player_cli_s *pc = (player_cli_s *)player;
5304 char *ret_buf = NULL;
5305 int val = (int)enabled;
5307 PLAYER_INSTANCE_CHECK(player);
5311 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "val", val);
5316 int player_audio_pitch_is_enabled(player_h player, bool *enabled)
5318 int ret = PLAYER_ERROR_NONE;
5319 muse_player_api_e api = MUSE_PLAYER_API_PITCH_IS_ENABLED;
5320 player_cli_s *pc = (player_cli_s *)player;
5321 char *ret_buf = NULL;
5324 PLAYER_INSTANCE_CHECK(player);
5325 PLAYER_NULL_ARG_CHECK(enabled);
5329 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5330 if (ret == PLAYER_ERROR_NONE) {
5331 player_msg_get(val, ret_buf);
5332 *enabled = (bool)val;
5339 int player_audio_pitch_set_value(player_h player, float value)
5341 int ret = PLAYER_ERROR_NONE;
5342 muse_player_api_e api = MUSE_PLAYER_API_PITCH_SET_VALUE;
5343 player_cli_s *pc = (player_cli_s *)player;
5344 char *ret_buf = NULL;
5346 PLAYER_INSTANCE_CHECK(player);
5347 PLAYER_RANGE_ARG_CHECK(value, 0.5, 2.0);
5349 LOGD("ENTER %1.3f", value);
5351 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_DOUBLE, "pitch", (double)value);
5354 LOGD("LEAVE 0x%X", ret);
5358 int player_audio_pitch_get_value(player_h player, float *value)
5360 int ret = PLAYER_ERROR_NONE;
5361 muse_player_api_e api = MUSE_PLAYER_API_PITCH_GET_VALUE;
5362 player_cli_s *pc = (player_cli_s *)player;
5364 char *ret_buf = NULL;
5366 PLAYER_INSTANCE_CHECK(player);
5367 PLAYER_NULL_ARG_CHECK(value);
5371 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5373 if (ret == PLAYER_ERROR_NONE) {
5374 if (player_msg_get_type(pitch, ret_buf, DOUBLE)) {
5375 *value = (float)pitch;
5377 LOGE("failed to get pitch value");
5378 ret = PLAYER_ERROR_INVALID_OPERATION;
5384 LOGD("LEAVE 0x%X", ret);
5388 int player_audio_offload_foreach_supported_format(player_h player, player_supported_media_format_cb callback, void *user_data)
5390 int ret = PLAYER_ERROR_NONE;
5391 player_cli_s *pc = (player_cli_s *)player;
5392 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_OFFLOAD_GET_SUPPORTED_FORMAT;
5393 char *ret_buf = NULL;
5394 int format_info[MAX_SUPPORTED_MEDIA_FORMAT] = {0,};
5395 int len = 0, idx = 0;
5397 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_AUDIO_OFFLOAD);
5398 PLAYER_INSTANCE_CHECK(player);
5399 PLAYER_NULL_ARG_CHECK(callback);
5403 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5405 player_msg_get_type(len, ret_buf, INT);
5406 player_msg_get_array(format_info, ret_buf);
5408 LOGD("num of format %d", len);
5409 for (idx = 0 ; idx < len ; idx++) {
5410 if (!callback(format_info[idx], user_data)) {
5411 LOGW("stop foreach callback");
5416 LOGD("LEAVE 0x%X", ret);
5421 int player_audio_offload_set_enabled(player_h player, bool enabled)
5423 int ret = PLAYER_ERROR_NONE;
5424 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_OFFLOAD_SET_ENABLED;
5425 player_cli_s *pc = (player_cli_s *)player;
5426 char *ret_buf = NULL;
5427 int val = (int)enabled;
5429 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_AUDIO_OFFLOAD);
5430 PLAYER_INSTANCE_CHECK(player);
5434 PLAYER_SEND_MSG(api, pc, ret_buf, ret, MUSE_TYPE_INT, "val", val);
5439 int player_audio_offload_is_enabled(player_h player, bool *enabled)
5441 int ret = PLAYER_ERROR_NONE;
5442 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_OFFLOAD_IS_ENABLED;
5443 player_cli_s *pc = (player_cli_s *)player;
5444 char *ret_buf = NULL;
5447 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_AUDIO_OFFLOAD);
5448 PLAYER_INSTANCE_CHECK(player);
5449 PLAYER_NULL_ARG_CHECK(enabled);
5453 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5454 if (ret == PLAYER_ERROR_NONE) {
5455 player_msg_get(val, ret_buf);
5456 *enabled = (bool)val;
5463 int player_audio_offload_is_activated(player_h player, bool *activated)
5465 int ret = PLAYER_ERROR_NONE;
5466 muse_player_api_e api = MUSE_PLAYER_API_AUDIO_OFFLOAD_IS_ACTIVATED;
5467 player_cli_s *pc = (player_cli_s *)player;
5468 char *ret_buf = NULL;
5471 PLAYER_FEATURE_CHECK(PLAYER_FEATURE_AUDIO_OFFLOAD);
5472 PLAYER_INSTANCE_CHECK(player);
5473 PLAYER_NULL_ARG_CHECK(activated);
5477 PLAYER_SEND_MSG(api, pc, ret_buf, ret);
5478 if (ret == PLAYER_ERROR_NONE) {
5479 player_msg_get(val, ret_buf);
5480 *activated = (bool)val;
5487 int player_set_audio_codec_type(player_h player, player_codec_type_e codec_type)
5489 PLAYER_INSTANCE_CHECK(player);
5490 PLAYER_RANGE_ARG_CHECK(codec_type, PLAYER_CODEC_TYPE_HW, PLAYER_CODEC_TYPE_SW);
5492 int ret = PLAYER_ERROR_NONE;
5493 muse_player_api_e api = MUSE_PLAYER_API_SET_CODEC_TYPE;
5494 player_cli_s *pc = (player_cli_s *)player;
5495 char *ret_buf = NULL;
5497 LOGD("ENTER codec: %d", codec_type);
5499 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
5500 MUSE_TYPE_INT, "stream_type", PLAYER_STREAM_TYPE_AUDIO,
5501 MUSE_TYPE_INT, "codec_type", codec_type);
5509 int player_get_audio_codec_type(player_h player, player_codec_type_e *codec_type)
5511 PLAYER_INSTANCE_CHECK(player);
5512 PLAYER_NULL_ARG_CHECK(codec_type);
5514 int ret = PLAYER_ERROR_NONE;
5515 muse_player_api_e api = MUSE_PLAYER_API_GET_CODEC_TYPE;
5516 player_cli_s *pc = (player_cli_s *)player;
5517 char *ret_buf = NULL;
5522 PLAYER_SEND_MSG(api, pc, ret_buf, ret,
5523 MUSE_TYPE_INT, "stream_type", PLAYER_STREAM_TYPE_AUDIO);
5524 if (ret == PLAYER_ERROR_NONE) {
5525 player_msg_get(type, ret_buf);
5530 LOGD("LEAVE codec: %d", *codec_type);