4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, YeJin Cho <cho.yejin@samsung.com>, YoungHwan An <younghwan_.an@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
26 #include <mm_message.h>
28 #include "mm_player.h"
29 #include "mm_player_priv.h"
30 #include "mm_player_attrs.h"
31 #include "mm_player_utils.h"
32 #include "mm_player_ini.h"
34 #include "mm_player_capture.h"
36 int mm_player_create(MMHandleType *player)
38 int result = MM_ERROR_NONE;
39 mm_player_t* new_player = NULL;
43 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
45 if (!g_thread_supported ())
50 __ta__("mm_player_ini_load",
51 result = mm_player_ini_load();
53 if(result != MM_ERROR_NONE)
56 __ta__("mm_player_audio_effect_ini_load",
57 result = mm_player_audio_effect_ini_load();
59 if(result != MM_ERROR_NONE)
62 /* alloc player structure */
63 new_player = g_malloc(sizeof(mm_player_t));
66 debug_critical("Cannot allocate memory for player\n");
69 memset(new_player, 0, sizeof(mm_player_t));
71 /* create player lock */
72 new_player->cmd_lock = g_mutex_new();
74 if ( ! new_player->cmd_lock )
76 debug_critical("failed to create player lock\n");
80 /* create msg callback lock */
81 new_player->msg_cb_lock = g_mutex_new();
83 if ( ! new_player->msg_cb_lock )
85 debug_critical("failed to create msg cb lock\n");
88 __ta__("[KPI] create media player service",
89 result = _mmplayer_create_player((MMHandleType)new_player);
92 if(result != MM_ERROR_NONE)
95 *player = (MMHandleType)new_player;
103 if (new_player->cmd_lock)
105 g_mutex_free(new_player->cmd_lock);
106 new_player->cmd_lock = NULL;
109 _mmplayer_destroy( (MMHandleType)new_player );
110 MMPLAYER_FREEIF( new_player );
113 *player = (MMHandleType)0;
114 return MM_ERROR_PLAYER_NO_FREE_SPACE; // are you sure?
117 int mm_player_destroy(MMHandleType player)
119 int result = MM_ERROR_NONE;
123 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
125 MMPLAYER_CMD_LOCK( player );
127 __ta__("[KPI] destroy media player service",
128 result = _mmplayer_destroy(player);
131 MMPLAYER_CMD_UNLOCK( player );
133 if (((mm_player_t*)player)->cmd_lock)
135 g_mutex_free(((mm_player_t*)player)->cmd_lock);
136 ((mm_player_t*)player)->cmd_lock = NULL;
139 memset( (mm_player_t*)player, 0x00, sizeof(mm_player_t) );
142 g_free( (void*)player );
144 MMTA_ACUM_ITEM_SHOW_RESULT_TO(MMTA_SHOW_FILE);
151 int mm_player_realize(MMHandleType player)
153 int result = MM_ERROR_NONE;
157 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
159 MMPLAYER_CMD_LOCK( player );
161 __ta__("[KPI] initialize media player service",
162 result = _mmplayer_realize(player);
165 MMPLAYER_CMD_UNLOCK( player );
170 int mm_player_unrealize(MMHandleType player)
172 int result = MM_ERROR_NONE;
176 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
178 MMPLAYER_CMD_LOCK( player );
180 __ta__("[KPI] cleanup media player service",
181 result = _mmplayer_unrealize(player);
184 MMPLAYER_CMD_UNLOCK( player );
189 int mm_player_set_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param)
191 int result = MM_ERROR_NONE;
195 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
197 MMPLAYER_CMD_LOCK( player );
199 result = _mmplayer_set_message_callback(player, callback, user_param);
201 MMPLAYER_CMD_UNLOCK( player );
206 int mm_player_set_pd_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param)
208 int result = MM_ERROR_NONE;
212 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
214 result = _mm_player_set_pd_downloader_message_cb(player, callback, user_param);
219 int mm_player_set_audio_stream_callback(MMHandleType player, mm_player_audio_stream_callback callback, void *user_param)
221 int result = MM_ERROR_NONE;
225 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
227 MMPLAYER_CMD_LOCK( player );
229 result = _mmplayer_set_audiostream_cb(player, callback, user_param);
231 MMPLAYER_CMD_UNLOCK( player );
236 int mm_player_set_audio_buffer_callback(MMHandleType player, mm_player_audio_stream_callback callback, void *user_param)
238 int result = MM_ERROR_NONE;
242 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
244 MMPLAYER_CMD_LOCK( player );
246 result = _mmplayer_set_audiobuffer_cb(player, callback, user_param);
248 MMPLAYER_CMD_UNLOCK( player );
253 int mm_player_set_video_stream_callback(MMHandleType player, mm_player_video_stream_callback callback, void *user_param)
255 int result = MM_ERROR_NONE;
259 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
261 MMPLAYER_CMD_LOCK( player );
263 result = _mmplayer_set_videostream_cb(player, callback, user_param);
265 MMPLAYER_CMD_UNLOCK( player );
270 int mm_player_set_video_frame_render_error_callback(MMHandleType player, mm_player_video_frame_render_error_callback callback, void *user_param)
272 int result = MM_ERROR_NONE;
276 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
278 MMPLAYER_CMD_LOCK( player );
280 result = _mmplayer_set_videoframe_render_error_cb(player, callback, user_param);
282 MMPLAYER_CMD_UNLOCK( player );
287 int mm_player_do_video_capture(MMHandleType player)
289 int result = MM_ERROR_NONE;
293 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
295 MMPLAYER_CMD_LOCK( player );
297 result = _mmplayer_do_video_capture(player);
299 MMPLAYER_CMD_UNLOCK( player );
304 int mm_player_set_buffer_need_data_callback(MMHandleType player, mm_player_buffer_need_data_callback callback, void * user_param)
306 int result = MM_ERROR_NONE;
310 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
312 MMPLAYER_CMD_LOCK( player );
314 result = _mmplayer_set_buffer_need_data_cb(player, callback, user_param);
316 MMPLAYER_CMD_UNLOCK( player );
321 int mm_player_set_buffer_enough_data_callback(MMHandleType player, mm_player_buffer_enough_data_callback callback, void * user_param)
323 int result = MM_ERROR_NONE;
327 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
329 MMPLAYER_CMD_LOCK( player );
331 result = _mmplayer_set_buffer_enough_data_cb(player, callback, user_param);
333 MMPLAYER_CMD_UNLOCK( player );
339 int mm_player_set_buffer_seek_data_callback(MMHandleType player, mm_player_buffer_seek_data_callback callback, void * user_param)
341 int result = MM_ERROR_NONE;
345 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
347 MMPLAYER_CMD_LOCK( player );
349 result = _mmplayer_set_buffer_seek_data_cb(player, callback, user_param);
351 MMPLAYER_CMD_UNLOCK( player );
356 int mm_player_set_volume(MMHandleType player, MMPlayerVolumeType *volume)
358 int result = MM_ERROR_NONE;
362 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
363 return_val_if_fail(volume, MM_ERROR_INVALID_ARGUMENT);
365 MMPLAYER_CMD_LOCK( player );
367 result = _mmplayer_set_volume(player, *volume);
369 MMPLAYER_CMD_UNLOCK( player );
374 int mm_player_get_volume(MMHandleType player, MMPlayerVolumeType *volume)
376 int result = MM_ERROR_NONE;
380 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
381 return_val_if_fail(volume, MM_ERROR_INVALID_ARGUMENT);
383 MMPLAYER_CMD_LOCK( player );
385 result = _mmplayer_get_volume(player, volume);
387 MMPLAYER_CMD_UNLOCK( player );
392 int mm_player_set_mute(MMHandleType player, int mute)
394 int result = MM_ERROR_NONE;
398 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
400 MMPLAYER_CMD_LOCK( player );
402 result = _mmplayer_set_mute(player, mute);
404 MMPLAYER_CMD_UNLOCK( player );
409 int mm_player_get_mute(MMHandleType player, int *mute)
411 int result = MM_ERROR_NONE;
415 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
416 return_val_if_fail(mute, MM_ERROR_INVALID_ARGUMENT);
418 MMPLAYER_CMD_LOCK( player );
420 result = _mmplayer_get_mute(player, mute);
422 MMPLAYER_CMD_UNLOCK( player );
427 int mm_player_get_state(MMHandleType player, MMPlayerStateType *state)
429 int result = MM_ERROR_NONE;
433 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
434 return_val_if_fail(state, MM_ERROR_COMMON_INVALID_ARGUMENT);
436 *state = MM_PLAYER_STATE_NULL;
438 result = _mmplayer_get_state(player, (int*)state);
443 /* NOTE : Not supported */
444 int mm_player_change_videosink(MMHandleType player, MMDisplaySurfaceType display_surface_type, void *display_overlay)
446 int result = MM_ERROR_NONE;
450 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
452 return MM_ERROR_NOT_SUPPORT_API;
455 int mm_player_push_buffer(MMHandleType player, unsigned char *buf, int size)
457 int result = MM_ERROR_NONE;
461 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
463 //MMPLAYER_CMD_LOCK( player );
465 //MMTA_ACUM_ITEM_BEGIN("[KPI] start media player service", false);
466 result = _mmplayer_push_buffer(player, buf, size);
468 //MMPLAYER_CMD_UNLOCK( player );
473 int mm_player_start(MMHandleType player)
475 int result = MM_ERROR_NONE;
479 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
481 MMPLAYER_CMD_LOCK( player );
483 MMTA_ACUM_ITEM_BEGIN("[KPI] start media player service", false);
484 result = _mmplayer_start(player);
486 MMPLAYER_CMD_UNLOCK( player );
491 int mm_player_stop(MMHandleType player)
493 int result = MM_ERROR_NONE;
497 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
499 MMPLAYER_CMD_LOCK( player );
501 __ta__("[KPI] stop media player service",
502 result = _mmplayer_stop(player);
505 MMPLAYER_CMD_UNLOCK( player );
510 int mm_player_pause(MMHandleType player)
512 int result = MM_ERROR_NONE;
516 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
518 MMPLAYER_CMD_LOCK( player );
520 __ta__("[KPI] pause media player service",
521 result = _mmplayer_pause(player);
524 MMPLAYER_CMD_UNLOCK( player );
529 int mm_player_resume(MMHandleType player)
531 int result = MM_ERROR_NONE;
535 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
537 MMPLAYER_CMD_LOCK( player );
539 __ta__("[KPI] resume media player service",
540 result = _mmplayer_resume(player);
543 MMPLAYER_CMD_UNLOCK( player );
548 int mm_player_activate_section_repeat(MMHandleType player, int start_pos, int end_pos)
550 int result = MM_ERROR_NONE;
552 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
554 MMPLAYER_CMD_LOCK( player );
556 result = _mmplayer_activate_section_repeat(player, start_pos, end_pos);
558 MMPLAYER_CMD_UNLOCK( player );
563 int mm_player_deactivate_section_repeat(MMHandleType player)
565 int result = MM_ERROR_NONE;
567 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
569 MMPLAYER_CMD_LOCK( player );
571 result = _mmplayer_deactivate_section_repeat(player);
573 MMPLAYER_CMD_UNLOCK( player );
578 int mm_player_set_play_speed(MMHandleType player, float rate)
580 int result = MM_ERROR_NONE;
582 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
584 MMPLAYER_CMD_LOCK( player );
586 result = _mmplayer_set_playspeed(player, rate);
588 MMPLAYER_CMD_UNLOCK( player );
593 int mm_player_set_position(MMHandleType player, MMPlayerPosFormatType format, int pos)
595 int result = MM_ERROR_NONE;
599 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
601 if (format >= MM_PLAYER_POS_FORMAT_NUM)
603 debug_error("wrong format\n");
604 return MM_ERROR_COMMON_INVALID_ARGUMENT;
607 MMPLAYER_CMD_LOCK( player );
609 result = _mmplayer_set_position(player, format, pos);
611 MMPLAYER_CMD_UNLOCK( player );
616 int mm_player_get_position(MMHandleType player, MMPlayerPosFormatType format, int *pos)
618 int result = MM_ERROR_NONE;
622 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
623 return_val_if_fail(pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
625 if (format >= MM_PLAYER_POS_FORMAT_NUM)
627 debug_error("wrong format\n");
628 return MM_ERROR_COMMON_INVALID_ARGUMENT;
631 MMPLAYER_CMD_LOCK( player );
633 result = _mmplayer_get_position(player, (int)format, (unsigned long*)pos);
635 MMPLAYER_CMD_UNLOCK( player );
640 int mm_player_get_buffer_position(MMHandleType player, MMPlayerPosFormatType format, int *start_pos, int *stop_pos)
642 int result = MM_ERROR_NONE;
646 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
647 return_val_if_fail(start_pos && stop_pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
649 MMPLAYER_CMD_LOCK( player );
651 result = _mmplayer_get_buffer_position(player, (int)format, (unsigned long*)start_pos, (unsigned long*)stop_pos );
653 MMPLAYER_CMD_UNLOCK( player );
658 int mm_player_adjust_subtitle_position(MMHandleType player, MMPlayerPosFormatType format, int pos)
660 int result = MM_ERROR_NONE;
664 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
666 if (format >= MM_PLAYER_POS_FORMAT_NUM)
668 debug_error("wrong format\n");
669 return MM_ERROR_COMMON_INVALID_ARGUMENT;
672 MMPLAYER_CMD_LOCK( player );
674 result = _mmplayer_adjust_subtitle_postion(player, format, pos);
676 MMPLAYER_CMD_UNLOCK( player );
681 int mm_player_set_subtitle_silent(MMHandleType player, int silent)
683 int result = MM_ERROR_NONE;
687 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
689 MMPLAYER_CMD_LOCK( player );
691 result = _mmplayer_set_subtitle_silent(player, silent);
693 MMPLAYER_CMD_UNLOCK( player );
698 int mm_player_get_subtitle_silent(MMHandleType player, int* silent)
700 int result = MM_ERROR_NONE;
704 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
706 MMPLAYER_CMD_LOCK( player );
708 result = _mmplayer_get_subtitle_silent(player, silent);
710 MMPLAYER_CMD_UNLOCK( player );
715 int mm_player_set_attribute(MMHandleType player, char **err_attr_name, const char *first_attribute_name, ...)
717 int result = MM_ERROR_NONE;
722 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
723 return_val_if_fail(first_attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
725 va_start (var_args, first_attribute_name);
726 result = _mmplayer_set_attribute(player, err_attr_name, first_attribute_name, var_args);
732 int mm_player_get_attribute(MMHandleType player, char **err_attr_name, const char *first_attribute_name, ...)
734 int result = MM_ERROR_NONE;
739 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
740 return_val_if_fail(first_attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
742 va_start (var_args, first_attribute_name);
743 result = _mmplayer_get_attribute(player, err_attr_name, first_attribute_name, var_args);
749 int mm_player_get_attribute_info(MMHandleType player, const char *attribute_name, MMPlayerAttrsInfo *info)
751 int result = MM_ERROR_NONE;
754 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
755 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
756 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
758 result = _mmplayer_get_attributes_info((MMHandleType)player, attribute_name, info);
763 int mm_player_get_pd_status(MMHandleType player, guint64 *current_pos, guint64 *total_size)
765 int result = MM_ERROR_NONE;
769 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
770 return_val_if_fail(current_pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
771 return_val_if_fail(total_size, MM_ERROR_COMMON_INVALID_ARGUMENT);
773 result = _mmplayer_get_pd_downloader_status(player, current_pos, total_size);
778 int mm_player_get_track_count(MMHandleType player, MMPlayerTrackType track_type, int *count)
780 int result = MM_ERROR_NONE;
784 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
785 return_val_if_fail(count, MM_ERROR_COMMON_INVALID_ARGUMENT);
787 result = _mmplayer_get_track_count(player, track_type, count);
793 int mm_player_ignore_session(MMHandleType player)
795 int result = MM_ERROR_NONE;
799 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
801 result = _mmplayer_asm_ignore_session(player);