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 <mm_player.h>
22 #include <mm_player_audioeffect.h>
23 #include <mm_player_internal.h>
25 #include <sound_manager.h>
26 #include <sound_manager_internal.h>
28 #ifdef TIZEN_FEATURE_ASM
29 #include <mm_session_private.h>
31 #include "muse_player.h"
32 #include "legacy_player.h"
33 #include "legacy_player_private.h"
35 #define __RELEASEIF_PREPARE_THREAD(thread_id) \
38 pthread_join(thread_id, NULL); \
40 LOGI("prepare thread released\n"); \
44 #define __RELEASEIF_MESSAGE_THREAD(thread_id) \
47 pthread_join(thread_id, NULL); \
49 LOGI("message thread released\n"); \
53 #define __GET_MESSAGE(handle) \
55 if (handle && handle->message_queue) { \
56 g_mutex_lock(&handle->message_queue_lock); \
57 if (g_queue_is_empty(handle->message_queue)) { \
58 g_cond_wait(&handle->message_queue_cond, &handle->message_queue_lock); \
60 handle->current_message = (int)(intptr_t)g_queue_pop_head(handle->message_queue); \
61 g_mutex_unlock(&handle->message_queue_lock); \
62 LOGI("Retrieved message [%d] from queue", handle->current_message); \
64 LOGI("Failed to retrieve message from queue"); \
65 handle->current_message = PLAYER_MESSAGE_NONE; \
69 #define __ADD_MESSAGE(handle, message) \
71 if (handle && handle->message_queue) { \
72 g_mutex_lock(&handle->message_queue_lock); \
73 if (message == PLAYER_MESSAGE_LOOP_EXIT) \
74 g_queue_clear(handle->message_queue); \
75 g_queue_push_tail(handle->message_queue, (gpointer)message); \
76 g_cond_signal(&handle->message_queue_cond); \
77 g_mutex_unlock(&handle->message_queue_lock); \
78 LOGI("Adding message [%d] to queue", message); \
80 LOGI("Failed to add message [%d] to queue", message); \
85 * Internal Implementation
87 int __player_convert_error_code(int code, char *func_name)
89 int ret = PLAYER_ERROR_INVALID_OPERATION;
90 char *msg = "PLAYER_ERROR_INVALID_OPERATION";
93 ret = PLAYER_ERROR_NONE;
94 msg = "PLAYER_ERROR_NONE";
96 case MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND:
97 ret = PLAYER_ERROR_NOT_SUPPORTED_AUDIO_CODEC;
98 msg = "PLAYER_ERROR_NOT_SUPPORTED_AUDIO_CODEC";
100 case MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND:
101 ret = PLAYER_ERROR_NOT_SUPPORTED_VIDEO_CODEC;
102 msg = "PLAYER_ERROR_NOT_SUPPORTED_VIDEO_CODEC";
104 case MM_ERROR_PLAYER_NOT_SUPPORTED_SUBTITLE:
105 ret = PLAYER_ERROR_NOT_SUPPORTED_SUBTITLE;
106 msg = "PLAYER_ERROR_NOT_SUPPORTED_SUBTITLE";
108 case MM_ERROR_INVALID_ARGUMENT:
109 case MM_ERROR_COMMON_INVALID_ARGUMENT:
110 ret = PLAYER_ERROR_INVALID_PARAMETER;
111 msg = "PLAYER_ERROR_INVALID_PARAMETER";
113 case MM_ERROR_PLAYER_CODEC_NOT_FOUND:
114 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_AUDIO:
115 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_VIDEO:
116 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_MEDIA_TYPE:
117 case MM_ERROR_PLAYER_NOT_SUPPORTED_FORMAT:
118 ret = PLAYER_ERROR_NOT_SUPPORTED_FILE;
119 msg = "PLAYER_ERROR_NOT_SUPPORTED_FILE";
121 case MM_ERROR_PLAYER_INVALID_STATE:
122 case MM_ERROR_PLAYER_NOT_INITIALIZED:
123 ret = PLAYER_ERROR_INVALID_STATE;
124 msg = "PLAYER_ERROR_INVALID_STATE";
126 case MM_ERROR_PLAYER_INTERNAL:
127 case MM_ERROR_PLAYER_INVALID_STREAM:
128 case MM_ERROR_PLAYER_STREAMING_FAIL:
129 case MM_ERROR_PLAYER_NO_OP:
130 ret = PLAYER_ERROR_INVALID_OPERATION;
131 msg = "PLAYER_ERROR_INVALID_OPERATION";
133 case MM_ERROR_PLAYER_SOUND_EFFECT_INVALID_STATUS:
134 case MM_ERROR_NOT_SUPPORT_API:
135 case MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER:
136 ret = PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE;
137 msg = "PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE";
139 case MM_ERROR_PLAYER_NO_FREE_SPACE:
140 ret = PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE;
141 msg = "PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE";
143 case MM_ERROR_PLAYER_FILE_NOT_FOUND:
144 ret = PLAYER_ERROR_NO_SUCH_FILE;
145 msg = "PLAYER_ERROR_NO_SUCH_FILE";
147 case MM_ERROR_PLAYER_SEEK:
148 ret = PLAYER_ERROR_SEEK_FAILED;
149 msg = "PLAYER_ERROR_SEEK_FAILED";
151 case MM_ERROR_PLAYER_INVALID_URI:
152 case MM_ERROR_PLAYER_STREAMING_INVALID_URL:
153 ret = PLAYER_ERROR_INVALID_URI;
154 msg = "PLAYER_ERROR_INVALID_URI";
156 case MM_ERROR_PLAYER_STREAMING_CONNECTION_FAIL:
157 case MM_ERROR_PLAYER_STREAMING_DNS_FAIL:
158 case MM_ERROR_PLAYER_STREAMING_SERVER_DISCONNECTED:
159 case MM_ERROR_PLAYER_STREAMING_INVALID_PROTOCOL:
160 case MM_ERROR_PLAYER_STREAMING_UNEXPECTED_MSG:
161 case MM_ERROR_PLAYER_STREAMING_OUT_OF_MEMORIES:
162 case MM_ERROR_PLAYER_STREAMING_RTSP_TIMEOUT:
163 case MM_ERROR_PLAYER_STREAMING_BAD_REQUEST:
164 case MM_ERROR_PLAYER_STREAMING_NOT_AUTHORIZED:
165 case MM_ERROR_PLAYER_STREAMING_PAYMENT_REQUIRED:
166 case MM_ERROR_PLAYER_STREAMING_FORBIDDEN:
167 case MM_ERROR_PLAYER_STREAMING_CONTENT_NOT_FOUND:
168 case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_ALLOWED:
169 case MM_ERROR_PLAYER_STREAMING_NOT_ACCEPTABLE:
170 case MM_ERROR_PLAYER_STREAMING_PROXY_AUTHENTICATION_REQUIRED:
171 case MM_ERROR_PLAYER_STREAMING_SERVER_TIMEOUT:
172 case MM_ERROR_PLAYER_STREAMING_GONE:
173 case MM_ERROR_PLAYER_STREAMING_LENGTH_REQUIRED:
174 case MM_ERROR_PLAYER_STREAMING_PRECONDITION_FAILED:
175 case MM_ERROR_PLAYER_STREAMING_REQUEST_ENTITY_TOO_LARGE:
176 case MM_ERROR_PLAYER_STREAMING_REQUEST_URI_TOO_LARGE:
177 case MM_ERROR_PLAYER_STREAMING_PARAMETER_NOT_UNDERSTOOD:
178 case MM_ERROR_PLAYER_STREAMING_CONFERENCE_NOT_FOUND:
179 case MM_ERROR_PLAYER_STREAMING_NOT_ENOUGH_BANDWIDTH:
180 case MM_ERROR_PLAYER_STREAMING_NO_SESSION_ID:
181 case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_VALID_IN_THIS_STATE:
182 case MM_ERROR_PLAYER_STREAMING_HEADER_FIELD_NOT_VALID_FOR_SOURCE:
183 case MM_ERROR_PLAYER_STREAMING_INVALID_RANGE:
184 case MM_ERROR_PLAYER_STREAMING_PARAMETER_IS_READONLY:
185 case MM_ERROR_PLAYER_STREAMING_AGGREGATE_OP_NOT_ALLOWED:
186 case MM_ERROR_PLAYER_STREAMING_ONLY_AGGREGATE_OP_ALLOWED:
187 case MM_ERROR_PLAYER_STREAMING_BAD_TRANSPORT:
188 case MM_ERROR_PLAYER_STREAMING_DESTINATION_UNREACHABLE:
189 case MM_ERROR_PLAYER_STREAMING_INTERNAL_SERVER_ERROR:
190 case MM_ERROR_PLAYER_STREAMING_NOT_IMPLEMENTED:
191 case MM_ERROR_PLAYER_STREAMING_BAD_GATEWAY:
192 case MM_ERROR_PLAYER_STREAMING_SERVICE_UNAVAILABLE:
193 case MM_ERROR_PLAYER_STREAMING_GATEWAY_TIME_OUT:
194 case MM_ERROR_PLAYER_STREAMING_OPTION_NOT_SUPPORTED:
195 ret = PLAYER_ERROR_CONNECTION_FAILED;
196 msg = "PLAYER_ERROR_CONNECTION_FAILED";
198 case MM_ERROR_POLICY_BLOCKED:
199 case MM_ERROR_POLICY_INTERRUPTED:
200 case MM_ERROR_POLICY_INTERNAL:
201 case MM_ERROR_POLICY_DUPLICATED:
202 ret = PLAYER_ERROR_SOUND_POLICY;
203 msg = "PLAYER_ERROR_SOUND_POLICY";
205 case MM_ERROR_PLAYER_DRM_EXPIRED:
206 ret = PLAYER_ERROR_DRM_EXPIRED;
207 msg = "PLAYER_ERROR_DRM_EXPIRED";
209 case MM_ERROR_PLAYER_DRM_NOT_AUTHORIZED:
210 case MM_ERROR_PLAYER_DRM_NO_LICENSE:
211 ret = PLAYER_ERROR_DRM_NO_LICENSE;
212 msg = "PLAYER_ERROR_DRM_NO_LICENSE";
214 case MM_ERROR_PLAYER_DRM_FUTURE_USE:
215 ret = PLAYER_ERROR_DRM_FUTURE_USE;
216 msg = "PLAYER_ERROR_DRM_FUTURE_USE";
218 case MM_ERROR_PLAYER_DRM_OUTPUT_PROTECTION:
219 ret = PLAYER_ERROR_DRM_NOT_PERMITTED;
220 msg = "PLAYER_ERROR_DRM_NOT_PERMITTED";
222 case MM_ERROR_PLAYER_RESOURCE_LIMIT:
223 ret = PLAYER_ERROR_RESOURCE_LIMIT;
224 msg = "PLAYER_ERROR_RESOURCE_LIMIT";
226 case MM_ERROR_PLAYER_PERMISSION_DENIED:
227 ret = PLAYER_ERROR_PERMISSION_DENIED;
228 msg = "PLAYER_ERROR_PERMISSION_DENIED";
230 case MM_ERROR_PLAYER_BUFFER_SPACE:
231 ret = PLAYER_ERROR_BUFFER_SPACE;
232 msg = "PLAYER_ERROR_BUFFER_SPACE";
237 LOGE("[%s] %s(0x%08x) : core fw error(0x%x)", func_name, msg, ret, code);
241 static player_interrupted_code_e __convert_interrupted_code(int code)
243 player_interrupted_code_e ret = PLAYER_INTERRUPTED_BY_RESOURCE_CONFLICT;
245 case MM_PLAYER_FOCUS_CHANGED_COMPLETED:
246 ret = PLAYER_INTERRUPTED_COMPLETED;
248 case MM_PLAYER_FOCUS_CHANGED_BY_MEDIA:
249 case MM_PLAYER_FOCUS_CHANGED_BY_UNKNOWN:
250 ret = PLAYER_INTERRUPTED_BY_MEDIA;
252 case MM_PLAYER_FOCUS_CHANGED_BY_CALL:
253 ret = PLAYER_INTERRUPTED_BY_CALL;
255 case MM_PLAYER_FOCUS_CHANGED_BY_EARJACK_UNPLUG:
256 ret = PLAYER_INTERRUPTED_BY_EARJACK_UNPLUG;
258 case MM_PLAYER_FOCUS_CHANGED_BY_ALARM:
259 ret = PLAYER_INTERRUPTED_BY_ALARM;
261 case MM_PLAYER_FOCUS_CHANGED_BY_NOTIFICATION:
262 ret = PLAYER_INTERRUPTED_BY_NOTIFICATION;
264 case MM_PLAYER_FOCUS_CHANGED_BY_EMERGENCY:
265 ret = PLAYER_INTERRUPTED_BY_EMERGENCY;
267 case MM_PLAYER_FOCUS_CHANGED_BY_RESOURCE_CONFLICT:
269 ret = PLAYER_INTERRUPTED_BY_RESOURCE_CONFLICT;
272 LOGE("[%s] interrupted code(%d) => ret(%d)", __FUNCTION__, code, ret);
276 static player_state_e __convert_player_state(MMPlayerStateType state)
278 if (state == MM_PLAYER_STATE_NONE)
279 return PLAYER_STATE_NONE;
284 bool __player_state_validate(player_s *handle, player_state_e threshold)
286 if (handle->state < threshold)
291 static int __set_callback(muse_player_event_e type, player_h player, void *callback, void *user_data)
293 PLAYER_INSTANCE_CHECK(player);
294 PLAYER_NULL_ARG_CHECK(callback);
296 player_s *handle = (player_s *)player;
297 handle->user_cb[type] = callback;
298 handle->user_data[type] = user_data;
299 LOGI("[%s] Event type : %d ", __FUNCTION__, type);
300 return PLAYER_ERROR_NONE;
303 static int __unset_callback(muse_player_event_e type, player_h player)
305 PLAYER_INSTANCE_CHECK(player);
306 player_s *handle = (player_s *)player;
307 handle->user_cb[type] = NULL;
308 handle->user_data[type] = NULL;
309 LOGI("[%s] Event type : %d ", __FUNCTION__, type);
310 return PLAYER_ERROR_NONE;
313 static void __message_cb_loop(void *data)
316 player_s *handle = (player_s *)data;
318 LOGE("null handle in __message_cb_loop");
322 __GET_MESSAGE(handle);
323 switch (handle->current_message) {
324 case PLAYER_MESSAGE_NONE:
326 LOGW("PLAYER_MESSAGE_NONE");
330 case PLAYER_MESSAGE_PREPARED:
332 LOGW("PLAYER_MESSAGE_PREPARED");
334 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
335 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
336 handle->state = PLAYER_STATE_READY;
337 ((player_prepared_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]);
338 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
339 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
341 LOGE("null handle in PLAYER_MESSAGE_PREPARED");
343 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
346 case PLAYER_MESSAGE_ERROR:
348 LOGW("PLAYER_MESSAGE_ERROR");
349 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])
350 ((player_error_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])(handle->error_code, handle->user_data[MUSE_PLAYER_EVENT_TYPE_ERROR]);
352 LOGE("null handle in PLAYER_MESSAGE_ERROR");
355 case PLAYER_MESSAGE_SEEK_DONE:
357 LOGW("PLAYER_MESSAGE_SEEK_DONE");
358 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
359 ((player_seek_completed_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK]);
360 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
361 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
363 LOGE("null handle in PLAYER_MESSAGE_SEEK_DONE");
367 case PLAYER_MESSAGE_EOS:
369 LOGW("PLAYER_MESSAGE_EOS");
370 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_COMPLETE])
371 ((player_completed_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_COMPLETE])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_COMPLETE]);
373 LOGE("null handle in PLAYER_MESSAGE_EOS");
376 #ifdef TIZEN_FEATURE_EVAS_RENDERER
377 case PLAYER_MESSAGE_GAPLESS_CONSTRUCTION:
379 LOGW("PLAYER_MESSAGE_GAPLESS_CONSTRUCTION");
380 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER]) {
381 ((player_retrieve_buffer_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER]);
383 LOGE("null handle in PLAYER_MESSAGE_GAPLESS_CONSTRUCTION");
388 case PLAYER_MESSAGE_LOOP_EXIT:
390 LOGW("PLAYER_MESSAGE_LOOP_EXIT");
394 case PLAYER_MESSAGE_MAX:
396 LOGW("PLAYER_MESSAGE_MAX");
407 static int __msg_callback(int message, void *param, void *user_data)
409 player_s *handle = (player_s *)user_data;
410 MMMessageParamType *msg = (MMMessageParamType *)param;
411 LOGW("[%s] Got message type : 0x%x", __FUNCTION__, message);
412 player_error_e err_code = PLAYER_ERROR_NONE;
414 case MM_MESSAGE_ERROR: /* 0x01 */
415 err_code = __player_convert_error_code(msg->code, (char *)__FUNCTION__);
417 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
418 if (PLAYER_ERROR_NOT_SUPPORTED_FILE == err_code && handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
419 LOGW("failed to pause, so prepare cb will be released soon");
420 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
421 if (handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
422 g_free(handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]);
423 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
426 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
428 case MM_MESSAGE_STATE_CHANGED: /* 0x03 */
429 LOGI("STATE CHANGED INTERNALLY - from : %d, to : %d (CAPI State : %d)", msg->state.previous, msg->state.current, handle->state);
430 if ((handle->is_progressive_download && msg->state.previous == MM_PLAYER_STATE_NULL && msg->state.current == MM_PLAYER_STATE_READY) || (msg->state.previous == MM_PLAYER_STATE_READY && msg->state.current == MM_PLAYER_STATE_PAUSED)) {
431 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
432 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
433 /* asyc && prepared cb has been set */
434 LOGI("[%s] Prepared! [current state : %d]", __FUNCTION__, handle->state);
435 PLAYER_TRACE_ASYNC_END("MM:PLAYER:PREPARE_ASYNC", *(int *)handle);
436 __ADD_MESSAGE(handle, PLAYER_MESSAGE_PREPARED);
438 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
441 case MM_MESSAGE_READY_TO_RESUME: /* 0x05 */
442 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT])
443 ((player_interrupted_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT])(PLAYER_INTERRUPTED_COMPLETED, handle->user_data[MUSE_PLAYER_EVENT_TYPE_INTERRUPT]);
445 case MM_MESSAGE_BEGIN_OF_STREAM: /* 0x104 */
446 LOGI("[%s] Ready to streaming information (BOS) [current state : %d]", __FUNCTION__, handle->state);
448 case MM_MESSAGE_END_OF_STREAM: /* 0x105 */
449 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_COMPLETE]) {
450 __ADD_MESSAGE(handle, PLAYER_MESSAGE_EOS);
453 #ifdef TIZEN_FEATURE_EVAS_RENDERER
454 case MM_MESSAGE_GAPLESS_CONSTRUCTION: /* 0x105 */
455 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER]) {
456 __ADD_MESSAGE(handle, PLAYER_MESSAGE_GAPLESS_CONSTRUCTION);
460 case MM_MESSAGE_BUFFERING: /* 0x103 */
461 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_BUFFERING])
462 ((player_buffering_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_BUFFERING])(msg->connection.buffering, handle->user_data[MUSE_PLAYER_EVENT_TYPE_BUFFERING]);
464 case MM_MESSAGE_STATE_INTERRUPTED: /* 0x04 */
465 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT]) {
467 if (msg->union_type == MM_MSG_UNION_STATE) {
469 handle->state = __convert_player_state(msg->state.current);
470 LOGD("update player state to %d", handle->state);
472 if (handle->state == PLAYER_STATE_READY)
473 handle->is_stopped = TRUE;
474 code = msg->state.code;
475 } else if (msg->union_type == MM_MSG_UNION_CODE) {
478 LOGE("invalid msg type %d", msg->union_type);
481 ((player_interrupted_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT])(__convert_interrupted_code(code), handle->user_data[MUSE_PLAYER_EVENT_TYPE_INTERRUPT]);
484 case MM_MESSAGE_CONNECTION_TIMEOUT: /* 0x102 */
485 LOGI("[%s] PLAYER_ERROR_CONNECTION_FAILED (0x%08x) : CONNECTION_TIMEOUT", __FUNCTION__, PLAYER_ERROR_CONNECTION_FAILED);
486 err_code = PLAYER_ERROR_CONNECTION_FAILED;
488 case MM_MESSAGE_UPDATE_SUBTITLE: /* 0x109 */
489 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SUBTITLE])
490 ((player_subtitle_updated_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SUBTITLE])(msg->subtitle.duration, (char *)msg->data, handle->user_data[MUSE_PLAYER_EVENT_TYPE_SUBTITLE]);
492 case MM_MESSAGE_VIDEO_NOT_CAPTURED: /* 0x113 */
493 LOGI("[%s] PLAYER_ERROR_VIDEO_CAPTURE_FAILED (0x%08x)", __FUNCTION__, PLAYER_ERROR_VIDEO_CAPTURE_FAILED);
494 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])
495 ((player_error_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])(PLAYER_ERROR_VIDEO_CAPTURE_FAILED, handle->user_data[MUSE_PLAYER_EVENT_TYPE_ERROR]);
497 case MM_MESSAGE_VIDEO_CAPTURED: /* 0x110 */
498 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE]) {
501 MMPlayerVideoCapture *capture = (MMPlayerVideoCapture *)msg->data;
502 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_WIDTH, &w, MM_PLAYER_VIDEO_HEIGHT, &h, (char *)NULL);
503 if (ret != MM_ERROR_NONE && handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR]) {
504 LOGE("[%s] PLAYER_ERROR_VIDEO_CAPTURE_FAILED (0x%08x) : Failed to get video size on video captured (0x%x)", __FUNCTION__, PLAYER_ERROR_VIDEO_CAPTURE_FAILED, ret);
505 err_code = PLAYER_ERROR_VIDEO_CAPTURE_FAILED;
507 switch (msg->captured_frame.orientation) {
511 /* use video resolution from above */
517 /* use calculated size during rotation */
518 w = msg->captured_frame.width;
519 h = msg->captured_frame.height;
526 LOGI("[%s] captured image width : %d height : %d", __FUNCTION__, w, h);
528 /* call application callback */
529 ((player_video_captured_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE])(capture->data, w, h, capture->size, handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE]);
532 /* capure->data have to be released to avoid mem leak even if _get_attribute got failed. */
533 if (capture && capture->data) {
534 g_free(capture->data);
535 capture->data = NULL;
538 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
539 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
542 case MM_MESSAGE_FILE_NOT_SUPPORTED: /* 0x10f */
543 LOGI("[%s] PLAYER_ERROR_NOT_SUPPORTED_FILE (0x%08x) : FILE_NOT_SUPPORTED", __FUNCTION__, PLAYER_ERROR_NOT_SUPPORTED_FILE);
544 err_code = PLAYER_ERROR_NOT_SUPPORTED_FILE;
546 case MM_MESSAGE_FILE_NOT_FOUND: /* 0x110 */
547 LOGI("[%s] PLAYER_ERROR_NOT_SUPPORTED_FILE (0x%08x) : FILE_NOT_FOUND", __FUNCTION__, PLAYER_ERROR_NOT_SUPPORTED_FILE);
548 err_code = PLAYER_ERROR_NOT_SUPPORTED_FILE;
550 case MM_MESSAGE_SEEK_COMPLETED: /* 0x114 */
551 if (handle->display_type != PLAYER_DISPLAY_TYPE_NONE && handle->state == PLAYER_STATE_READY) {
552 if (handle->is_display_visible) {
553 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", 1, (char *)NULL);
554 if (ret != MM_ERROR_NONE)
555 LOGW("[%s] Failed to set display_visible '1' (0x%x)", __FUNCTION__, ret);
558 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
559 __ADD_MESSAGE(handle, PLAYER_MESSAGE_SEEK_DONE);
562 case MM_MESSAGE_PLAY_POSITION:
563 LOGI("MM_MESSAGE_PLAY_POSITION (%d ms)", msg->time.elapsed);
564 handle->last_play_position = (int)msg->time.elapsed;
566 case MM_MESSAGE_UNKNOWN: /* 0x00 */
567 case MM_MESSAGE_WARNING: /* 0x02 */
568 case MM_MESSAGE_CONNECTING: /* 0x100 */
569 case MM_MESSAGE_CONNECTED: /* 0x101 */
570 case MM_MESSAGE_BLUETOOTH_ON: /* 0x106 */
571 case MM_MESSAGE_BLUETOOTH_OFF: /* 0x107 */
572 case MM_MESSAGE_RTP_SENDER_REPORT: /* 0x10a */
573 case MM_MESSAGE_RTP_RECEIVER_REPORT: /* 0x10b */
574 case MM_MESSAGE_RTP_SESSION_STATUS: /* 0x10c */
575 case MM_MESSAGE_SENDER_STATE: /* 0x10d */
576 case MM_MESSAGE_RECEIVER_STATE: /* 0x10e */
581 if (err_code != PLAYER_ERROR_NONE && handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR]) {
582 handle->error_code = err_code;
583 __ADD_MESSAGE(handle, PLAYER_MESSAGE_ERROR);
585 LOGW("[%s] End", __FUNCTION__);
589 static int __pd_message_callback(int message, void *param, void *user_data)
591 player_s *handle = (player_s *)user_data;
592 player_pd_message_type_e type;
594 case MM_MESSAGE_PD_DOWNLOADER_START:
595 type = PLAYER_PD_STARTED;
597 case MM_MESSAGE_PD_DOWNLOADER_END:
598 type = PLAYER_PD_COMPLETED;
604 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
606 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD])
607 ((player_pd_message_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD])(type, handle->user_data[MUSE_PLAYER_EVENT_TYPE_PD]);
609 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
614 static MMDisplaySurfaceType __player_convert_display_type(player_display_type_e type)
617 case PLAYER_DISPLAY_TYPE_OVERLAY:
618 return MM_DISPLAY_SURFACE_OVERLAY;
619 case PLAYER_DISPLAY_TYPE_EVAS: /* fall through ifndef TIZEN_FEATURE_EVAS_RENDERER */
620 #ifdef TIZEN_FEATURE_EVAS_RENDERER
621 return MM_DISPLAY_SURFACE_REMOTE;
623 case PLAYER_DISPLAY_TYPE_NONE: /* fall through */
625 return MM_DISPLAY_SURFACE_NULL;
629 bool _check_enabled_user_cb_lock(int type)
631 if ((type == MUSE_PLAYER_EVENT_TYPE_PD) ||
632 (type == MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS_WITH_INFO) ||
633 (type == MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS_WITH_INFO)) {
641 * Public Implementation
644 int legacy_player_create(player_h *player)
646 PLAYER_INSTANCE_CHECK(player);
647 PLAYER_TRACE_BEGIN("MM:PLAYER:CREATE");
649 handle = (player_s *)malloc(sizeof(player_s));
651 memset(handle, 0, sizeof(player_s));
653 LOGE("[%s] PLAYER_ERROR_OUT_OF_MEMORY(0x%08x)", __FUNCTION__, PLAYER_ERROR_OUT_OF_MEMORY);
654 return PLAYER_ERROR_OUT_OF_MEMORY;
656 int ret = mm_player_create(&handle->mm_handle);
657 if (ret != MM_ERROR_NONE) {
658 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
659 handle->state = PLAYER_STATE_NONE;
662 return __player_convert_error_code(ret, (char *)__FUNCTION__);
664 muse_player_event_e type = MUSE_PLAYER_EVENT_TYPE_PREPARE;
666 *player = (player_h)handle;
667 handle->state = PLAYER_STATE_IDLE;
668 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
669 handle->is_stopped = FALSE;
670 handle->is_display_visible = TRUE;
671 handle->is_media_stream = FALSE;
673 for (type = MUSE_PLAYER_EVENT_TYPE_PREPARE; type < MUSE_PLAYER_EVENT_TYPE_NUM; type++) {
674 if (_check_enabled_user_cb_lock(type))
675 g_mutex_init(&handle->user_cb_lock[type]);
678 handle->message_queue = g_queue_new();
679 g_mutex_init(&handle->message_queue_lock);
680 g_cond_init(&handle->message_queue_cond);
681 ret = pthread_create(&handle->message_thread, NULL, (void *)__message_cb_loop, (void *)handle);
683 LOGE("[%s] failed to create message thread ret = %d", __FUNCTION__, ret);
684 return PLAYER_ERROR_OUT_OF_MEMORY;
687 LOGI("[%s] new handle : %p", __FUNCTION__, *player);
689 return PLAYER_ERROR_NONE;
693 int legacy_player_destroy(player_h player)
695 LOGI("[%s] Start, handle to destroy : %p", __FUNCTION__, player);
696 PLAYER_TRACE_BEGIN("MM:PLAYER:DESTROY");
697 PLAYER_INSTANCE_CHECK(player);
698 player_s *handle = (player_s *)player;
700 __ADD_MESSAGE(handle, PLAYER_MESSAGE_LOOP_EXIT);
702 __RELEASEIF_PREPARE_THREAD(handle->prepare_async_thread);
703 __RELEASEIF_MESSAGE_THREAD(handle->message_thread);
705 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
706 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
707 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
708 if (handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
709 g_free(handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]);
710 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
713 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
715 int ret = mm_player_destroy(handle->mm_handle);
717 LOGI("[%s] Done mm_player_destroy", __FUNCTION__);
719 if (ret != MM_ERROR_NONE) {
720 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
721 return PLAYER_ERROR_INVALID_OPERATION;
723 muse_player_event_e type = MUSE_PLAYER_EVENT_TYPE_PREPARE;
725 handle->state = PLAYER_STATE_NONE;
727 for (type = MUSE_PLAYER_EVENT_TYPE_PREPARE; type < MUSE_PLAYER_EVENT_TYPE_NUM; type++) {
728 if (_check_enabled_user_cb_lock(type))
729 g_mutex_clear(&handle->user_cb_lock[type]);
732 if (handle->message_queue) {
733 g_queue_free(handle->message_queue);
734 handle->message_queue = NULL;
737 g_cond_broadcast(&handle->message_queue_cond);
738 g_mutex_clear(&handle->message_queue_lock);
739 g_cond_clear(&handle->message_queue_cond);
743 LOGI("[%s] End", __FUNCTION__);
745 return PLAYER_ERROR_NONE;
749 static void *__prepare_async_thread_func(void *data)
751 player_s *handle = data;
752 int ret = MM_ERROR_NONE;
753 LOGI("[%s]", __FUNCTION__);
755 ret = mm_player_pause(handle->mm_handle);
756 if (ret != MM_ERROR_NONE) {
757 LOGE("[%s] Failed to pause - core fw error(0x%x)", __FUNCTION__, ret);
758 if (handle->error_code == PLAYER_ERROR_NONE) {
759 /*MM_MESSAGE_ERROR will not be posted as legacy_player_prepare(sync API) works with return value
760 of mm_player_pause So in case of async API we post the error message to application from here */
761 MMMessageParamType msg_param;
762 msg_param.code = ret;
763 __msg_callback(MM_MESSAGE_ERROR, (void *)&msg_param, (void *)handle);
765 ret = mm_player_unrealize(handle->mm_handle);
766 if (ret != MM_ERROR_NONE)
767 LOGE("[%s] Failed to unrealize - 0x%x", __FUNCTION__, ret);
769 LOGI("[%s], done", __FUNCTION__);
773 int legacy_player_prepare_async(player_h player, player_prepared_cb callback, void *user_data)
775 int ret = MM_ERROR_NONE;
779 LOGI("[%s] Start", __FUNCTION__);
780 PLAYER_INSTANCE_CHECK(player);
781 player_s *handle = (player_s *)player;
782 PLAYER_TRACE_ASYNC_BEGIN("MM:PLAYER:PREPARE_ASYNC", *(int *)handle);
783 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
785 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
787 handle->last_play_position = 0;
788 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
789 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION (0x%08x) : preparing... we can't do any more ", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
790 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
791 return PLAYER_ERROR_INVALID_OPERATION;
793 /* LOGI("[%s] Event type : %d ",__FUNCTION__, MUSE_PLAYER_EVENT_TYPE_PREPARE); */
794 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = callback;
795 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = user_data;
797 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
799 ret = mm_player_set_message_callback(handle->mm_handle, __msg_callback, (void *)handle);
800 if (ret != MM_ERROR_NONE)
801 LOGW("[%s] Failed to set message callback function (0x%x)", __FUNCTION__, ret);
803 if (handle->display_type == PLAYER_DISPLAY_TYPE_NONE) {
804 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", MM_DISPLAY_SURFACE_NULL, (char *)NULL);
805 if (ret != MM_ERROR_NONE)
806 LOGW("[%s] Failed to set display surface type 'MM_DISPLAY_SURFACE_NULL' (0x%x)", __FUNCTION__, ret);
808 ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_visible", &visible, (char *)NULL);
809 if (ret != MM_ERROR_NONE) goto ERROR;
816 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", value, (char *)NULL);
817 if (ret != MM_ERROR_NONE) goto ERROR;
820 ret = mm_player_realize(handle->mm_handle);
821 if (ret != MM_ERROR_NONE) {
822 LOGE("[%s] Failed to realize - 0x%x", __FUNCTION__, ret);
826 if (!handle->is_progressive_download) {
827 ret = pthread_create(&handle->prepare_async_thread, NULL, (void *)__prepare_async_thread_func, (void *)handle);
830 LOGE("[%s] failed to create thread ret = %d", __FUNCTION__, ret);
831 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
832 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
833 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
834 /* user_data will be free at player_disp_prepare_async() */
835 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
837 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
838 return PLAYER_ERROR_OUT_OF_MEMORY;
842 LOGI("[%s] End", __FUNCTION__);
843 return PLAYER_ERROR_NONE;
846 LOGW("prepare cb is released");
847 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
848 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
849 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
850 /* user_data will be free at player_disp_prepare_async() */
851 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
853 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
855 LOGE("LEAVE mm_err:0x%X", ret);
856 return __player_convert_error_code(ret, (char *)__FUNCTION__);
859 int legacy_player_prepare(player_h player)
861 int ret = MM_ERROR_NONE;
865 LOGI("[%s] Start", __FUNCTION__);
866 PLAYER_TRACE_BEGIN("MM:PLAYER:PREPARE");
867 PLAYER_INSTANCE_CHECK(player);
868 player_s *handle = (player_s *)player;
869 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
871 handle->last_play_position = 0;
872 ret = mm_player_set_message_callback(handle->mm_handle, __msg_callback, (void *)handle);
873 if (ret != MM_ERROR_NONE)
874 LOGW("[%s] Failed to set message callback function (0x%x)", __FUNCTION__, ret);
876 if (handle->display_type == PLAYER_DISPLAY_TYPE_NONE) {
877 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", MM_DISPLAY_SURFACE_NULL, (char *)NULL);
878 if (ret != MM_ERROR_NONE)
879 LOGW("[%s] Failed to set display surface type 'MM_DISPLAY_SURFACE_NULL' (0x%x)", __FUNCTION__, ret);
881 ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_visible", &visible, (char *)NULL);
882 if (ret != MM_ERROR_NONE)
883 return __player_convert_error_code(ret, (char *)__FUNCTION__);
890 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", value, (char *)NULL);
892 if (ret != MM_ERROR_NONE)
893 LOGW("[%s] Failed to set display display_visible '0' (0x%x)", __FUNCTION__, ret);
896 ret = mm_player_realize(handle->mm_handle);
897 if (ret != MM_ERROR_NONE) {
898 LOGE("[%s] Failed to realize - 0x%x", __FUNCTION__, ret);
899 return __player_convert_error_code(ret, (char *)__FUNCTION__);
902 if (!handle->is_progressive_download)
903 ret = mm_player_pause(handle->mm_handle);
905 if (ret != MM_ERROR_NONE) {
907 uret = mm_player_unrealize(handle->mm_handle);
908 if (uret != MM_ERROR_NONE)
909 LOGE("[%s] Failed to unrealize - 0x%x", __FUNCTION__, uret);
911 LOGE("[%s] Failed to pause - 0x%x", __FUNCTION__, ret);
912 return __player_convert_error_code(ret, (char *)__FUNCTION__);
914 handle->state = PLAYER_STATE_READY;
915 LOGI("[%s] End", __FUNCTION__);
917 return PLAYER_ERROR_NONE;
921 int legacy_player_unprepare(player_h player)
923 LOGI("[%s] Start", __FUNCTION__);
924 PLAYER_TRACE_BEGIN("MM:PLAYER:UNPREPARE");
925 PLAYER_INSTANCE_CHECK(player);
926 player_s *handle = (player_s *)player;
928 /* Initialize the setting regardless of error return */
929 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
930 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
931 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
934 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
935 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
936 return PLAYER_ERROR_INVALID_STATE;
939 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
940 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
941 LOGW("Need to check. prepare cb have to be reset before");
942 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
943 if (handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
944 g_free(handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]);
945 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
948 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PREPARE);
950 __RELEASEIF_PREPARE_THREAD(handle->prepare_async_thread);
952 int ret = mm_player_unrealize(handle->mm_handle);
954 if (ret != MM_ERROR_NONE) {
955 return __player_convert_error_code(ret, (char *)__FUNCTION__);
957 handle->state = PLAYER_STATE_IDLE;
958 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
959 handle->is_stopped = FALSE;
960 handle->is_display_visible = TRUE;
961 handle->is_progressive_download = FALSE;
962 LOGI("[%s] End", __FUNCTION__);
964 return PLAYER_ERROR_NONE;
968 int legacy_player_set_uri(player_h player, const char *uri)
970 PLAYER_INSTANCE_CHECK(player);
971 PLAYER_NULL_ARG_CHECK(uri);
972 player_s *handle = (player_s *)player;
973 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
975 handle->is_media_stream = FALSE;
976 int ret = mm_player_set_uri(handle->mm_handle, uri);
978 if (ret != MM_ERROR_NONE)
979 return __player_convert_error_code(ret, (char *)__FUNCTION__);
981 return PLAYER_ERROR_NONE;
984 int legacy_player_set_memory_buffer(player_h player, const void *data, int size)
986 PLAYER_INSTANCE_CHECK(player);
987 PLAYER_NULL_ARG_CHECK(data);
988 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
989 player_s *handle = (player_s *)player;
990 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
994 handle->is_media_stream = FALSE;
995 snprintf(uri, sizeof(uri), "mem:///ext=%s,size=%d", "", size);
996 int ret = mm_player_set_attribute(handle->mm_handle, NULL, MM_PLAYER_CONTENT_URI, uri, strlen(uri), MM_PLAYER_MEMORY_SRC, data, size, (char *)NULL);
997 if (ret != MM_ERROR_NONE)
998 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1000 return PLAYER_ERROR_NONE;
1003 int legacy_player_get_state(player_h player, player_state_e *state)
1005 PLAYER_INSTANCE_CHECK(player);
1006 PLAYER_NULL_ARG_CHECK(state);
1007 player_s *handle = (player_s *)player;
1008 *state = handle->state;
1009 MMPlayerStateType currentStat = MM_PLAYER_STATE_NULL;
1010 mm_player_get_state(handle->mm_handle, ¤tStat);
1011 /* LOGI("[%s] State : %d (FW state : %d)", __FUNCTION__,handle->state, currentStat); */
1012 return PLAYER_ERROR_NONE;
1015 int legacy_player_set_volume(player_h player, float left, float right)
1017 PLAYER_INSTANCE_CHECK(player);
1018 PLAYER_CHECK_CONDITION(left >= 0 && left <= 1.0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1019 PLAYER_CHECK_CONDITION(right >= 0 && right <= 1.0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1020 player_s *handle = (player_s *)player;
1021 MMPlayerVolumeType vol;
1022 vol.level[MM_VOLUME_CHANNEL_LEFT] = left;
1023 vol.level[MM_VOLUME_CHANNEL_RIGHT] = right;
1024 int ret = mm_player_set_volume(handle->mm_handle, &vol);
1025 if (ret != MM_ERROR_NONE)
1026 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1028 return PLAYER_ERROR_NONE;
1031 int legacy_player_get_volume(player_h player, float *left, float *right)
1033 PLAYER_INSTANCE_CHECK(player);
1034 PLAYER_NULL_ARG_CHECK(left);
1035 PLAYER_NULL_ARG_CHECK(right);
1036 player_s *handle = (player_s *)player;
1037 MMPlayerVolumeType vol;
1038 int ret = mm_player_get_volume(handle->mm_handle, &vol);
1039 if (ret != MM_ERROR_NONE) {
1040 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1042 *left = vol.level[MM_VOLUME_CHANNEL_LEFT];
1043 *right = vol.level[MM_VOLUME_CHANNEL_RIGHT];
1044 return PLAYER_ERROR_NONE;
1047 #ifdef TIZEN_FEATURE_ASM
1048 int legacy_player_set_sound_type(player_h player, sound_type_e type)
1050 PLAYER_INSTANCE_CHECK(player);
1051 player_s *handle = (player_s *)player;
1053 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1055 char *stream_type = NULL;
1056 int stream_index = -1;
1059 int session_type = 0;
1060 int session_flags = 0;
1062 ret = mm_player_get_client_pid(handle->mm_handle, &pid);
1063 if (ret != MM_ERROR_NONE)
1064 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1066 /* read session information */
1067 ret = _mm_session_util_read_information(pid, &session_type, &session_flags);
1068 if (ret == MM_ERROR_NONE) {
1069 /* in this case, this process is using stream info created by using sound-manager,
1070 * we're going to skip working on backward compatibility of session. */
1071 if (session_type == MM_SESSION_TYPE_REPLACED_BY_STREAM)
1072 return PLAYER_ERROR_SOUND_POLICY;
1073 } else if (ret == MM_ERROR_INVALID_HANDLE) { /* if there is no session */
1074 /* convert volume_type to stream_type */
1076 case SOUND_TYPE_SYSTEM:
1077 stream_type = "system";
1079 case SOUND_TYPE_NOTIFICATION:
1080 stream_type = "notification";
1082 case SOUND_TYPE_ALARM:
1083 stream_type = "alarm";
1085 case SOUND_TYPE_RINGTONE:
1086 stream_type = "ringtone-voip";
1088 case SOUND_TYPE_MEDIA:
1089 case SOUND_TYPE_CALL:
1090 stream_type = "media";
1092 case SOUND_TYPE_VOIP:
1093 stream_type = "voip";
1095 case SOUND_TYPE_VOICE:
1096 stream_type = "voice-information";
1099 LOGW("check the value[%d].\n", type);
1100 return PLAYER_ERROR_INVALID_PARAMETER;
1102 LOGI("[%s] sound type = %s", __FUNCTION__, stream_type);
1104 ret = mm_player_set_attribute(handle->mm_handle, NULL, "sound_stream_type", stream_type, strlen(stream_type), "sound_stream_index", stream_index, (char *)NULL);
1105 if (ret == MM_ERROR_NONE)
1106 return PLAYER_ERROR_NONE;
1108 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1111 int legacy_player_set_sound_stream_info(player_h player, sound_stream_info_h stream_info)
1113 PLAYER_INSTANCE_CHECK(player);
1114 player_s *handle = (player_s *)player;
1115 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1117 bool is_available = FALSE;
1119 /* check if stream_info is valid */
1120 int ret = sound_manager_is_available_stream_information(stream_info, NATIVE_API_PLAYER, &is_available);
1122 if (ret != MM_ERROR_NONE) {
1123 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1125 if (is_available == FALSE)
1126 ret = MM_ERROR_NOT_SUPPORT_API;
1128 char *stream_type = NULL;
1129 int stream_index = 0;
1130 ret = sound_manager_get_type_from_stream_information(stream_info, &stream_type);
1131 ret = sound_manager_get_index_from_stream_information(stream_info, &stream_index);
1132 if (ret == SOUND_MANAGER_ERROR_NONE)
1133 ret = mm_player_set_sound_stream_info(handle->mm_handle, stream_type, stream_index);
1135 ret = MM_ERROR_PLAYER_INTERNAL;
1139 if (ret != MM_ERROR_NONE)
1140 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1142 return PLAYER_ERROR_NONE;
1145 int legacy_player_set_audio_latency_mode(player_h player, audio_latency_mode_e latency_mode)
1147 PLAYER_INSTANCE_CHECK(player);
1148 player_s *handle = (player_s *)player;
1150 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "sound_latency_mode", latency_mode, (char *)NULL);
1151 if (ret != MM_ERROR_NONE)
1152 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1154 return PLAYER_ERROR_NONE;
1157 int legacy_player_get_audio_latency_mode(player_h player, audio_latency_mode_e * latency_mode)
1159 PLAYER_INSTANCE_CHECK(player);
1160 PLAYER_NULL_ARG_CHECK(latency_mode);
1161 player_s *handle = (player_s *)player;
1163 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "sound_latency_mode", latency_mode, (char *)NULL);
1164 if (ret != MM_ERROR_NONE)
1165 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1167 return PLAYER_ERROR_NONE;
1170 int legacy_player_start(player_h player)
1172 LOGI("[%s] Start", __FUNCTION__);
1173 PLAYER_INSTANCE_CHECK(player);
1174 player_s *handle = (player_s *)player;
1176 if (handle->state == PLAYER_STATE_READY || handle->state == PLAYER_STATE_PAUSED) {
1177 if (handle->display_type == PLAYER_DISPLAY_TYPE_OVERLAY && handle->is_display_visible) {
1178 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", 1, (char *)NULL);
1179 if (ret != MM_ERROR_NONE)
1180 LOGW("[%s] Failed to set display_visible '1' (0x%x)", __FUNCTION__, ret);
1182 if (handle->is_stopped) {
1183 if (handle->is_progressive_download) {
1184 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1185 return PLAYER_ERROR_INVALID_OPERATION;
1188 ret = mm_player_start(handle->mm_handle);
1189 LOGI("[%s] stop -> start() ", __FUNCTION__);
1191 if (handle->is_progressive_download && handle->state == PLAYER_STATE_READY)
1192 ret = mm_player_start(handle->mm_handle);
1194 ret = mm_player_resume(handle->mm_handle);
1197 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1198 return PLAYER_ERROR_INVALID_STATE;
1201 if (ret != MM_ERROR_NONE) {
1202 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1204 handle->is_stopped = FALSE;
1205 handle->state = PLAYER_STATE_PLAYING;
1206 LOGI("[%s] End", __FUNCTION__);
1207 return PLAYER_ERROR_NONE;
1211 int legacy_player_stop(player_h player)
1213 LOGI("[%s] Start", __FUNCTION__);
1214 PLAYER_INSTANCE_CHECK(player);
1215 player_s *handle = (player_s *)player;
1216 int ret = MM_ERROR_NONE;
1218 if (handle->state == PLAYER_STATE_PLAYING || handle->state == PLAYER_STATE_PAUSED) {
1219 if (handle->display_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1220 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", 0, (char *)NULL);
1221 if (ret != MM_ERROR_NONE)
1222 LOGW("[%s] Failed to set display_visible '0' (0x%x)", __FUNCTION__, ret);
1225 ret = mm_player_stop(handle->mm_handle);
1226 if (ret != MM_ERROR_NONE) {
1227 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1229 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
1230 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1231 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1234 handle->state = PLAYER_STATE_READY;
1235 handle->is_stopped = TRUE;
1236 LOGI("[%s] End", __FUNCTION__);
1237 return PLAYER_ERROR_NONE;
1240 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1241 return PLAYER_ERROR_INVALID_STATE;
1245 int legacy_player_pause(player_h player)
1247 LOGI("[%s] Start", __FUNCTION__);
1248 PLAYER_INSTANCE_CHECK(player);
1249 player_s *handle = (player_s *)player;
1250 PLAYER_STATE_CHECK(handle, PLAYER_STATE_PLAYING);
1252 int ret = mm_player_pause(handle->mm_handle);
1253 if (ret != MM_ERROR_NONE) {
1254 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1256 handle->state = PLAYER_STATE_PAUSED;
1257 LOGI("[%s] End", __FUNCTION__);
1258 return PLAYER_ERROR_NONE;
1262 int legacy_player_set_play_position(player_h player, int millisecond, bool accurate, player_seek_completed_cb callback, void *user_data)
1264 PLAYER_INSTANCE_CHECK(player);
1265 PLAYER_CHECK_CONDITION(millisecond >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1266 player_s *handle = (player_s *)player;
1267 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1268 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1269 return PLAYER_ERROR_INVALID_STATE;
1272 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] && handle->is_media_stream == FALSE) {
1273 LOGE("[%s] PLAYER_ERROR_SEEK_FAILED temp (0x%08x) : seeking... we can't do any more ", __FUNCTION__, PLAYER_ERROR_SEEK_FAILED);
1274 return PLAYER_ERROR_SEEK_FAILED;
1276 LOGI("[%s] Event type : %d, pos : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_SEEK, millisecond);
1277 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = callback;
1278 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = user_data;
1280 int accurated = accurate ? 1 : 0;
1281 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "accurate_seek", accurated, (char *)NULL);
1282 if (ret != MM_ERROR_NONE)
1283 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1285 ret = mm_player_set_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME, millisecond);
1286 if (ret != MM_ERROR_NONE) {
1287 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1288 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1289 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1291 return PLAYER_ERROR_NONE;
1295 int legacy_player_get_play_position(player_h player, int *millisecond)
1297 unsigned long pos = 0;
1299 PLAYER_INSTANCE_CHECK(player);
1300 PLAYER_NULL_ARG_CHECK(millisecond);
1301 player_s *handle = (player_s *)player;
1302 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
1303 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1304 return PLAYER_ERROR_INVALID_STATE;
1307 int ret = mm_player_get_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME, &pos);
1308 if (ret != MM_ERROR_NONE) {
1309 if (ret == MM_ERROR_PLAYER_NOT_INITIALIZED) {
1310 /* During playbak if a interrupt is occurred, the player can be destroyed internally.
1311 libmm-player will post position msg with last playback position before destory pipeline */
1312 if (handle->state == PLAYER_STATE_IDLE) {
1313 if (handle->last_play_position > 0)
1314 *millisecond = handle->last_play_position;
1317 LOGD("position %d", *millisecond);
1318 return PLAYER_ERROR_NONE;
1322 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1324 *millisecond = (int)pos;
1325 return PLAYER_ERROR_NONE;
1329 int legacy_player_set_mute(player_h player, bool muted)
1331 PLAYER_INSTANCE_CHECK(player);
1332 player_s *handle = (player_s *)player;
1334 int ret = mm_player_set_mute(handle->mm_handle, muted);
1335 if (ret != MM_ERROR_NONE)
1336 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1338 return PLAYER_ERROR_NONE;
1341 int legacy_player_is_muted(player_h player, bool *muted)
1343 PLAYER_INSTANCE_CHECK(player);
1344 PLAYER_NULL_ARG_CHECK(muted);
1345 player_s *handle = (player_s *)player;
1348 int ret = mm_player_get_mute(handle->mm_handle, &_mute);
1349 if (ret != MM_ERROR_NONE) {
1350 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1356 return PLAYER_ERROR_NONE;
1360 int legacy_player_set_looping(player_h player, bool looping)
1362 PLAYER_INSTANCE_CHECK(player);
1363 player_s *handle = (player_s *)player;
1366 if (looping == TRUE)
1369 int ret = mm_player_set_attribute(handle->mm_handle, NULL, MM_PLAYER_PLAYBACK_COUNT, value, (char *)NULL);
1371 if (ret != MM_ERROR_NONE)
1372 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1374 return PLAYER_ERROR_NONE;
1377 int legacy_player_is_looping(player_h player, bool *looping)
1379 PLAYER_INSTANCE_CHECK(player);
1380 PLAYER_NULL_ARG_CHECK(looping);
1381 player_s *handle = (player_s *)player;
1384 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_PLAYBACK_COUNT, &count, (char *)NULL);
1385 if (ret != MM_ERROR_NONE) {
1386 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1393 return PLAYER_ERROR_NONE;
1397 int legacy_player_get_duration(player_h player, int *duration)
1399 PLAYER_INSTANCE_CHECK(player);
1400 PLAYER_NULL_ARG_CHECK(duration);
1401 player_s *handle = (player_s *)player;
1402 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1403 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1404 return PLAYER_ERROR_INVALID_STATE;
1407 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_CONTENT_DURATION, &_duration, (char *)NULL);
1408 if (ret != MM_ERROR_NONE) {
1409 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1411 *duration = _duration;
1412 /* LOGI("[%s] duration : %d",__FUNCTION__,_duration); */
1413 return PLAYER_ERROR_NONE;
1417 int legacy_player_set_display_mode(player_h player, player_display_mode_e mode)
1419 PLAYER_INSTANCE_CHECK(player);
1420 player_s *handle = (player_s *)player;
1421 LOGI("[%s] mode:%d", __FUNCTION__, mode);
1423 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_method", mode, (char *)NULL);
1424 if (ret != MM_ERROR_NONE)
1425 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1427 return PLAYER_ERROR_NONE;
1430 int legacy_player_get_display_mode(player_h player, player_display_mode_e *mode)
1432 PLAYER_INSTANCE_CHECK(player);
1433 PLAYER_NULL_ARG_CHECK(mode);
1434 player_s *handle = (player_s *)player;
1435 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_method", mode, (char *)NULL);
1436 if (ret != MM_ERROR_NONE)
1437 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1439 return PLAYER_ERROR_NONE;
1442 int legacy_player_set_playback_rate(player_h player, float rate)
1444 LOGI("[%s] rate : %0.1f", __FUNCTION__, rate);
1445 PLAYER_INSTANCE_CHECK(player);
1446 PLAYER_CHECK_CONDITION(rate >= -5.0 && rate <= 5.0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1447 player_s *handle = (player_s *)player;
1449 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1450 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1451 return PLAYER_ERROR_INVALID_STATE;
1454 int ret = mm_player_set_play_speed(handle->mm_handle, rate, FALSE);
1458 case MM_ERROR_PLAYER_NO_OP:
1459 ret = PLAYER_ERROR_NONE;
1461 case MM_ERROR_NOT_SUPPORT_API:
1462 case MM_ERROR_PLAYER_SEEK:
1463 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x) : seek error", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1464 ret = PLAYER_ERROR_INVALID_OPERATION;
1467 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1472 int legacy_player_set_display_rotation(player_h player, player_display_rotation_e rotation)
1474 PLAYER_INSTANCE_CHECK(player);
1475 player_s *handle = (player_s *)player;
1477 int ret = mm_player_set_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_ROTATION, rotation, (char *)NULL);
1478 if (ret != MM_ERROR_NONE)
1479 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1481 return PLAYER_ERROR_NONE;
1484 int legacy_player_get_display_rotation(player_h player, player_display_rotation_e *rotation)
1486 PLAYER_INSTANCE_CHECK(player);
1487 PLAYER_NULL_ARG_CHECK(rotation);
1488 player_s *handle = (player_s *)player;
1489 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_ROTATION, rotation, (char *)NULL);
1490 if (ret != MM_ERROR_NONE)
1491 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1493 return PLAYER_ERROR_NONE;
1496 int legacy_player_set_display_visible(player_h player, bool visible)
1498 PLAYER_INSTANCE_CHECK(player);
1499 player_s *handle = (player_s *)player;
1502 if (visible == TRUE)
1505 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", value, (char *)NULL);
1506 if (ret != MM_ERROR_NONE) {
1507 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1509 handle->is_display_visible = visible;
1510 return PLAYER_ERROR_NONE;
1514 int legacy_player_is_display_visible(player_h player, bool *visible)
1516 PLAYER_INSTANCE_CHECK(player);
1517 PLAYER_NULL_ARG_CHECK(visible);
1518 player_s *handle = (player_s *)player;
1520 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_visible", &count, (char *)NULL);
1521 if (ret != MM_ERROR_NONE) {
1522 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1529 return PLAYER_ERROR_NONE;
1533 int legacy_player_get_content_info(player_h player, player_content_info_e key, char **value)
1535 PLAYER_INSTANCE_CHECK(player);
1536 PLAYER_NULL_ARG_CHECK(value);
1537 player_s *handle = (player_s *)player;
1538 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1539 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1540 return PLAYER_ERROR_INVALID_STATE;
1548 case PLAYER_CONTENT_INFO_ALBUM:
1549 attr = MM_PLAYER_TAG_ALBUM;
1551 case PLAYER_CONTENT_INFO_ARTIST:
1552 attr = MM_PLAYER_TAG_ARTIST;
1554 case PLAYER_CONTENT_INFO_AUTHOR:
1555 attr = MM_PLAYER_TAG_AUTHOUR;
1557 case PLAYER_CONTENT_INFO_GENRE:
1558 attr = MM_PLAYER_TAG_GENRE;
1560 case PLAYER_CONTENT_INFO_TITLE:
1561 attr = MM_PLAYER_TAG_TITLE;
1563 case PLAYER_CONTENT_INFO_YEAR:
1564 attr = MM_PLAYER_TAG_DATE;
1570 int ret = mm_player_get_attribute(handle->mm_handle, NULL, attr, &val, &val_len, (char *)NULL);
1571 if (ret != MM_ERROR_NONE) {
1572 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1576 *value = strndup(val, val_len);
1578 *value = strndup("", 0);
1580 if (*value == NULL) {
1581 LOGE("[%s] PLAYER_ERROR_OUT_OF_MEMORY(0x%08x) : fail to strdup ", __FUNCTION__, PLAYER_ERROR_OUT_OF_MEMORY);
1582 return PLAYER_ERROR_OUT_OF_MEMORY;
1584 return PLAYER_ERROR_NONE;
1588 int legacy_player_get_codec_info(player_h player, char **audio_codec, char **video_codec)
1590 PLAYER_INSTANCE_CHECK(player);
1591 PLAYER_NULL_ARG_CHECK(audio_codec);
1592 PLAYER_NULL_ARG_CHECK(video_codec);
1593 player_s *handle = (player_s *)player;
1594 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1595 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1596 return PLAYER_ERROR_INVALID_STATE;
1604 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_AUDIO_CODEC, &audio, &audio_len, MM_PLAYER_VIDEO_CODEC, &video, &video_len, (char *)NULL);
1605 if (ret != MM_ERROR_NONE) {
1606 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1608 *audio_codec = NULL;
1610 *audio_codec = strndup(audio, audio_len);
1612 *audio_codec = strndup("", 0);
1614 *video_codec = NULL;
1616 *video_codec = strndup(video, video_len);
1618 *video_codec = strndup("", 0);
1620 LOGD("codec info: %s, %s", *audio_codec, *video_codec);
1621 return PLAYER_ERROR_NONE;
1625 int legacy_player_get_audio_stream_info(player_h player, int *sample_rate, int *channel, int *bit_rate)
1627 PLAYER_INSTANCE_CHECK(player);
1628 PLAYER_NULL_ARG_CHECK(sample_rate);
1629 PLAYER_NULL_ARG_CHECK(channel);
1630 PLAYER_NULL_ARG_CHECK(bit_rate);
1631 player_s *handle = (player_s *)player;
1632 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1633 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1634 return PLAYER_ERROR_INVALID_STATE;
1636 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_AUDIO_SAMPLERATE, sample_rate, MM_PLAYER_AUDIO_CHANNEL, channel, MM_PLAYER_AUDIO_BITRATE, bit_rate, (char *)NULL);
1637 if (ret != MM_ERROR_NONE)
1638 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1640 return PLAYER_ERROR_NONE;
1643 int legacy_player_get_video_stream_info(player_h player, int *fps, int *bit_rate)
1645 PLAYER_INSTANCE_CHECK(player);
1646 PLAYER_NULL_ARG_CHECK(fps);
1647 PLAYER_NULL_ARG_CHECK(bit_rate);
1648 player_s *handle = (player_s *)player;
1649 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1650 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1651 return PLAYER_ERROR_INVALID_STATE;
1653 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "content_video_fps", fps, "content_video_bitrate", bit_rate, (char *)NULL);
1654 if (ret != MM_ERROR_NONE)
1655 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1657 return PLAYER_ERROR_NONE;
1660 int legacy_player_get_video_size(player_h player, int *width, int *height)
1662 PLAYER_INSTANCE_CHECK(player);
1663 PLAYER_NULL_ARG_CHECK(width);
1664 PLAYER_NULL_ARG_CHECK(height);
1665 player_s *handle = (player_s *)player;
1666 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1667 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1668 return PLAYER_ERROR_INVALID_STATE;
1672 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_WIDTH, &w, MM_PLAYER_VIDEO_HEIGHT, &h, (char *)NULL);
1673 if (ret != MM_ERROR_NONE) {
1674 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1678 LOGI("[%s] width : %d, height : %d", __FUNCTION__, w, h);
1679 return PLAYER_ERROR_NONE;
1683 int legacy_player_get_album_art(player_h player, void **album_art, int *size)
1685 PLAYER_INSTANCE_CHECK(player);
1686 PLAYER_NULL_ARG_CHECK(size);
1687 player_s *handle = (player_s *)player;
1688 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1689 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1690 return PLAYER_ERROR_INVALID_STATE;
1693 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "tag_album_cover", album_art, size, (char *)NULL);
1694 if (ret != MM_ERROR_NONE)
1695 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1697 return PLAYER_ERROR_NONE;
1700 int legacy_player_audio_effect_get_equalizer_bands_count(player_h player, int *count)
1702 PLAYER_INSTANCE_CHECK(player);
1703 PLAYER_NULL_ARG_CHECK(count);
1704 player_s *handle = (player_s *)player;
1706 int ret = mm_player_audio_effect_custom_get_eq_bands_number(handle->mm_handle, count);
1707 if (ret != MM_ERROR_NONE)
1708 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1710 return PLAYER_ERROR_NONE;
1713 int legacy_player_audio_effect_set_equalizer_all_bands(player_h player, int *band_levels, int length)
1715 PLAYER_INSTANCE_CHECK(player);
1716 PLAYER_NULL_ARG_CHECK(band_levels);
1717 player_s *handle = (player_s *)player;
1719 int ret = mm_player_audio_effect_custom_set_level_eq_from_list(handle->mm_handle, band_levels, length);
1720 if (ret != MM_ERROR_NONE) {
1721 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1723 ret = mm_player_audio_effect_custom_apply(handle->mm_handle);
1724 return (ret == MM_ERROR_NONE) ? PLAYER_ERROR_NONE : __player_convert_error_code(ret, (char *)__FUNCTION__);
1728 int legacy_player_audio_effect_set_equalizer_band_level(player_h player, int index, int level)
1730 PLAYER_INSTANCE_CHECK(player);
1731 player_s *handle = (player_s *)player;
1733 int ret = mm_player_audio_effect_custom_set_level(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ, index, level);
1734 if (ret != MM_ERROR_NONE) {
1735 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1737 ret = mm_player_audio_effect_custom_apply(handle->mm_handle);
1738 return (ret == MM_ERROR_NONE) ? PLAYER_ERROR_NONE : __player_convert_error_code(ret, (char *)__FUNCTION__);
1742 int legacy_player_audio_effect_get_equalizer_band_level(player_h player, int index, int *level)
1744 PLAYER_INSTANCE_CHECK(player);
1745 PLAYER_NULL_ARG_CHECK(level);
1746 player_s *handle = (player_s *)player;
1748 int ret = mm_player_audio_effect_custom_get_level(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ, index, level);
1749 if (ret != MM_ERROR_NONE)
1750 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1752 return PLAYER_ERROR_NONE;
1755 int legacy_player_audio_effect_get_equalizer_level_range(player_h player, int *min, int *max)
1757 PLAYER_INSTANCE_CHECK(player);
1758 PLAYER_NULL_ARG_CHECK(min);
1759 PLAYER_NULL_ARG_CHECK(max);
1760 player_s *handle = (player_s *)player;
1762 int ret = mm_player_audio_effect_custom_get_level_range(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ, min, max);
1763 if (ret != MM_ERROR_NONE)
1764 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1766 return PLAYER_ERROR_NONE;
1769 int legacy_player_audio_effect_get_equalizer_band_frequency(player_h player, int index, int *frequency)
1771 PLAYER_INSTANCE_CHECK(player);
1772 PLAYER_NULL_ARG_CHECK(frequency);
1773 player_s *handle = (player_s *)player;
1775 int ret = mm_player_audio_effect_custom_get_eq_bands_freq(handle->mm_handle, index, frequency);
1776 if (ret != MM_ERROR_NONE)
1777 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1779 return PLAYER_ERROR_NONE;
1782 int legacy_player_audio_effect_get_equalizer_band_frequency_range(player_h player, int index, int *range)
1784 PLAYER_INSTANCE_CHECK(player);
1785 PLAYER_NULL_ARG_CHECK(range);
1786 player_s *handle = (player_s *)player;
1788 int ret = mm_player_audio_effect_custom_get_eq_bands_width(handle->mm_handle, index, range);
1789 if (ret != MM_ERROR_NONE)
1790 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1792 return PLAYER_ERROR_NONE;
1795 int legacy_player_audio_effect_equalizer_clear(player_h player)
1797 PLAYER_INSTANCE_CHECK(player);
1798 player_s *handle = (player_s *)player;
1800 int ret = mm_player_audio_effect_custom_clear_eq_all(handle->mm_handle);
1801 if (ret != MM_ERROR_NONE) {
1802 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1804 ret = mm_player_audio_effect_custom_apply(handle->mm_handle);
1805 return (ret == MM_ERROR_NONE) ? PLAYER_ERROR_NONE : __player_convert_error_code(ret, (char *)__FUNCTION__);
1809 int legacy_player_audio_effect_equalizer_is_available(player_h player, bool *available)
1811 PLAYER_INSTANCE_CHECK(player);
1812 PLAYER_NULL_ARG_CHECK(available);
1814 player_s *handle = (player_s *)player;
1815 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
1816 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1817 return PLAYER_ERROR_INVALID_STATE;
1820 int ret = mm_player_is_supported_custom_effect_type(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ);
1821 if (ret != MM_ERROR_NONE)
1825 return PLAYER_ERROR_NONE;
1828 int legacy_player_set_subtitle_path(player_h player, const char *path)
1830 PLAYER_INSTANCE_CHECK(player);
1831 player_s *handle = (player_s *)player;
1833 if ((path == NULL) && (handle->state != PLAYER_STATE_IDLE))
1834 return PLAYER_ERROR_INVALID_PARAMETER;
1836 int ret = mm_player_set_external_subtitle_path(handle->mm_handle, path);
1837 if (ret != MM_ERROR_NONE)
1838 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1840 return PLAYER_ERROR_NONE;
1843 int legacy_player_set_subtitle_position_offset(player_h player, int millisecond)
1845 PLAYER_INSTANCE_CHECK(player);
1846 /* PLAYER_CHECK_CONDITION(millisecond>=0 ,PLAYER_ERROR_INVALID_PARAMETER ,"PLAYER_ERROR_INVALID_PARAMETER" ); */
1847 player_s *handle = (player_s *)player;
1848 if (!__player_state_validate(handle, PLAYER_STATE_PLAYING)) {
1849 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1850 return PLAYER_ERROR_INVALID_STATE;
1853 int ret = mm_player_adjust_subtitle_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME, millisecond);
1854 if (ret != MM_ERROR_NONE)
1855 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1857 return PLAYER_ERROR_NONE;
1860 int legacy_player_set_progressive_download_path(player_h player, const char *path)
1862 PLAYER_INSTANCE_CHECK(player);
1863 PLAYER_NULL_ARG_CHECK(path);
1865 player_s *handle = (player_s *)player;
1866 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1868 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "pd_mode", MM_PLAYER_PD_MODE_URI, "pd_location", path, strlen(path), (char *)NULL);
1869 if (ret != MM_ERROR_NONE) {
1870 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1872 handle->is_progressive_download = 1;
1873 return PLAYER_ERROR_NONE;
1877 int legacy_player_get_progressive_download_status(player_h player, unsigned long *current, unsigned long *total_size)
1880 PLAYER_INSTANCE_CHECK(player);
1881 PLAYER_NULL_ARG_CHECK(current);
1882 PLAYER_NULL_ARG_CHECK(total_size);
1883 player_s *handle = (player_s *)player;
1884 if (handle->state != PLAYER_STATE_PLAYING && handle->state != PLAYER_STATE_PAUSED) {
1885 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1886 return PLAYER_ERROR_INVALID_STATE;
1890 int ret = mm_player_get_pd_status(handle->mm_handle, &_current, &_total);
1891 if (ret != MM_ERROR_NONE) {
1892 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1894 *current = _current;
1895 *total_size = _total;
1896 return PLAYER_ERROR_NONE;
1900 int legacy_player_capture_video(player_h player, player_video_captured_cb callback, void *user_data)
1902 PLAYER_INSTANCE_CHECK(player);
1903 PLAYER_NULL_ARG_CHECK(callback);
1905 player_s *handle = (player_s *)player;
1906 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE]) {
1907 LOGE("[%s] PLAYER_ERROR_VIDEO_CAPTURE_FAILED (0x%08x) : capturing... we can't do any more ", __FUNCTION__, PLAYER_ERROR_VIDEO_CAPTURE_FAILED);
1908 return PLAYER_ERROR_VIDEO_CAPTURE_FAILED;
1910 LOGI("[%s] Event type : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_CAPTURE);
1911 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = callback;
1912 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = user_data;
1915 if (handle->state >= PLAYER_STATE_READY) {
1916 int ret = mm_player_do_video_capture(handle->mm_handle);
1917 if (ret == MM_ERROR_PLAYER_NO_OP) {
1918 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
1919 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
1920 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION (0x%08x) : video display must be set : %d", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION, handle->display_type);
1921 return PLAYER_ERROR_INVALID_OPERATION;
1923 if (ret != MM_ERROR_NONE) {
1924 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
1925 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
1926 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1928 return PLAYER_ERROR_NONE;
1930 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1931 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
1932 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
1933 return PLAYER_ERROR_INVALID_STATE;
1937 int legacy_player_set_streaming_cookie(player_h player, const char *cookie, int size)
1939 PLAYER_INSTANCE_CHECK(player);
1940 PLAYER_NULL_ARG_CHECK(cookie);
1941 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1942 player_s *handle = (player_s *)player;
1943 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1945 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "streaming_cookie", cookie, size, (char *)NULL);
1946 if (ret != MM_ERROR_NONE)
1947 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1949 return PLAYER_ERROR_NONE;
1952 int legacy_player_set_streaming_user_agent(player_h player, const char *user_agent, int size)
1954 PLAYER_INSTANCE_CHECK(player);
1955 PLAYER_NULL_ARG_CHECK(user_agent);
1956 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1957 player_s *handle = (player_s *)player;
1958 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1960 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "streaming_user_agent", user_agent, size, (char *)NULL);
1961 if (ret != MM_ERROR_NONE)
1962 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1964 return PLAYER_ERROR_NONE;
1967 int legacy_player_get_streaming_download_progress(player_h player, int *start, int *current)
1969 PLAYER_INSTANCE_CHECK(player);
1970 PLAYER_NULL_ARG_CHECK(start);
1971 PLAYER_NULL_ARG_CHECK(current);
1972 player_s *handle = (player_s *)player;
1973 if (handle->state != PLAYER_STATE_PLAYING && handle->state != PLAYER_STATE_PAUSED) {
1974 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1975 return PLAYER_ERROR_INVALID_STATE;
1977 unsigned long _current = 0;
1978 unsigned long _start = 0;
1979 int ret = mm_player_get_buffer_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_PERCENT, &_start, &_current);
1980 if (ret != MM_ERROR_NONE) {
1981 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1983 *start = (int)_start;
1984 *current = (int)_current;
1985 return PLAYER_ERROR_NONE;
1989 int legacy_player_set_completed_cb(player_h player, player_completed_cb callback, void *user_data)
1991 return __set_callback(MUSE_PLAYER_EVENT_TYPE_COMPLETE, player, callback, user_data);
1994 int legacy_player_unset_completed_cb(player_h player)
1996 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_COMPLETE, player);
1999 #ifdef TIZEN_FEATURE_EVAS_RENDERER
2000 int legacy_player_set_retrieve_buffer_cb(player_h player, player_retrieve_buffer_cb callback, void *user_data)
2002 return __set_callback(MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER, player, callback, user_data);
2005 int legacy_player_unset_retrieve_buffer_cb(player_h player)
2007 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_RETURN_BUFFER, player);
2011 int legacy_player_set_interrupted_cb(player_h player, player_interrupted_cb callback, void *user_data)
2013 return __set_callback(MUSE_PLAYER_EVENT_TYPE_INTERRUPT, player, callback, user_data);
2016 int legacy_player_unset_interrupted_cb(player_h player)
2018 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_INTERRUPT, player);
2021 int legacy_player_set_error_cb(player_h player, player_error_cb callback, void *user_data)
2023 return __set_callback(MUSE_PLAYER_EVENT_TYPE_ERROR, player, callback, user_data);
2026 int legacy_player_unset_error_cb(player_h player)
2028 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_ERROR, player);
2031 int legacy_player_set_buffering_cb(player_h player, player_buffering_cb callback, void *user_data)
2033 return __set_callback(MUSE_PLAYER_EVENT_TYPE_BUFFERING, player, callback, user_data);
2036 int legacy_player_unset_buffering_cb(player_h player)
2038 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_BUFFERING, player);
2041 int legacy_player_set_subtitle_updated_cb(player_h player, player_subtitle_updated_cb callback, void *user_data)
2043 return __set_callback(MUSE_PLAYER_EVENT_TYPE_SUBTITLE, player, callback, user_data);
2046 int legacy_player_unset_subtitle_updated_cb(player_h player)
2048 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_SUBTITLE, player);
2051 int legacy_player_set_progressive_download_message_cb(player_h player, player_pd_message_cb callback, void *user_data)
2053 PLAYER_INSTANCE_CHECK(player);
2054 PLAYER_NULL_ARG_CHECK(callback);
2056 player_s *handle = (player_s *)player;
2058 if (handle->state != PLAYER_STATE_IDLE && handle->state != PLAYER_STATE_READY) {
2059 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2060 return PLAYER_ERROR_INVALID_STATE;
2063 int ret = mm_player_set_pd_message_callback(handle->mm_handle, __pd_message_callback, (void *)handle);
2064 if (ret != MM_ERROR_NONE)
2065 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2067 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD] = callback;
2068 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PD] = user_data;
2069 LOGI("[%s] Event type : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_PD);
2070 return PLAYER_ERROR_NONE;
2073 int legacy_player_unset_progressive_download_message_cb(player_h player)
2075 PLAYER_INSTANCE_CHECK(player);
2076 player_s *handle = (player_s *)player;
2078 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
2079 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD] = NULL;
2080 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PD] = NULL;
2081 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
2082 LOGI("[%s] Event type : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_PD);
2084 int ret = mm_player_set_pd_message_callback(handle->mm_handle, NULL, NULL);
2085 if (ret != MM_ERROR_NONE)
2086 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2088 return PLAYER_ERROR_NONE;
2091 int legacy_player_release_video_stream_bo(player_h player, void* bo)
2093 PLAYER_INSTANCE_CHECK(player);
2094 player_s *handle = (player_s *)player;
2096 LOGD("ENTER %p %p", player, bo);
2098 mm_player_release_video_stream_bo(handle->mm_handle, bo);
2102 return PLAYER_ERROR_NONE;
2105 int legacy_player_set_media_packet_video_frame_decoded_cb(player_h player, legacy_player_media_packet_video_decoded_cb callback, void *user_data)
2107 PLAYER_INSTANCE_CHECK(player);
2108 PLAYER_NULL_ARG_CHECK(callback);
2110 player_s *handle = (player_s *)player;
2111 if (handle->state != PLAYER_STATE_IDLE) {
2112 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2113 return PLAYER_ERROR_INVALID_STATE;
2116 int ret = mm_player_set_video_stream_callback(handle->mm_handle, (mm_player_video_stream_callback)callback, user_data);
2117 if (ret != MM_ERROR_NONE)
2118 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2120 return PLAYER_ERROR_NONE;
2123 int legacy_player_unset_media_packet_video_frame_decoded_cb(player_h player)
2125 PLAYER_INSTANCE_CHECK(player);
2126 player_s *handle = (player_s *)player;
2128 LOGI("Event type : %d ", MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
2130 int ret = mm_player_set_video_stream_callback(handle->mm_handle, NULL, NULL);
2131 if (ret != MM_ERROR_NONE)
2132 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2134 return PLAYER_ERROR_NONE;
2137 static bool __video_stream_changed_callback(void *user_data)
2139 player_s *handle = (player_s *)user_data;
2140 muse_player_event_e event_type = MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED;
2142 LOGE("[%s] event type %d", __FUNCTION__, event_type);
2144 if (handle->user_cb[event_type]) {
2145 int width = 0, height = 0, fps = 0, bit_rate = 0;
2146 int ret = mm_player_get_attribute(handle->mm_handle, NULL,
2147 MM_PLAYER_VIDEO_WIDTH, &width,
2148 MM_PLAYER_VIDEO_HEIGHT, &height,
2149 "content_video_fps", &fps,
2150 "content_video_bitrate", &bit_rate, (char *)NULL);
2152 if (ret != MM_ERROR_NONE) {
2153 LOGE("[%s] get attr is failed", __FUNCTION__);
2157 ((player_video_stream_changed_cb)handle->user_cb[event_type])(width, height, fps, bit_rate, handle->user_data[event_type]);
2159 LOGE("[%s] video stream changed cb was not set.", __FUNCTION__);
2166 int legacy_player_set_video_stream_changed_cb(player_h player, player_video_stream_changed_cb callback, void *user_data)
2169 PLAYER_INSTANCE_CHECK(player);
2170 PLAYER_NULL_ARG_CHECK(callback);
2171 player_s *handle = (player_s *)player;
2173 if (handle->state != PLAYER_STATE_IDLE) {
2174 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2175 return PLAYER_ERROR_INVALID_STATE;
2178 ret = mm_player_set_video_stream_changed_callback(handle->mm_handle, (mm_player_stream_changed_callback)__video_stream_changed_callback, (void *)handle);
2180 if (ret != MM_ERROR_NONE)
2181 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2183 return __set_callback(MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED, player, callback, user_data);
2186 int legacy_player_unset_video_stream_changed_cb(player_h player)
2189 PLAYER_INSTANCE_CHECK(player);
2190 player_s *handle = (player_s *)player;
2192 __unset_callback(MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED, player);
2194 ret = mm_player_set_video_stream_changed_callback(handle->mm_handle, NULL, NULL);
2195 if (ret != MM_ERROR_NONE)
2196 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2198 return PLAYER_ERROR_NONE;
2201 static bool __media_stream_buffer_status_callback(player_stream_type_e type, player_media_stream_buffer_status_e status, unsigned long long bytes, void *user_data)
2203 player_s *handle = (player_s *)user_data;
2204 muse_player_event_e event_type;
2206 if (type == PLAYER_STREAM_TYPE_AUDIO)
2207 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS;
2208 else if (type == PLAYER_STREAM_TYPE_VIDEO)
2209 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS;
2213 LOGE("[%s] event type %d", __FUNCTION__, event_type);
2215 if (handle->user_cb[event_type]) {
2216 ((player_media_stream_buffer_status_cb)handle->user_cb[event_type])(status, handle->user_data[event_type]);
2218 LOGE("[%s][type:%d] buffer status cb was not set.", __FUNCTION__, type);
2225 static bool __media_stream_seek_data_callback(player_stream_type_e type, unsigned long long offset, void *user_data)
2227 player_s *handle = (player_s *)user_data;
2228 muse_player_event_e event_type;
2230 if (type == PLAYER_STREAM_TYPE_AUDIO)
2231 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK;
2232 else if (type == PLAYER_STREAM_TYPE_VIDEO)
2233 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK;
2237 LOGE("[%s] event type %d", __FUNCTION__, event_type);
2239 if (handle->user_cb[event_type]) {
2240 ((player_media_stream_seek_cb)handle->user_cb[event_type])(offset, handle->user_data[event_type]);
2242 LOGE("[%s][type:%d] seek cb was not set.", __FUNCTION__, type);
2249 int legacy_player_set_media_stream_buffer_status_cb(player_h player, player_stream_type_e type, player_media_stream_buffer_status_cb callback, void *user_data)
2252 PLAYER_INSTANCE_CHECK(player);
2253 PLAYER_NULL_ARG_CHECK(callback);
2254 player_s *handle = (player_s *)player;
2256 if (handle->state != PLAYER_STATE_IDLE) {
2257 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2258 return PLAYER_ERROR_INVALID_STATE;
2260 /* the type can be expaned with default and text. */
2261 if ((type != PLAYER_STREAM_TYPE_VIDEO) && (type != PLAYER_STREAM_TYPE_AUDIO)) {
2262 LOGE("[%s] PLAYER_ERROR_INVALID_PARAMETER(type : %d)", __FUNCTION__, type);
2263 return PLAYER_ERROR_INVALID_PARAMETER;
2266 ret = mm_player_set_media_stream_buffer_status_callback(handle->mm_handle, type, (mm_player_media_stream_buffer_status_callback)__media_stream_buffer_status_callback, (void *)handle);
2268 if (ret != MM_ERROR_NONE)
2269 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2271 if (type == PLAYER_STREAM_TYPE_VIDEO)
2272 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS, player, callback, user_data);
2274 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS, player, callback, user_data);
2277 int legacy_player_unset_media_stream_buffer_status_cb(player_h player, player_stream_type_e type)
2280 PLAYER_INSTANCE_CHECK(player);
2281 player_s *handle = (player_s *)player;
2283 if (type == PLAYER_STREAM_TYPE_VIDEO)
2284 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS, player);
2285 else if (type == PLAYER_STREAM_TYPE_AUDIO)
2286 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS, player);
2288 return PLAYER_ERROR_INVALID_PARAMETER;
2290 ret = mm_player_set_media_stream_buffer_status_callback(handle->mm_handle, type, NULL, NULL);
2291 if (ret != MM_ERROR_NONE)
2292 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2294 return PLAYER_ERROR_NONE;
2297 int legacy_player_set_media_stream_seek_cb(player_h player, player_stream_type_e type, player_media_stream_seek_cb callback, void *user_data)
2300 PLAYER_INSTANCE_CHECK(player);
2301 PLAYER_NULL_ARG_CHECK(callback);
2302 player_s *handle = (player_s *)player;
2304 if (handle->state != PLAYER_STATE_IDLE) {
2305 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2306 return PLAYER_ERROR_INVALID_STATE;
2308 /* the type can be expaned with default and text. */
2309 if ((type != PLAYER_STREAM_TYPE_VIDEO) && (type != PLAYER_STREAM_TYPE_AUDIO)) {
2310 LOGE("[%s] PLAYER_ERROR_INVALID_PARAMETER(type : %d)", __FUNCTION__, type);
2311 return PLAYER_ERROR_INVALID_PARAMETER;
2314 ret = mm_player_set_media_stream_seek_data_callback(handle->mm_handle, type, (mm_player_media_stream_seek_data_callback)__media_stream_seek_data_callback, (void *)handle);
2316 if (ret != MM_ERROR_NONE)
2317 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2319 if (type == PLAYER_STREAM_TYPE_VIDEO)
2320 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK, player, callback, user_data);
2322 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK, player, callback, user_data);
2325 int legacy_player_unset_media_stream_seek_cb(player_h player, player_stream_type_e type)
2328 PLAYER_INSTANCE_CHECK(player);
2329 player_s *handle = (player_s *)player;
2331 if (type == PLAYER_STREAM_TYPE_VIDEO)
2332 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK, player);
2333 else if (type == PLAYER_STREAM_TYPE_AUDIO)
2334 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK, player);
2336 return PLAYER_ERROR_INVALID_PARAMETER;
2338 ret = mm_player_set_media_stream_seek_data_callback(handle->mm_handle, type, NULL, NULL);
2339 if (ret != MM_ERROR_NONE)
2340 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2342 return PLAYER_ERROR_NONE;
2345 int legacy_player_push_media_stream(player_h player, media_packet_h packet)
2347 PLAYER_INSTANCE_CHECK(player);
2348 player_s *handle = (player_s *)player;
2350 PLAYER_CHECK_CONDITION(handle->error_code == PLAYER_ERROR_NONE, PLAYER_ERROR_NOT_SUPPORTED_FILE, "can't support this format");
2352 int ret = mm_player_submit_packet(handle->mm_handle, packet);
2354 if (ret != MM_ERROR_NONE)
2355 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2357 return PLAYER_ERROR_NONE;
2360 int legacy_player_set_media_stream_info(player_h player, player_stream_type_e type, media_format_h format)
2363 PLAYER_INSTANCE_CHECK(player);
2364 player_s *handle = (player_s *)player;
2365 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2367 handle->is_media_stream = TRUE;
2369 if (type == PLAYER_STREAM_TYPE_VIDEO)
2370 ret = mm_player_set_video_info(handle->mm_handle, format);
2371 else if (type == PLAYER_STREAM_TYPE_AUDIO)
2372 ret = mm_player_set_audio_info(handle->mm_handle, format);
2374 return PLAYER_ERROR_INVALID_PARAMETER;
2376 if (ret != MM_ERROR_NONE)
2377 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2379 return PLAYER_ERROR_NONE;
2381 return PLAYER_ERROR_NONE;
2384 int legacy_player_set_media_stream_buffer_max_size(player_h player, player_stream_type_e type, unsigned long long max_size)
2387 PLAYER_INSTANCE_CHECK(player);
2388 player_s *handle = (player_s *)player;
2389 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2390 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2391 return PLAYER_ERROR_INVALID_STATE;
2394 ret = mm_player_set_media_stream_buffer_max_size(handle->mm_handle, type, max_size);
2396 if (ret != MM_ERROR_NONE)
2397 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2399 return PLAYER_ERROR_NONE;
2402 int legacy_player_get_media_stream_buffer_max_size(player_h player, player_stream_type_e type, unsigned long long *max_size)
2404 PLAYER_INSTANCE_CHECK(player);
2405 PLAYER_NULL_ARG_CHECK(max_size);
2406 player_s *handle = (player_s *)player;
2408 unsigned long long _max_size;
2409 int ret = mm_player_get_media_stream_buffer_max_size(handle->mm_handle, type, &_max_size);
2410 if (ret != MM_ERROR_NONE) {
2411 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2413 *max_size = _max_size;
2414 return PLAYER_ERROR_NONE;
2418 int legacy_player_set_media_stream_buffer_min_threshold(player_h player, player_stream_type_e type, unsigned int percent)
2421 PLAYER_INSTANCE_CHECK(player);
2422 player_s *handle = (player_s *)player;
2423 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2424 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2425 return PLAYER_ERROR_INVALID_STATE;
2428 ret = mm_player_set_media_stream_buffer_min_percent(handle->mm_handle, type, percent);
2430 if (ret != MM_ERROR_NONE)
2431 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2433 return PLAYER_ERROR_NONE;
2436 int legacy_player_get_media_stream_buffer_min_threshold(player_h player, player_stream_type_e type, unsigned int *percent)
2438 PLAYER_INSTANCE_CHECK(player);
2439 PLAYER_NULL_ARG_CHECK(percent);
2440 player_s *handle = (player_s *)player;
2442 unsigned int _value;
2443 int ret = mm_player_get_media_stream_buffer_min_percent(handle->mm_handle, type, &_value);
2444 if (ret != MM_ERROR_NONE) {
2445 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2448 return PLAYER_ERROR_NONE;
2452 int legacy_player_get_track_count(player_h player, player_stream_type_e type, int *count)
2454 PLAYER_INSTANCE_CHECK(player);
2455 PLAYER_NULL_ARG_CHECK(count);
2456 player_s *handle = (player_s *)player;
2458 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2459 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2460 return PLAYER_ERROR_INVALID_STATE;
2463 MMPlayerTrackType track_type = 0;
2465 case PLAYER_STREAM_TYPE_AUDIO:
2466 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
2468 case PLAYER_STREAM_TYPE_TEXT:
2469 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
2472 LOGE("invalid stream type %d", type);
2473 return PLAYER_ERROR_INVALID_PARAMETER;
2476 int ret = mm_player_get_track_count(handle->mm_handle, track_type, count);
2477 if (ret != MM_ERROR_NONE)
2478 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2480 return PLAYER_ERROR_NONE;
2483 int legacy_player_get_current_track(player_h player, player_stream_type_e type, int *index)
2485 PLAYER_INSTANCE_CHECK(player);
2486 PLAYER_NULL_ARG_CHECK(index);
2487 player_s *handle = (player_s *)player;
2489 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2490 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2491 return PLAYER_ERROR_INVALID_STATE;
2494 MMPlayerTrackType track_type = 0;
2496 case PLAYER_STREAM_TYPE_AUDIO:
2497 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
2499 case PLAYER_STREAM_TYPE_TEXT:
2500 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
2503 LOGE("invalid stream type %d", type);
2504 return PLAYER_ERROR_INVALID_PARAMETER;
2507 int ret = mm_player_get_current_track(handle->mm_handle, track_type, index);
2508 if (ret != MM_ERROR_NONE)
2509 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2511 return PLAYER_ERROR_NONE;
2514 int legacy_player_select_track(player_h player, player_stream_type_e type, int index)
2516 PLAYER_INSTANCE_CHECK(player);
2517 PLAYER_CHECK_CONDITION(index >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
2518 player_s *handle = (player_s *)player;
2520 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2521 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2522 return PLAYER_ERROR_INVALID_STATE;
2525 MMPlayerTrackType track_type = 0;
2527 case PLAYER_STREAM_TYPE_AUDIO:
2528 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
2530 case PLAYER_STREAM_TYPE_TEXT:
2531 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
2534 LOGE("invalid stream type %d", type);
2535 return PLAYER_ERROR_INVALID_PARAMETER;
2538 int ret = mm_player_select_track(handle->mm_handle, track_type, index);
2539 if (ret != MM_ERROR_NONE)
2540 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2542 return PLAYER_ERROR_NONE;
2545 int legacy_player_get_track_language_code(player_h player, player_stream_type_e type, int index, char **code, int *len)
2547 PLAYER_INSTANCE_CHECK(player);
2548 PLAYER_NULL_ARG_CHECK(code);
2549 PLAYER_NULL_ARG_CHECK(len);
2550 player_s *handle = (player_s *)player;
2551 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2552 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2553 return PLAYER_ERROR_INVALID_STATE;
2556 char *language_code = NULL;
2557 MMPlayerTrackType track_type = 0;
2559 case PLAYER_STREAM_TYPE_AUDIO:
2560 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
2562 case PLAYER_STREAM_TYPE_VIDEO:
2563 track_type = MM_PLAYER_TRACK_TYPE_VIDEO;
2565 case PLAYER_STREAM_TYPE_TEXT:
2566 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
2569 LOGE("invalid stream type %d", type);
2570 return PLAYER_ERROR_INVALID_PARAMETER;
2573 int ret = mm_player_get_track_language_code(handle->mm_handle, track_type, index, &language_code);
2574 if (ret != MM_ERROR_NONE) {
2575 if (language_code != NULL)
2576 free(language_code);
2578 language_code = NULL;
2579 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2583 if (language_code != NULL && strncmp(language_code, "und", 3)) {
2585 *code = strndup(language_code, code_len);
2588 *code = strndup("und", code_len);
2593 free(language_code);
2595 language_code = NULL;
2596 return PLAYER_ERROR_NONE;
2600 int legacy_player_set_roi_area(player_h player, int x, int y, int w, int h)
2602 PLAYER_INSTANCE_CHECK(player);
2603 player_s *handle = (player_s *)player;
2609 /* check roi display mode */
2610 ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_method", &mode, (char *)NULL);
2611 if (ret != MM_ERROR_NONE)
2612 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2613 if (mode != MM_DISPLAY_METHOD_CUSTOM_ROI) {
2614 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
2615 return PLAYER_ERROR_INVALID_OPERATION;
2619 ret = mm_player_set_attribute(handle->mm_handle, NULL, "wl_window_render_x", x, "wl_window_render_y", y, "wl_window_render_width", w, "wl_window_render_height", h, (char *)NULL);
2620 if (ret != MM_ERROR_NONE)
2621 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2623 return PLAYER_ERROR_NONE;
2626 int legacy_player_set_display(player_h player, player_display_type_e type, unsigned int wl_surface_id)
2628 PLAYER_INSTANCE_CHECK(player);
2629 player_s *handle = (player_s *)player;
2630 void *set_handle = NULL;
2631 MMDisplaySurfaceType mmType = __player_convert_display_type(type);
2635 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2636 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2637 return PLAYER_ERROR_INVALID_STATE;
2640 if (type == PLAYER_DISPLAY_TYPE_NONE) {
2642 handle->display_handle = 0;
2643 handle->display_type = type;
2646 /* get handle from overlay or evas surface */
2647 temp = handle->display_handle;
2648 if (type == PLAYER_DISPLAY_TYPE_OVERLAY) {
2649 LOGI("Wayland overlay surface type");
2650 LOGI("wl_surface_id %d", wl_surface_id);
2651 handle->display_handle = (void *)(uintptr_t)wl_surface_id;
2652 set_handle = &(handle->display_handle);
2653 #ifdef TIZEN_FEATURE_EVAS_RENDERER
2654 } else if (type == PLAYER_DISPLAY_TYPE_EVAS) {
2655 LOGI("Evas surface type");
2656 set_handle = &(handle->display_handle);
2659 LOGE("invalid surface type");
2660 return PLAYER_ERROR_INVALID_PARAMETER;
2664 /* set display handle */
2665 if (handle->display_type == PLAYER_DISPLAY_TYPE_NONE || type == handle->display_type) {
2666 /* first time or same type */
2667 LOGW("first time or same type");
2668 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", mmType, "display_overlay", set_handle, sizeof(wl_surface_id), NULL);
2670 if (ret != MM_ERROR_NONE) {
2671 handle->display_handle = temp;
2672 LOGE("[%s] Failed to display surface change :%d", __FUNCTION__, ret);
2674 if (type != PLAYER_DISPLAY_TYPE_NONE) {
2675 handle->display_type = type;
2676 LOGI("[%s] video display has been changed- type :%d, addr : 0x%x", __FUNCTION__, handle->display_type, handle->display_handle);
2678 LOGI("NULL surface");
2682 /* changing surface case */
2683 ret = mm_player_change_videosink(handle->mm_handle, mmType, set_handle);
2684 if (ret != MM_ERROR_NONE) {
2685 handle->display_handle = temp;
2686 if (ret == MM_ERROR_NOT_SUPPORT_API) {
2687 LOGE("[%s] change video sink is not available.", __FUNCTION__);
2688 ret = PLAYER_ERROR_NONE;
2690 LOGE("[%s] Failed to display surface change :%d", __FUNCTION__, ret);
2693 handle->display_type = type;
2694 LOGI("[%s] video display has been changed- type :%d, addr : 0x%x", __FUNCTION__, handle->display_type, handle->display_handle);
2698 if (ret != MM_ERROR_NONE) {
2699 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
2700 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2702 return PLAYER_ERROR_NONE;
2706 int legacy_player_set_sound_stream_info_for_mused(player_h player, char *stream_type, int stream_index)
2708 PLAYER_INSTANCE_CHECK(player);
2709 player_s *handle = (player_s *)player;
2712 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2713 if (stream_type == NULL || stream_index < 0) {
2714 LOGE("invalid parameter %p %d", stream_type, stream_index);
2715 return PLAYER_ERROR_INVALID_PARAMETER;
2718 ret = mm_player_set_sound_stream_info(handle->mm_handle, stream_type, stream_index);
2720 if (ret != MM_ERROR_NONE)
2721 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2723 return PLAYER_ERROR_NONE;
2726 int legacy_player_sound_register(player_h player, int pid)
2728 PLAYER_INSTANCE_CHECK(player);
2729 player_s *handle = (player_s *)player;
2732 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2734 ret = mm_player_sound_register(handle->mm_handle, pid);
2735 if (ret != MM_ERROR_NONE)
2736 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2738 return PLAYER_ERROR_NONE;
2741 int legacy_player_get_timeout_for_muse(player_h player, int *timeout)
2743 PLAYER_INSTANCE_CHECK(player);
2744 player_s *handle = (player_s *)player;
2747 ret = mm_player_get_timeout(handle->mm_handle, timeout);
2748 if (ret != MM_ERROR_NONE)
2749 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2751 return PLAYER_ERROR_NONE;
2754 int legacy_player_get_num_of_video_out_buffers(player_h player, int *num, int *extra_num)
2756 PLAYER_INSTANCE_CHECK(player);
2757 PLAYER_NULL_ARG_CHECK(num);
2758 PLAYER_NULL_ARG_CHECK(extra_num);
2759 player_s *handle = (player_s *)player;
2761 int ret = mm_player_get_num_of_video_out_buffers(handle->mm_handle, num, extra_num);
2762 if (ret != MM_ERROR_NONE)
2763 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2765 return PLAYER_ERROR_NONE;
2768 int legacy_player_set_file_buffering_path(player_h player, const char *file_path)
2770 PLAYER_INSTANCE_CHECK(player);
2771 PLAYER_NULL_ARG_CHECK(file_path);
2772 player_s *handle = (player_s *)player;
2773 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2775 int ret = mm_player_set_file_buffering_path(handle->mm_handle, file_path);
2777 if (ret != MM_ERROR_NONE)
2778 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2780 return PLAYER_ERROR_NONE;
2783 int legacy_player_manage_external_storage_state(player_h player, int id, int state)
2785 int ret = PLAYER_ERROR_NONE;
2786 PLAYER_INSTANCE_CHECK(player);
2787 player_s *handle = (player_s *)player;
2789 ret = mm_player_manage_external_storage_state(handle->mm_handle, id, state);
2791 if (ret != MM_ERROR_NONE)
2792 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2794 return PLAYER_ERROR_NONE;
2797 int legacy_player_get_adaptive_variant_info(player_h player, int *num, char **var_info)
2799 int ret = PLAYER_ERROR_NONE;
2800 PLAYER_INSTANCE_CHECK(player);
2801 PLAYER_NULL_ARG_CHECK(num);
2802 PLAYER_NULL_ARG_CHECK(var_info);
2803 player_s *handle = (player_s *)player;
2805 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2806 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2807 return PLAYER_ERROR_INVALID_STATE;
2810 ret = mm_player_get_adaptive_variant_info(handle->mm_handle, num, var_info);
2812 if (ret != MM_ERROR_NONE)
2813 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2815 return PLAYER_ERROR_NONE;
2818 int legacy_player_set_max_adaptive_variant_limit(player_h player, int bandwidth, int width, int height)
2821 PLAYER_INSTANCE_CHECK(player);
2822 player_s *handle = (player_s *)player;
2824 ret = mm_player_set_max_adaptive_variant_limit(handle->mm_handle, bandwidth, width, height);
2826 if (ret != MM_ERROR_NONE)
2827 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2829 return PLAYER_ERROR_NONE;
2832 int legacy_player_get_max_adaptive_variant_limit(player_h player, int *bandwidth, int *width, int *height)
2834 PLAYER_INSTANCE_CHECK(player);
2835 PLAYER_NULL_ARG_CHECK(bandwidth);
2836 PLAYER_NULL_ARG_CHECK(width);
2837 PLAYER_NULL_ARG_CHECK(height);
2838 player_s *handle = (player_s *)player;
2840 int ret = mm_player_get_max_adaptive_variant_limit(handle->mm_handle, bandwidth, width, height);
2842 if (ret != MM_ERROR_NONE)
2843 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2845 return PLAYER_ERROR_NONE;
2848 int legacy_player_set_audio_only(player_h player, bool audio_only)
2850 PLAYER_INSTANCE_CHECK(player);
2851 player_s *handle = (player_s *)player;
2853 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2854 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2855 return PLAYER_ERROR_INVALID_STATE;
2858 int ret = mm_player_set_audio_only(handle->mm_handle, audio_only);
2859 if (ret != MM_ERROR_NONE)
2860 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2862 return PLAYER_ERROR_NONE;
2865 int legacy_player_is_audio_only(player_h player, bool *paudio_only)
2867 PLAYER_INSTANCE_CHECK(player);
2868 PLAYER_NULL_ARG_CHECK(paudio_only);
2869 player_s *handle = (player_s *)player;
2870 bool audio_only = false;
2872 int ret = mm_player_get_audio_only(handle->mm_handle, &audio_only);
2873 if (ret != MM_ERROR_NONE) {
2874 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2876 *paudio_only = audio_only;
2877 return PLAYER_ERROR_NONE;
2881 int legacy_player_set_streaming_buffering_time(player_h player, int buffer_ms, int rebuffer_ms)
2883 PLAYER_INSTANCE_CHECK(player);
2884 player_s *handle = (player_s *)player;
2885 int ret = MM_ERROR_NONE;
2887 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2888 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2889 return PLAYER_ERROR_INVALID_STATE;
2892 ret = mm_player_set_streaming_buffering_time(handle->mm_handle, buffer_ms, rebuffer_ms);
2893 if (ret != MM_ERROR_NONE)
2894 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2896 return PLAYER_ERROR_NONE;
2899 int legacy_player_get_streaming_buffering_time(player_h player, int *buffer_ms, int *rebuffer_ms)
2901 PLAYER_INSTANCE_CHECK(player);
2902 PLAYER_NULL_ARG_CHECK(buffer_ms);
2903 PLAYER_NULL_ARG_CHECK(rebuffer_ms);
2905 player_s *handle = (player_s *)player;
2906 int ret = MM_ERROR_NONE;
2908 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2909 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2910 return PLAYER_ERROR_INVALID_STATE;
2913 ret = mm_player_get_streaming_buffering_time(handle->mm_handle, buffer_ms, rebuffer_ms);
2914 if (ret != MM_ERROR_NONE) {
2915 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2917 return PLAYER_ERROR_NONE;
2921 int legacy_player_360_set_enable(player_h player, bool enable)
2923 PLAYER_INSTANCE_CHECK(player);
2924 player_s *handle = (player_s *)player;
2926 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2927 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
2928 return PLAYER_ERROR_INVALID_STATE;
2931 int ret = mm_player_360_set_enable(handle->mm_handle, enable);
2932 if (ret != MM_ERROR_NONE)
2933 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2935 return PLAYER_ERROR_NONE;
2938 int legacy_player_360_is_enabled(player_h player, bool *enabled)
2940 PLAYER_INSTANCE_CHECK(player);
2941 player_s *handle = (player_s *)player;
2943 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2944 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
2945 return PLAYER_ERROR_INVALID_STATE;
2948 int ret = mm_player_360_is_enabled(handle->mm_handle, enabled);
2949 if (ret != MM_ERROR_NONE) {
2950 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2952 return PLAYER_ERROR_NONE;
2956 int legacy_player_360_set_direction_of_view(player_h player, float yaw, float pitch)
2958 PLAYER_INSTANCE_CHECK(player);
2959 player_s *handle = (player_s *)player;
2960 int ret = MM_ERROR_NONE;
2962 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2963 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
2964 return PLAYER_ERROR_INVALID_STATE;
2967 ret = mm_player_360_set_direction_of_view(handle->mm_handle, yaw, pitch);
2968 if (ret != MM_ERROR_NONE)
2969 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2971 return PLAYER_ERROR_NONE;
2974 int legacy_player_360_get_direction_of_view(player_h player, float *yaw, float *pitch)
2976 PLAYER_INSTANCE_CHECK(player);
2977 PLAYER_NULL_ARG_CHECK(yaw);
2978 PLAYER_NULL_ARG_CHECK(pitch);
2980 player_s *handle = (player_s *)player;
2981 int ret = MM_ERROR_NONE;
2983 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2984 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
2985 return PLAYER_ERROR_INVALID_STATE;
2988 ret = mm_player_360_get_direction_of_view(handle->mm_handle, yaw, pitch);
2989 if (ret != MM_ERROR_NONE) {
2990 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2992 return PLAYER_ERROR_NONE;
2996 int legacy_player_360_set_zoom(player_h player, float level)
2998 PLAYER_INSTANCE_CHECK(player);
2999 player_s *handle = (player_s *)player;
3001 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
3002 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
3003 return PLAYER_ERROR_INVALID_STATE;
3006 int ret = mm_player_360_set_zoom(handle->mm_handle, level);
3007 if (ret != MM_ERROR_NONE)
3008 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3010 return PLAYER_ERROR_NONE;
3013 int legacy_player_360_get_zoom(player_h player, float *level)
3015 PLAYER_INSTANCE_CHECK(player);
3016 player_s *handle = (player_s *)player;
3018 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
3019 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
3020 return PLAYER_ERROR_INVALID_STATE;
3023 int ret = mm_player_360_get_zoom(handle->mm_handle, level);
3024 if (ret != MM_ERROR_NONE) {
3025 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3027 return PLAYER_ERROR_NONE;
3031 int legacy_player_360_set_field_of_view(player_h player, int horizontal_degrees, int vertical_degrees)
3033 PLAYER_INSTANCE_CHECK(player);
3034 player_s *handle = (player_s *)player;
3035 int ret = MM_ERROR_NONE;
3037 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
3038 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
3039 return PLAYER_ERROR_INVALID_STATE;
3042 ret = mm_player_360_set_field_of_view(handle->mm_handle, horizontal_degrees, vertical_degrees);
3043 if (ret != MM_ERROR_NONE)
3044 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3046 return PLAYER_ERROR_NONE;
3049 int legacy_player_360_get_field_of_view(player_h player, int *horizontal_degrees, int *vertical_degrees)
3051 PLAYER_INSTANCE_CHECK(player);
3052 PLAYER_NULL_ARG_CHECK(horizontal_degrees);
3053 PLAYER_NULL_ARG_CHECK(vertical_degrees);
3055 player_s *handle = (player_s *)player;
3056 int ret = MM_ERROR_NONE;
3058 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
3059 LOGE("PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", PLAYER_ERROR_INVALID_STATE, handle->state);
3060 return PLAYER_ERROR_INVALID_STATE;
3063 ret = mm_player_360_get_field_of_view(handle->mm_handle, horizontal_degrees, vertical_degrees);
3064 if (ret != MM_ERROR_NONE) {
3065 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3067 return PLAYER_ERROR_NONE;