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);
152 int mm_player_realize(MMHandleType player)
154 int result = MM_ERROR_NONE;
158 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
160 MMPLAYER_CMD_LOCK( player );
162 __ta__("[KPI] initialize media player service",
163 result = _mmplayer_realize(player);
166 MMPLAYER_CMD_UNLOCK( player );
172 int mm_player_unrealize(MMHandleType player)
174 int result = MM_ERROR_NONE;
178 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
180 MMPLAYER_CMD_LOCK( player );
182 __ta__("[KPI] cleanup media player service",
183 result = _mmplayer_unrealize(player);
186 MMPLAYER_CMD_UNLOCK( player );
192 int mm_player_set_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param)
194 int result = MM_ERROR_NONE;
198 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
200 MMPLAYER_CMD_LOCK( player );
202 result = _mmplayer_set_message_callback(player, callback, user_param);
204 MMPLAYER_CMD_UNLOCK( player );
209 int mm_player_set_pd_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param)
211 int result = MM_ERROR_NONE;
215 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
217 result = _mm_player_set_pd_downloader_message_cb(player, callback, user_param);
222 int mm_player_set_audio_stream_callback(MMHandleType player, mm_player_audio_stream_callback callback, void *user_param)
224 int result = MM_ERROR_NONE;
228 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
230 MMPLAYER_CMD_LOCK( player );
232 result = _mmplayer_set_audiostream_cb(player, callback, user_param);
234 MMPLAYER_CMD_UNLOCK( player );
240 int mm_player_set_audio_buffer_callback(MMHandleType player, mm_player_audio_stream_callback callback, void *user_param)
242 int result = MM_ERROR_NONE;
246 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
248 MMPLAYER_CMD_LOCK( player );
250 result = _mmplayer_set_audiobuffer_cb(player, callback, user_param);
252 MMPLAYER_CMD_UNLOCK( player );
257 int mm_player_set_video_stream_callback(MMHandleType player, mm_player_video_stream_callback callback, void *user_param)
259 int result = MM_ERROR_NONE;
263 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
265 MMPLAYER_CMD_LOCK( player );
267 result = _mmplayer_set_videostream_cb(player, callback, user_param);
269 MMPLAYER_CMD_UNLOCK( player );
274 int mm_player_do_video_capture(MMHandleType player)
276 int result = MM_ERROR_NONE;
280 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
282 MMPLAYER_CMD_LOCK( player );
284 result = _mmplayer_do_video_capture(player);
286 MMPLAYER_CMD_UNLOCK( player );
291 int mm_player_set_buffer_need_data_callback(MMHandleType player, mm_player_buffer_need_data_callback callback, void * user_param)
293 int result = MM_ERROR_NONE;
297 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
299 MMPLAYER_CMD_LOCK( player );
301 result = _mmplayer_set_buffer_need_data_cb(player, callback, user_param);
303 MMPLAYER_CMD_UNLOCK( player );
309 int mm_player_set_buffer_enough_data_callback(MMHandleType player, mm_player_buffer_enough_data_callback callback, void * user_param)
311 int result = MM_ERROR_NONE;
315 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
317 MMPLAYER_CMD_LOCK( player );
319 result = _mmplayer_set_buffer_enough_data_cb(player, callback, user_param);
321 MMPLAYER_CMD_UNLOCK( player );
327 int mm_player_set_buffer_seek_data_callback(MMHandleType player, mm_player_buffer_seek_data_callback callback, void * user_param)
329 int result = MM_ERROR_NONE;
333 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
335 MMPLAYER_CMD_LOCK( player );
337 result = _mmplayer_set_buffer_seek_data_cb(player, callback, user_param);
339 MMPLAYER_CMD_UNLOCK( player );
345 int mm_player_set_volume(MMHandleType player, MMPlayerVolumeType *volume)
347 int result = MM_ERROR_NONE;
351 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
352 return_val_if_fail(volume, MM_ERROR_INVALID_ARGUMENT);
354 MMPLAYER_CMD_LOCK( player );
356 result = _mmplayer_set_volume(player, *volume);
358 MMPLAYER_CMD_UNLOCK( player );
364 int mm_player_get_volume(MMHandleType player, MMPlayerVolumeType *volume)
366 int result = MM_ERROR_NONE;
370 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
371 return_val_if_fail(volume, MM_ERROR_INVALID_ARGUMENT);
373 MMPLAYER_CMD_LOCK( player );
375 result = _mmplayer_get_volume(player, volume);
377 MMPLAYER_CMD_UNLOCK( player );
383 int mm_player_set_mute(MMHandleType player, int mute)
385 int result = MM_ERROR_NONE;
389 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
391 MMPLAYER_CMD_LOCK( player );
393 result = _mmplayer_set_mute(player, mute);
395 MMPLAYER_CMD_UNLOCK( player );
401 int mm_player_get_mute(MMHandleType player, int *mute)
403 int result = MM_ERROR_NONE;
407 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
408 return_val_if_fail(mute, MM_ERROR_INVALID_ARGUMENT);
410 MMPLAYER_CMD_LOCK( player );
412 result = _mmplayer_get_mute(player, mute);
414 MMPLAYER_CMD_UNLOCK( player );
420 int mm_player_get_state(MMHandleType player, MMPlayerStateType *state)
422 int result = MM_ERROR_NONE;
426 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
427 return_val_if_fail(state, MM_ERROR_COMMON_INVALID_ARGUMENT);
429 *state = MM_PLAYER_STATE_NULL;
431 result = _mmplayer_get_state(player, (int*)state);
436 /* NOTE : Not supported */
437 int mm_player_change_videosink(MMHandleType player, MMDisplaySurfaceType display_surface_type, void *display_overlay)
439 int result = MM_ERROR_NONE;
443 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
445 return MM_ERROR_NOT_SUPPORT_API;
448 int mm_player_push_buffer(MMHandleType player, unsigned char *buf, int size)
450 int result = MM_ERROR_NONE;
454 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
456 //MMPLAYER_CMD_LOCK( player );
458 //MMTA_ACUM_ITEM_BEGIN("[KPI] start media player service", false);
459 result = _mmplayer_push_buffer(player, buf, size);
461 //MMPLAYER_CMD_UNLOCK( player );
467 int mm_player_start(MMHandleType player)
469 int result = MM_ERROR_NONE;
473 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
475 MMPLAYER_CMD_LOCK( player );
477 MMTA_ACUM_ITEM_BEGIN("[KPI] start media player service", false);
478 result = _mmplayer_start(player);
480 MMPLAYER_CMD_UNLOCK( player );
486 int mm_player_stop(MMHandleType player)
488 int result = MM_ERROR_NONE;
492 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
494 MMPLAYER_CMD_LOCK( player );
496 __ta__("[KPI] stop media player service",
497 result = _mmplayer_stop(player);
500 MMPLAYER_CMD_UNLOCK( player );
506 int mm_player_pause(MMHandleType player)
508 int result = MM_ERROR_NONE;
512 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
514 MMPLAYER_CMD_LOCK( player );
516 __ta__("[KPI] pause media player service",
517 result = _mmplayer_pause(player);
520 MMPLAYER_CMD_UNLOCK( player );
526 int mm_player_resume(MMHandleType player)
528 int result = MM_ERROR_NONE;
532 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
534 MMPLAYER_CMD_LOCK( player );
536 __ta__("[KPI] resume media player service",
537 result = _mmplayer_resume(player);
540 MMPLAYER_CMD_UNLOCK( player );
546 int mm_player_activate_section_repeat(MMHandleType player, int start_pos, int end_pos)
548 int result = MM_ERROR_NONE;
550 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
552 MMPLAYER_CMD_LOCK( player );
554 result = _mmplayer_activate_section_repeat(player, start_pos, end_pos);
556 MMPLAYER_CMD_UNLOCK( player );
562 int mm_player_deactivate_section_repeat(MMHandleType player)
564 int result = MM_ERROR_NONE;
566 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
568 MMPLAYER_CMD_LOCK( player );
570 result = _mmplayer_deactivate_section_repeat(player);
572 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 );
594 int mm_player_set_position(MMHandleType player, MMPlayerPosFormatType format, int pos)
596 int result = MM_ERROR_NONE;
600 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
602 if (format >= MM_PLAYER_POS_FORMAT_NUM)
604 debug_error("wrong format\n");
605 return MM_ERROR_COMMON_INVALID_ARGUMENT;
608 MMPLAYER_CMD_LOCK( player );
610 result = _mmplayer_set_position(player, format, pos);
612 MMPLAYER_CMD_UNLOCK( player );
618 int mm_player_get_position(MMHandleType player, MMPlayerPosFormatType format, int *pos)
620 int result = MM_ERROR_NONE;
624 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
625 return_val_if_fail(pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
627 if (format >= MM_PLAYER_POS_FORMAT_NUM)
629 debug_error("wrong format\n");
630 return MM_ERROR_COMMON_INVALID_ARGUMENT;
633 MMPLAYER_CMD_LOCK( player );
635 result = _mmplayer_get_position(player, (int)format, (unsigned long*)pos);
637 MMPLAYER_CMD_UNLOCK( player );
642 int mm_player_get_buffer_position(MMHandleType player, MMPlayerPosFormatType format, int *start_pos, int *stop_pos)
644 int result = MM_ERROR_NONE;
648 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
649 return_val_if_fail(start_pos && stop_pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
651 MMPLAYER_CMD_LOCK( player );
653 result = _mmplayer_get_buffer_position(player, (int)format, (unsigned long*)start_pos, (unsigned long*)stop_pos );
655 MMPLAYER_CMD_UNLOCK( player );
660 int mm_player_adjust_subtitle_position(MMHandleType player, MMPlayerPosFormatType format, int pos)
662 int result = MM_ERROR_NONE;
666 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
668 if (format >= MM_PLAYER_POS_FORMAT_NUM)
670 debug_error("wrong format\n");
671 return MM_ERROR_COMMON_INVALID_ARGUMENT;
674 MMPLAYER_CMD_LOCK( player );
676 result = _mmplayer_adjust_subtitle_postion(player, format, pos);
678 MMPLAYER_CMD_UNLOCK( player );
684 int mm_player_set_subtitle_silent(MMHandleType player, int silent)
686 int result = MM_ERROR_NONE;
690 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
692 MMPLAYER_CMD_LOCK( player );
694 result = _mmplayer_set_subtitle_silent(player, silent);
696 MMPLAYER_CMD_UNLOCK( player );
702 int mm_player_get_subtitle_silent(MMHandleType player, int* silent)
704 int result = MM_ERROR_NONE;
708 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
710 MMPLAYER_CMD_LOCK( player );
712 result = _mmplayer_get_subtitle_silent(player, silent);
714 MMPLAYER_CMD_UNLOCK( player );
720 int mm_player_set_attribute(MMHandleType player, char **err_attr_name, const char *first_attribute_name, ...)
722 int result = MM_ERROR_NONE;
727 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
728 return_val_if_fail(first_attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
730 va_start (var_args, first_attribute_name);
731 result = _mmplayer_set_attribute(player, err_attr_name, first_attribute_name, var_args);
738 int mm_player_get_attribute(MMHandleType player, char **err_attr_name, const char *first_attribute_name, ...)
740 int result = MM_ERROR_NONE;
745 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
746 return_val_if_fail(first_attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
748 va_start (var_args, first_attribute_name);
749 result = _mmplayer_get_attribute(player, err_attr_name, first_attribute_name, var_args);
756 int mm_player_get_attribute_info(MMHandleType player, const char *attribute_name, MMPlayerAttrsInfo *info)
758 int result = MM_ERROR_NONE;
761 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
762 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
763 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
765 result = _mmplayer_get_attributes_info((MMHandleType)player, attribute_name, info);
770 int mm_player_get_pd_status(MMHandleType player, guint64 *current_pos, guint64 *total_size)
772 int result = MM_ERROR_NONE;
776 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
777 return_val_if_fail(current_pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
778 return_val_if_fail(total_size, MM_ERROR_COMMON_INVALID_ARGUMENT);
780 result = _mmplayer_get_pd_downloader_status(player, current_pos, total_size);
785 int mm_player_get_track_count(MMHandleType player, MMPlayerTrackType track_type, int *count)
787 int result = MM_ERROR_NONE;
791 return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
792 return_val_if_fail(count, MM_ERROR_COMMON_INVALID_ARGUMENT);
794 result = _mmplayer_get_track_count(player, track_type, count);