X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_camcorder_internal.c;h=519f09c568c573186919f45ffb6fdb044d5fcc35;hb=905604f407a091a83adb66404fa0b6b67fec1783;hp=c858ff064d55ed0d5360b13cfc89495432b900ec;hpb=ec7555fe909252119c19620bb0f6650b10e1b63f;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index c858ff0..519f09c 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -47,7 +47,6 @@ /*--------------------------------------------------------------------------------------- | GLOBAL VARIABLE DEFINITIONS for internal | ---------------------------------------------------------------------------------------*/ -int g_mm_camcorder_type = -255; struct sigaction mm_camcorder_int_old_action; struct sigaction mm_camcorder_abrt_old_action; struct sigaction mm_camcorder_segv_old_action; @@ -58,10 +57,11 @@ struct sigaction mm_camcorder_sys_old_action; | LOCAL VARIABLE DEFINITIONS for internal | ---------------------------------------------------------------------------------------*/ #define __MMCAMCORDER_CMD_ITERATE_MAX 3 -#define __MMCAMCORDER_SET_GST_STATE_TIMEOUT 3 +#define __MMCAMCORDER_SET_GST_STATE_TIMEOUT 5 #define __MMCAMCORDER_FORCE_STOP_TRY_COUNT 30 #define __MMCAMCORDER_FORCE_STOP_WAIT_TIME 100000 /* us */ #define __MMCAMCORDER_SOUND_WAIT_TIMEOUT 3 +#define __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN 64 /*--------------------------------------------------------------------------------------- @@ -96,42 +96,8 @@ static void _mmcamcorder_constructor() __attribute__((constructor)); static void __mm_camcorder_signal_handler(int signo) { pid_t my_pid = getpid(); - pid_t vconf_recorder_pid = -1; - pid_t vconf_camera_pid = -1; - int vconf_flash_state = VCONFKEY_CAMERA_FLASH_STATE_OFF; - - _mmcam_dbg_warn("start - signo [%d], pid [%d], device type [%d]", signo, my_pid, g_mm_camcorder_type); - - /* reset vconf key */ - switch (g_mm_camcorder_type) { - case MM_VIDEO_DEVICE_NONE: - vconf_get_int(VCONFKEY_RECORDER_PID, (int *)&vconf_recorder_pid); - if (my_pid == vconf_recorder_pid) { - vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_NULL); - vconf_set_int(VCONFKEY_RECORDER_PID, -1); - _mmcam_dbg_warn("set recorder state NULL"); - } else { - _mmcam_dbg_warn("different pid : my[%d] vconf[%d]", my_pid, vconf_recorder_pid); - } - break; - case MM_VIDEO_DEVICE_CAMERA0: - case MM_VIDEO_DEVICE_CAMERA1: - vconf_get_int(VCONFKEY_CAMERA_FLASH_STATE, &vconf_flash_state); - vconf_get_int(VCONFKEY_CAMERA_PID, (int *)&vconf_camera_pid); - if (my_pid == vconf_camera_pid && - vconf_flash_state == VCONFKEY_CAMERA_FLASH_STATE_ON) { - vconf_set_int(VCONFKEY_CAMERA_FLASH_STATE, VCONFKEY_CAMERA_FLASH_STATE_OFF); - vconf_set_int(VCONFKEY_CAMERA_PID, -1); - _mmcam_dbg_warn("set camera flash state OFF"); - } - - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_NULL); - _mmcam_dbg_warn("set camera state NULL"); - break; - default: - _mmcam_dbg_warn("unknown type [%d]", g_mm_camcorder_type); - break; - } + + _mmcam_dbg_warn("start - signo [%d], pid [%d]", signo, my_pid); /* call old signal handler */ switch (signo) { @@ -222,33 +188,39 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) hcamcorder->capture_in_recording = FALSE; hcamcorder->session_type = MM_SESSION_TYPE_MEDIA; - pthread_mutex_init(&((hcamcorder->mtsafe).lock), NULL); - pthread_cond_init(&((hcamcorder->mtsafe).cond), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).cmd_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).asm_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).state_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).gst_state_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).gst_encode_state_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).message_cb_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).vcapture_cb_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).vstream_cb_lock), NULL); - pthread_mutex_init(&((hcamcorder->mtsafe).astream_cb_lock), NULL); - - pthread_mutex_init(&(hcamcorder->sound_lock), NULL); - pthread_cond_init(&(hcamcorder->sound_cond), NULL); - pthread_mutex_init(&(hcamcorder->restart_preview_lock), NULL); + g_mutex_init(&(hcamcorder->mtsafe).lock); + g_cond_init(&(hcamcorder->mtsafe).cond); + g_mutex_init(&(hcamcorder->mtsafe).cmd_lock); + g_mutex_init(&(hcamcorder->mtsafe).asm_lock); + g_mutex_init(&(hcamcorder->mtsafe).state_lock); + g_mutex_init(&(hcamcorder->mtsafe).gst_state_lock); + g_mutex_init(&(hcamcorder->mtsafe).gst_encode_state_lock); + g_mutex_init(&(hcamcorder->mtsafe).message_cb_lock); + g_mutex_init(&(hcamcorder->mtsafe).vcapture_cb_lock); + g_mutex_init(&(hcamcorder->mtsafe).vstream_cb_lock); + g_mutex_init(&(hcamcorder->mtsafe).astream_cb_lock); + + g_mutex_init(&hcamcorder->restart_preview_lock); /* Sound mutex/cond init */ - pthread_mutex_init(&(hcamcorder->snd_info.open_mutex), NULL); - pthread_cond_init(&(hcamcorder->snd_info.open_cond), NULL); + g_mutex_init(&hcamcorder->snd_info.open_mutex); + g_cond_init(&hcamcorder->snd_info.open_cond); + g_mutex_init(&hcamcorder->snd_info.play_mutex); + g_cond_init(&hcamcorder->snd_info.play_cond); /* init for sound thread */ - pthread_mutex_init(&(hcamcorder->task_thread_lock), NULL); - pthread_cond_init(&(hcamcorder->task_thread_cond), NULL); + g_mutex_init(&hcamcorder->task_thread_lock); + g_cond_init(&hcamcorder->task_thread_cond); hcamcorder->task_thread_state = _MMCAMCORDER_SOUND_STATE_NONE; /* create task thread */ - pthread_create(&(hcamcorder->task_thread), NULL, _mmcamcorder_util_task_thread_func, (void *)hcamcorder); + hcamcorder->task_thread = g_thread_try_new("MMCAM_TASK_THREAD", + (GThreadFunc)_mmcamcorder_util_task_thread_func, (gpointer)hcamcorder, NULL); + if (hcamcorder->task_thread == NULL) { + _mmcam_dbg_err("_mmcamcorder_create::failed to create task thread"); + ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION; + goto _ERR_DEFAULT_VALUE_INIT; + } if (info->videodev_type < MM_VIDEO_DEVICE_NONE || info->videodev_type >= MM_VIDEO_DEVICE_NUM) { @@ -355,7 +327,7 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) goto _ERR_DEFAULT_VALUE_INIT; } - ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_CAMERA|MM_CAMCONVERT_CATEGORY_DISPLAY); + ret = _mmcamcorder_init_attr_from_configure((MMHandleType)hcamcorder, MM_CAMCONVERT_CATEGORY_ALL); if (ret != MM_ERROR_NONE) { _mmcam_dbg_warn("converting table initialize error!!"); ret = MM_ERROR_CAMCORDER_INTERNAL; @@ -455,8 +427,7 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) NULL); if (err_attr_name) { _mmcam_dbg_err("Set %s FAILED.", err_attr_name); - free(err_attr_name); - err_attr_name = NULL; + SAFE_FREE(err_attr_name); ret = MM_ERROR_CAMCORDER_INTERNAL; goto _ERR_DEFAULT_VALUE_INIT; } @@ -467,8 +438,7 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) NULL); if (err_attr_name) { _mmcam_dbg_err("Get brightness FAILED."); - free(err_attr_name); - err_attr_name = NULL; + SAFE_FREE(err_attr_name); ret = MM_ERROR_CAMCORDER_INTERNAL; goto _ERR_DEFAULT_VALUE_INIT; } @@ -487,8 +457,7 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) NULL); if (err_attr_name) { _mmcam_dbg_err("Set %s FAILED.", err_attr_name); - free(err_attr_name); - err_attr_name = NULL; + SAFE_FREE(err_attr_name); ret = MM_ERROR_CAMCORDER_INTERNAL; goto _ERR_DEFAULT_VALUE_INIT; } @@ -501,16 +470,20 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) } } - /* initialize resource manager */ ret = _mmcamcorder_resource_manager_init(&hcamcorder->resource_manager, (void *)hcamcorder); if (ret != MM_ERROR_NONE) { _mmcam_dbg_err("failed to initialize resource manager"); ret = MM_ERROR_CAMCORDER_INTERNAL; - goto _ERR_DEFAULT_VALUE_INIT; - } + goto _ERR_DEFAULT_VALUE_INIT; + } + + traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:CREATE:INIT_GSTREAMER"); ret = __mmcamcorder_gstreamer_init(hcamcorder->conf_main); + + traceEnd(TTRACE_TAG_CAMERA); + if (!ret) { _mmcam_dbg_err( "Failed to initialize gstreamer!!" ); ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED; @@ -568,9 +541,6 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info) _mmcam_dbg_log("created handle %p", hcamcorder); - /* set device type */ - g_mm_camcorder_type = info->videodev_type; - *handle = (MMHandleType)hcamcorder; return MM_ERROR_NONE; @@ -595,23 +565,21 @@ _ERR_DEFAULT_VALUE_INIT: } /* Release lock, cond */ - pthread_mutex_destroy(&((hcamcorder->mtsafe).lock)); - pthread_cond_destroy(&((hcamcorder->mtsafe).cond)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).cmd_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).asm_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).state_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).gst_state_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).gst_encode_state_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).message_cb_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).vcapture_cb_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).vstream_cb_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).astream_cb_lock)); - - pthread_mutex_destroy(&(hcamcorder->sound_lock)); - pthread_cond_destroy(&(hcamcorder->sound_cond)); - pthread_mutex_destroy(&(hcamcorder->snd_info.open_mutex)); - pthread_cond_destroy(&(hcamcorder->snd_info.open_cond)); - pthread_mutex_destroy(&(hcamcorder->restart_preview_lock)); + g_mutex_clear(&(hcamcorder->mtsafe).lock); + g_cond_clear(&(hcamcorder->mtsafe).cond); + g_mutex_clear(&(hcamcorder->mtsafe).cmd_lock); + g_mutex_clear(&(hcamcorder->mtsafe).asm_lock); + g_mutex_clear(&(hcamcorder->mtsafe).state_lock); + g_mutex_clear(&(hcamcorder->mtsafe).gst_state_lock); + g_mutex_clear(&(hcamcorder->mtsafe).gst_encode_state_lock); + g_mutex_clear(&(hcamcorder->mtsafe).message_cb_lock); + g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock); + g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock); + g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock); + + g_mutex_clear(&hcamcorder->snd_info.open_mutex); + g_cond_clear(&hcamcorder->snd_info.open_cond); + g_mutex_clear(&hcamcorder->restart_preview_lock); if (hcamcorder->conf_ctrl) { _mmcamcorder_conf_release_info(handle, &hcamcorder->conf_ctrl); @@ -632,15 +600,16 @@ _ERR_DEFAULT_VALUE_INIT: } if (hcamcorder->task_thread) { - pthread_mutex_lock(&(hcamcorder->task_thread_lock)); + g_mutex_lock(&hcamcorder->task_thread_lock); _mmcam_dbg_log("send signal for task thread exit"); hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_EXIT; - pthread_cond_signal(&(hcamcorder->task_thread_cond)); - pthread_mutex_unlock(&(hcamcorder->task_thread_lock)); - pthread_join(hcamcorder->task_thread, NULL); + g_cond_signal(&hcamcorder->task_thread_cond); + g_mutex_unlock(&hcamcorder->task_thread_lock); + g_thread_join(hcamcorder->task_thread); + hcamcorder->task_thread = NULL; } - pthread_mutex_destroy(&(hcamcorder->task_thread_lock)); - pthread_cond_destroy(&(hcamcorder->task_thread_cond)); + g_mutex_clear(&hcamcorder->task_thread_lock); + g_cond_clear(&hcamcorder->task_thread_cond); /* Release handle */ memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t)); @@ -680,33 +649,14 @@ int _mmcamcorder_destroy(MMHandleType handle) } /* set exit state for sound thread */ - pthread_mutex_lock(&(hcamcorder->task_thread_lock)); + g_mutex_lock(&hcamcorder->task_thread_lock); _mmcam_dbg_log("send signal for task thread exit"); hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_EXIT; - pthread_cond_signal(&(hcamcorder->task_thread_cond)); - pthread_mutex_unlock(&(hcamcorder->task_thread_lock)); + g_cond_signal(&hcamcorder->task_thread_cond); + g_mutex_unlock(&hcamcorder->task_thread_lock); - pthread_mutex_lock(&(hcamcorder->sound_lock)); - while (hcamcorder->capture_sound_count > 0) { - struct timespec timeout; - struct timeval tv; - - gettimeofday(&tv, NULL); - timeout.tv_sec = tv.tv_sec + __MMCAMCORDER_SOUND_WAIT_TIMEOUT; - timeout.tv_nsec = tv.tv_usec * 1000; - - _mmcam_dbg_warn("capture_sound_count[%d] is not zero. wait signal...", - hcamcorder->capture_sound_count); - - if (!pthread_cond_timedwait(&(hcamcorder->sound_cond), &(hcamcorder->sound_lock), &timeout)) { - _mmcam_dbg_warn("signal received. check again..."); - } else { - hcamcorder->capture_sound_count = 0; - _mmcam_dbg_err("capture sound completion wait time out"); - break; - } - } - pthread_mutex_unlock(&(hcamcorder->sound_lock)); + /* wait for completion of sound play */ + _mmcamcorder_sound_solo_play_wait(handle); /* Release SubContext and pipeline */ if (hcamcorder->sub_context) { @@ -720,9 +670,9 @@ int _mmcamcorder_destroy(MMHandleType handle) /* de-initialize resource manager */ ret = _mmcamcorder_resource_manager_deinit(&hcamcorder->resource_manager); - if (!ret) { - _mmcam_dbg_err("failed to de-initialize resource manager"); - } + if (ret != MM_ERROR_NONE) { + _mmcam_dbg_err("failed to de-initialize resource manager 0x%x", ret); + } /* Remove idle function which is not called yet */ if (hcamcorder->setting_event_id) { @@ -731,29 +681,6 @@ int _mmcamcorder_destroy(MMHandleType handle) hcamcorder->setting_event_id = 0; } - /* check current strobe mode */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - pid_t my_pid = getpid(); - int camera_pid = -1; - vconf_get_int(VCONFKEY_CAMERA_PID, &camera_pid); - - if (camera_pid > -1 && my_pid == camera_pid) { - int strobe_mode = MM_CAMCORDER_STROBE_MODE_OFF; - - vconf_set_int(VCONFKEY_CAMERA_PID, -1); - _mmcam_dbg_log("reset camera pid"); - - mm_camcorder_get_attributes(handle, NULL, - MMCAM_STROBE_MODE, &strobe_mode, - NULL); - if (strobe_mode != MM_CAMCORDER_STROBE_MODE_OFF) { - /* set OFF state of vconf key */ - vconf_set_int(VCONFKEY_CAMERA_FLASH_STATE, VCONFKEY_CAMERA_FLASH_STATE_OFF); - _mmcam_dbg_log("reset flash state"); - } - } - } - /* Remove attributes */ if (hcamcorder->attributes) { _mmcamcorder_dealloc_attribute(handle, hcamcorder->attributes); @@ -805,30 +732,29 @@ int _mmcamcorder_destroy(MMHandleType handle) /* join task thread */ _mmcam_dbg_log("task thread join"); - pthread_join(hcamcorder->task_thread, NULL); + g_thread_join(hcamcorder->task_thread); + hcamcorder->task_thread = NULL; _MMCAMCORDER_UNLOCK_CMD(hcamcorder); /* Release lock, cond */ - pthread_mutex_destroy(&((hcamcorder->mtsafe).lock)); - pthread_cond_destroy(&((hcamcorder->mtsafe).cond)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).cmd_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).asm_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).state_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).gst_state_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).gst_encode_state_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).message_cb_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).vcapture_cb_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).vstream_cb_lock)); - pthread_mutex_destroy(&((hcamcorder->mtsafe).astream_cb_lock)); - - pthread_mutex_destroy(&(hcamcorder->sound_lock)); - pthread_cond_destroy(&(hcamcorder->sound_cond)); - pthread_mutex_destroy(&(hcamcorder->snd_info.open_mutex)); - pthread_cond_destroy(&(hcamcorder->snd_info.open_cond)); - pthread_mutex_destroy(&(hcamcorder->restart_preview_lock)); - pthread_mutex_destroy(&(hcamcorder->task_thread_lock)); - pthread_cond_destroy(&(hcamcorder->task_thread_cond)); + g_mutex_clear(&(hcamcorder->mtsafe).lock); + g_cond_clear(&(hcamcorder->mtsafe).cond); + g_mutex_clear(&(hcamcorder->mtsafe).cmd_lock); + g_mutex_clear(&(hcamcorder->mtsafe).asm_lock); + g_mutex_clear(&(hcamcorder->mtsafe).state_lock); + g_mutex_clear(&(hcamcorder->mtsafe).gst_state_lock); + g_mutex_clear(&(hcamcorder->mtsafe).gst_encode_state_lock); + g_mutex_clear(&(hcamcorder->mtsafe).message_cb_lock); + g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock); + g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock); + g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock); + + g_mutex_clear(&hcamcorder->snd_info.open_mutex); + g_cond_clear(&hcamcorder->snd_info.open_cond); + g_mutex_clear(&hcamcorder->restart_preview_lock); + g_mutex_clear(&hcamcorder->task_thread_lock); + g_cond_clear(&hcamcorder->task_thread_cond); /* Release handle */ memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t)); @@ -858,7 +784,7 @@ int _mmcamcorder_realize(MMHandleType handle) int state = MM_CAMCORDER_STATE_NONE; int state_FROM = MM_CAMCORDER_STATE_NULL; int state_TO = MM_CAMCORDER_STATE_READY; - int display_surface_type = MM_DISPLAY_SURFACE_X; + int display_surface_type = MM_DISPLAY_SURFACE_OVERLAY; int pid_for_sound_focus = 0; double motion_rate = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE; char *videosink_element_type = NULL; @@ -897,42 +823,9 @@ int _mmcamcorder_realize(MMHandleType handle) _mmcam_dbg_log("Profile mode [%d]", hcamcorder->type); mm_camcorder_get_attributes(handle, NULL, - MMCAM_DISPLAY_SURFACE, &display_surface_type, - MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate, - MMCAM_DISPLAY_SHM_SOCKET_PATH, &socket_path, &socket_path_len, - NULL); - - /* set camera/recorder state to vconf key */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* get current camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - if (vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_OPEN)) { - _mmcam_dbg_log("VCONF ERROR %s : cur %d",strerror(errno),errno); - if(errno == EPERM || errno == EACCES) { - ret = MM_ERROR_COMMON_INVALID_PERMISSION; - goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK; - } - } - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_OPEN); - } else { - int vconf_recorder_state = 0; - - /* get current recorder state of vconf key */ - vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state); - if (vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_CREATED)) { - _mmcam_dbg_log("VCONF ERROR %s : cur %d",strerror(errno),errno); - if (errno == EPERM || errno == EACCES) { - ret = MM_ERROR_COMMON_INVALID_PERMISSION; - goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK; - } - } - - _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d", - vconf_recorder_state, VCONFKEY_RECORDER_STATE_CREATED); - } + MMCAM_DISPLAY_SURFACE, &display_surface_type, + MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate, + NULL); /* sound focus */ if (hcamcorder->sound_focus_register) { @@ -1019,8 +912,8 @@ int _mmcamcorder_realize(MMHandleType handle) } switch (display_surface_type) { - case MM_DISPLAY_SURFACE_X: - videosink_element_type = strdup("VideosinkElementX"); + case MM_DISPLAY_SURFACE_OVERLAY: + videosink_element_type = strdup("VideosinkElementOverlay"); break; case MM_DISPLAY_SURFACE_EVAS: videosink_element_type = strdup("VideosinkElementEvas"); @@ -1032,18 +925,20 @@ int _mmcamcorder_realize(MMHandleType handle) videosink_element_type = strdup("VideosinkElementNull"); break; case MM_DISPLAY_SURFACE_REMOTE: - videosink_element_type = strdup("VideosinkElementRemote"); + mm_camcorder_get_attributes(handle, NULL, + MMCAM_DISPLAY_SOCKET_PATH, &socket_path, &socket_path_len, + NULL); + if (socket_path == NULL) { + _mmcam_dbg_warn("REMOTE surface, but socket path is NULL -> to NullSink"); + videosink_element_type = strdup("VideosinkElementNull"); + } else + videosink_element_type = strdup("VideosinkElementRemote"); break; default: - videosink_element_type = strdup("VideosinkElementX"); + videosink_element_type = strdup("VideosinkElementOverlay"); break; } - if (socket_path == NULL) { - _mmcam_dbg_warn("Socket Path is not properly set, -> to NullSink."); - videosink_element_type = strdup("VideosinkElementNull"); - } - /* check string of videosink element */ if (videosink_element_type) { _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main, @@ -1089,7 +984,7 @@ int _mmcamcorder_realize(MMHandleType handle) mm_camcorder_get_attributes(handle, NULL, MMCAM_DISPLAY_SURFACE, &display_surface_type, NULL); - if(display_surface_type == MM_DISPLAY_SURFACE_X) { + if(display_surface_type == MM_DISPLAY_SURFACE_OVERLAY) { if((_mmcamcorder_resource_manager_prepare(&hcamcorder->resource_manager, RESOURCE_TYPE_VIDEO_OVERLAY))) { _mmcam_dbg_err("could not prepare for video overlay resource"); ret = MM_ERROR_CAMCORDER_INTERNAL; @@ -1105,7 +1000,12 @@ int _mmcamcorder_realize(MMHandleType handle) } /* create pipeline */ + traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:REALIZE:CREATE_PIPELINE"); + ret = _mmcamcorder_create_pipeline(handle, hcamcorder->type); + + traceEnd(TTRACE_TAG_CAMERA); + if (ret != MM_ERROR_NONE) { /* check internal error of gstreamer */ if (hcamcorder->error_code != MM_ERROR_NONE) { @@ -1149,26 +1049,6 @@ _ERR_CAMCORDER_CMD: _mmcam_dbg_err("failed to unprepare resource manager, ret_resource(0x%x)", ret_resource); } } - /* rollback camera state to vconf key */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* get current camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_NULL); - - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_NULL); - } else { - int vconf_recorder_state = 0; - - /* get current recorder state of vconf key */ - vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state); - vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_NULL); - - _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d", - vconf_recorder_state, VCONFKEY_RECORDER_STATE_NULL); - } _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK: _MMCAMCORDER_UNLOCK_CMD(hcamcorder); @@ -1247,8 +1127,7 @@ int _mmcamcorder_unrealize(MMHandleType handle) if (ret == MM_ERROR_RESOURCE_INVALID_STATE) { _mmcam_dbg_warn("it could be in the middle of resource callback or there's no acquired resource"); ret = MM_ERROR_NONE; - } - else if (ret != MM_ERROR_NONE) { + } else if (ret != MM_ERROR_NONE) { _mmcam_dbg_err("failed to release resource, ret(0x%x)", ret); ret = MM_ERROR_CAMCORDER_INTERNAL; goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK; @@ -1301,27 +1180,6 @@ int _mmcamcorder_unrealize(MMHandleType handle) } } - /* set camera state to vconf key */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* get current camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_NULL); - - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_NULL); - } else { - int vconf_recorder_state = 0; - - /* get current recorder state of vconf key */ - vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state); - vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_NULL); - - _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d", - vconf_recorder_state, VCONFKEY_RECORDER_STATE_NULL); - } - _MMCAMCORDER_UNLOCK_CMD(hcamcorder); _mmcamcorder_set_state(handle, state_TO); @@ -1378,6 +1236,19 @@ int _mmcamcorder_start(MMHandleType handle) /* set attributes related sensor */ if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { + /* init for gdbus */ + hcamcorder->gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL); + if (hcamcorder->gdbus_conn == NULL) { + _mmcam_dbg_err("failed to get gdbus"); + ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION; + goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK; + } + + g_mutex_init(&hcamcorder->gdbus_info_sound.sync_mutex); + g_cond_init(&hcamcorder->gdbus_info_sound.sync_cond); + g_mutex_init(&hcamcorder->gdbus_info_solo_sound.sync_mutex); + g_cond_init(&hcamcorder->gdbus_info_solo_sound.sync_cond); + _mmcamcorder_set_attribute_to_camsensor(handle); } @@ -1393,24 +1264,21 @@ int _mmcamcorder_start(MMHandleType handle) _mmcamcorder_set_state(handle, state_TO); - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* check camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - - /* set camera state to vconf key */ - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW); - - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW); - } - _MMCAMCORDER_UNLOCK_CMD(hcamcorder); return MM_ERROR_NONE; _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK: + if (hcamcorder->gdbus_conn) { + g_object_unref(hcamcorder->gdbus_conn); + hcamcorder->gdbus_conn = NULL; + + g_mutex_clear(&hcamcorder->gdbus_info_sound.sync_mutex); + g_cond_clear(&hcamcorder->gdbus_info_sound.sync_cond); + g_mutex_clear(&hcamcorder->gdbus_info_solo_sound.sync_mutex); + g_cond_clear(&hcamcorder->gdbus_info_solo_sound.sync_cond); + } + _MMCAMCORDER_UNLOCK_CMD(hcamcorder); _ERR_CAMCORDER_CMD_PRECON: @@ -1466,16 +1334,31 @@ int _mmcamcorder_stop(MMHandleType handle) _mmcamcorder_set_state(handle, state_TO); if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; + g_mutex_lock(&hcamcorder->gdbus_info_sound.sync_mutex); + if (hcamcorder->gdbus_info_sound.subscribe_id > 0) { + _mmcam_dbg_warn("subscribe_id[%u] is remained. remove it.", + hcamcorder->gdbus_info_sound.subscribe_id); + g_dbus_connection_signal_unsubscribe(hcamcorder->gdbus_conn, + hcamcorder->gdbus_info_sound.subscribe_id); + } + g_mutex_unlock(&hcamcorder->gdbus_info_sound.sync_mutex); - /* check camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); + g_mutex_lock(&hcamcorder->gdbus_info_solo_sound.sync_mutex); + if (hcamcorder->gdbus_info_solo_sound.subscribe_id > 0) { + _mmcam_dbg_warn("subscribe_id[%u] is remained. remove it.", + hcamcorder->gdbus_info_solo_sound.subscribe_id); + g_dbus_connection_signal_unsubscribe(hcamcorder->gdbus_conn, + hcamcorder->gdbus_info_solo_sound.subscribe_id); + } + g_mutex_unlock(&hcamcorder->gdbus_info_solo_sound.sync_mutex); - /* set camera state to vconf key */ - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_OPEN); + g_object_unref(hcamcorder->gdbus_conn); + hcamcorder->gdbus_conn = NULL; - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_OPEN); + g_mutex_clear(&hcamcorder->gdbus_info_sound.sync_mutex); + g_cond_clear(&hcamcorder->gdbus_info_sound.sync_cond); + g_mutex_clear(&hcamcorder->gdbus_info_solo_sound.sync_mutex); + g_cond_clear(&hcamcorder->gdbus_info_solo_sound.sync_cond); } _MMCAMCORDER_UNLOCK_CMD(hcamcorder); @@ -1535,16 +1418,16 @@ int _mmcamcorder_capture_start(MMHandleType handle) ret = MM_ERROR_CAMCORDER_DEVICE_BUSY; goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK; } else { - pthread_mutex_lock(&(hcamcorder->task_thread_lock)); + g_mutex_lock(&hcamcorder->task_thread_lock); if (hcamcorder->task_thread_state == _MMCAMCORDER_TASK_THREAD_STATE_NONE) { hcamcorder->capture_in_recording = TRUE; hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_CHECK_CAPTURE_IN_RECORDING; _mmcam_dbg_log("send signal for capture in recording"); - pthread_cond_signal(&(hcamcorder->task_thread_cond)); - pthread_mutex_unlock(&(hcamcorder->task_thread_lock)); + g_cond_signal(&hcamcorder->task_thread_cond); + g_mutex_unlock(&hcamcorder->task_thread_lock); } else { _mmcam_dbg_err("task thread busy : %d", hcamcorder->task_thread_state); - pthread_mutex_unlock(&(hcamcorder->task_thread_lock)); + g_mutex_unlock(&hcamcorder->task_thread_lock); ret = MM_ERROR_CAMCORDER_INVALID_STATE; goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK; } @@ -1683,27 +1566,6 @@ int _mmcamcorder_record(MMHandleType handle) _mmcamcorder_set_state(handle, state_TO); - /* set camera state to vconf key */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* get current camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_RECORDING); - - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_RECORDING); - } else { - int vconf_recorder_state = 0; - - /* get current recorder state of vconf key */ - vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state); - vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_RECORDING); - - _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d", - vconf_recorder_state, VCONFKEY_RECORDER_STATE_RECORDING); - } - _MMCAMCORDER_UNLOCK_CMD(hcamcorder); return MM_ERROR_NONE; @@ -1764,27 +1626,6 @@ int _mmcamcorder_pause(MMHandleType handle) _mmcamcorder_set_state(handle, state_TO); - /* set camera state to vconf key */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* get current camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_RECORDING_PAUSE); - - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_RECORDING_PAUSE); - } else { - int vconf_recorder_state = 0; - - /* get current recorder state of vconf key */ - vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state); - vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_RECORDING_PAUSE); - - _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d", - vconf_recorder_state, VCONFKEY_RECORDER_STATE_RECORDING_PAUSE); - } - _MMCAMCORDER_UNLOCK_CMD(hcamcorder); return MM_ERROR_NONE; @@ -1837,27 +1678,6 @@ int _mmcamcorder_commit(MMHandleType handle) goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK; } - /* set camera state to vconf key */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* get current camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW); - - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW); - } else { - int vconf_recorder_state = 0; - - /* get current recorder state of vconf key */ - vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state); - vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_CREATED); - - _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d", - vconf_recorder_state, VCONFKEY_RECORDER_STATE_CREATED); - } - _MMCAMCORDER_UNLOCK_CMD(hcamcorder); _mmcamcorder_set_state(handle,state_TO); @@ -1914,27 +1734,6 @@ int _mmcamcorder_cancel(MMHandleType handle) _mmcamcorder_set_state(handle, state_TO); - /* set camera state to vconf key */ - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - int vconf_camera_state = 0; - - /* get current camera state of vconf key */ - vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state); - vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW); - - _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d", - vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW); - } else { - int vconf_recorder_state = 0; - - /* get current recorder state of vconf key */ - vconf_get_int(VCONFKEY_RECORDER_STATE, &vconf_recorder_state); - vconf_set_int(VCONFKEY_RECORDER_STATE, VCONFKEY_RECORDER_STATE_CREATED); - - _mmcam_dbg_log("VCONFKEY_RECORDER_STATE prev %d -> cur %d", - vconf_recorder_state, VCONFKEY_RECORDER_STATE_CREATED); - } - _MMCAMCORDER_UNLOCK_CMD(hcamcorder); return MM_ERROR_NONE; @@ -2123,6 +1922,7 @@ int _mmcamcorder_init_focusing(MMHandleType handle) control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); if (control == NULL) { _mmcam_dbg_err("cast CAMERA_CONTROL failed"); + _MMCAMCORDER_UNLOCK_CMD(hcamcorder); return MM_ERROR_CAMCORDER_INTERNAL; } @@ -2435,7 +2235,7 @@ __mmcamcorder_gstreamer_init(camera_conf * conf) /* release */ for (i = 0; i < *argc; i++) { if (argv[i]) { - free(argv[i]); + g_free(argv[i]); argv[i] = NULL; } } @@ -2510,7 +2310,7 @@ void _mmcamcorder_set_state(MMHandleType handle, int state) switch (hcamcorder->state_change_by_system) { case _MMCAMCORDER_STATE_CHANGE_BY_ASM: msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM; - msg.param.state.code = MM_ERROR_NONE; + msg.param.state.code = hcamcorder->interrupt_code; break; case _MMCAMCORDER_STATE_CHANGE_BY_RM: msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_RM; @@ -2570,32 +2370,29 @@ _MMCamcorderSubContext *_mmcamcorder_alloc_subcontext(int type) /* alloc info for each mode */ switch (type) { case MM_CAMCORDER_MODE_AUDIO: - sc->info_audio = malloc( sizeof(_MMCamcorderAudioInfo)); + sc->info_audio = g_malloc0( sizeof(_MMCamcorderAudioInfo)); if(!sc->info_audio) { _mmcam_dbg_err("Failed to alloc info structure"); goto ALLOC_SUBCONTEXT_FAILED; } - memset(sc->info_audio, 0x00, sizeof(_MMCamcorderAudioInfo)); break; case MM_CAMCORDER_MODE_VIDEO_CAPTURE: default: - sc->info_image = malloc( sizeof(_MMCamcorderImageInfo)); + sc->info_image = g_malloc0( sizeof(_MMCamcorderImageInfo)); if(!sc->info_image) { _mmcam_dbg_err("Failed to alloc info structure"); goto ALLOC_SUBCONTEXT_FAILED; } - memset(sc->info_image, 0x00, sizeof(_MMCamcorderImageInfo)); /* init sound status */ sc->info_image->sound_status = _SOUND_STATUS_INIT; - sc->info_video = malloc( sizeof(_MMCamcorderVideoInfo)); + sc->info_video = g_malloc0( sizeof(_MMCamcorderVideoInfo)); if(!sc->info_video) { _mmcam_dbg_err("Failed to alloc info structure"); goto ALLOC_SUBCONTEXT_FAILED; } - memset(sc->info_video, 0x00, sizeof(_MMCamcorderVideoInfo)); - pthread_mutex_init(&(sc->info_video->size_check_lock), NULL); + g_mutex_init(&sc->info_video->size_check_lock); break; } @@ -2632,19 +2429,12 @@ _MMCamcorderSubContext *_mmcamcorder_alloc_subcontext(int type) ALLOC_SUBCONTEXT_FAILED: if (sc) { - if (sc->info_audio) { - free(sc->info_audio); - sc->info_audio = NULL; - } - if (sc->info_image) { - free(sc->info_image); - sc->info_image = NULL; - } + SAFE_G_FREE(sc->info_audio); + SAFE_G_FREE(sc->info_image); if (sc->info_video) { - pthread_mutex_destroy(&(sc->info_video->size_check_lock)); - free(sc->info_video); - sc->info_video = NULL; + g_mutex_clear(&sc->info_video->size_check_lock); } + SAFE_G_FREE(sc->info_video); if (sc->element) { free(sc->element); sc->element = NULL; @@ -2686,21 +2476,15 @@ void _mmcamcorder_dealloc_subcontext(_MMCamcorderSubContext *sc) if (sc->info_video) { _mmcam_dbg_log("release info_video"); - if (sc->info_video->filename) { - free(sc->info_video->filename); - sc->info_video->filename = NULL; - } - pthread_mutex_destroy(&(sc->info_video->size_check_lock)); + SAFE_G_FREE(sc->info_video->filename); + g_mutex_clear(&sc->info_video->size_check_lock); free(sc->info_video); sc->info_video = NULL; } if (sc->info_audio) { _mmcam_dbg_log("release info_audio"); - if (sc->info_audio->filename) { - free(sc->info_audio->filename); - sc->info_audio->filename = NULL; - } + SAFE_G_FREE(sc->info_audio->filename); free(sc->info_audio); sc->info_audio = NULL; } @@ -3028,13 +2812,10 @@ GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage goto DROP_MESSAGE; } - cam_fd_info = (MMCamFaceDetectInfo *)malloc(sizeof(MMCamFaceDetectInfo)); + cam_fd_info = (MMCamFaceDetectInfo *)g_malloc(sizeof(MMCamFaceDetectInfo)); if (cam_fd_info == NULL) { _mmcam_dbg_warn("cam_fd_info alloc failed"); - - free(fd_info); - fd_info = NULL; - + SAFE_FREE(fd_info); goto DROP_MESSAGE; } @@ -3042,7 +2823,7 @@ GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage cam_fd_info->num_of_faces = fd_info->num_of_faces; if (cam_fd_info->num_of_faces > 0) { - cam_fd_info->face_info = (MMCamFaceInfo *)malloc(sizeof(MMCamFaceInfo) * cam_fd_info->num_of_faces); + cam_fd_info->face_info = (MMCamFaceInfo *)g_malloc(sizeof(MMCamFaceInfo) * cam_fd_info->num_of_faces); if (cam_fd_info->face_info) { /* set information of each face */ for (i = 0 ; i < fd_info->num_of_faces ; i++) { @@ -3066,8 +2847,7 @@ GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage _mmcam_dbg_warn("MMCamFaceInfo alloc failed"); /* free allocated memory that is not sent */ - free(cam_fd_info); - cam_fd_info = NULL; + SAFE_G_FREE(cam_fd_info); } } else { cam_fd_info->face_info = NULL; @@ -3095,7 +2875,7 @@ GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder); if (sc && sc->info_image) { /* play capture sound */ - _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE); + _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE01, FALSE); } } @@ -3193,11 +2973,8 @@ void _mmcamcorder_sound_focus_cb(int id, mm_sound_focus_type_e focus_type, return; } - /* set value to inform a status is changed by asm */ - hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM; - _mmcam_dbg_log("sound focus callback : focus state %d, reason %s", - focus_state, reason_for_change ? reason_for_change : "N/A"); + focus_state, reason_for_change ? reason_for_change : "N/A"); if (hcamcorder->session_flags & MM_SESSION_OPTION_UNINTERRUPTIBLE) { _mmcam_dbg_warn("session flag is UNINTERRUPTIBLE. do nothing."); @@ -3206,6 +2983,21 @@ void _mmcamcorder_sound_focus_cb(int id, mm_sound_focus_type_e focus_type, _MMCAMCORDER_LOCK_ASM(hcamcorder); + /* set value to inform a status is changed by asm */ + hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM; + + /* check the reason */ + if (!strncmp(reason_for_change, "ringtone-voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) || + !strncmp(reason_for_change, "ringtone-call", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) || + !strncmp(reason_for_change, "voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) || + !strncmp(reason_for_change, "call-voice", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) { + hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_CALL_START; + } else if (!strncmp(reason_for_change, "alarm", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) { + hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_ALARM_START; + } else { + hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_MEDIA; + } + if (focus_state == FOCUS_IS_RELEASED) { hcamcorder->acquired_focus &= ~focus_type; @@ -3255,9 +3047,6 @@ void _mmcamcorder_sound_focus_watch_cb(mm_sound_focus_type_e focus_type, mm_soun return; } - /* set value to inform a status is changed by asm */ - hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM; - _mmcam_dbg_log("sound focus watch callback : focus state %d, reason %s", focus_state, reason_for_change ? reason_for_change : "N/A"); @@ -3268,6 +3057,21 @@ void _mmcamcorder_sound_focus_watch_cb(mm_sound_focus_type_e focus_type, mm_soun _MMCAMCORDER_LOCK_ASM(hcamcorder); + /* set value to inform a status is changed by asm */ + hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM; + + /* check the reason */ + if (!strncmp(reason_for_change, "ringtone-voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) || + !strncmp(reason_for_change, "ringtone-call", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) || + !strncmp(reason_for_change, "voip", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN) || + !strncmp(reason_for_change, "call-voice", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) { + hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_CALL_START; + } else if (!strncmp(reason_for_change, "alarm", __MMCAMCORDER_FOCUS_CHANGE_REASON_LEN)) { + hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_ALARM_START; + } else { + hcamcorder->interrupt_code = MM_MSG_CODE_INTERRUPTED_BY_MEDIA; + } + if (focus_state == FOCUS_IS_RELEASED) { _MMCamcorderMsgItem msg; @@ -3336,7 +3140,11 @@ int _mmcamcorder_create_pipeline(MMHandleType handle, int type) pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst; if (type != MM_CAMCORDER_MODE_AUDIO) { + traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:REALIZE:SET_READY_TO_PIPELINE"); + ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY); + + traceEnd(TTRACE_TAG_CAMERA); } #ifdef _MMCAMCORDER_GET_DEVICE_INFO if (!_mmcamcorder_get_device_info(handle)) { @@ -3474,7 +3282,7 @@ int _mmcamcorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstSta GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE; GstStateChangeReturn getChangeReturn = GST_STATE_CHANGE_FAILURE; GstClockTime get_timeout = __MMCAMCORDER_SET_GST_STATE_TIMEOUT * GST_SECOND; - pthread_mutex_t *state_lock = NULL; + GMutex *state_lock = NULL; mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED); sc = MMF_CAMCORDER_SUBCONTEXT(handle); @@ -3488,7 +3296,7 @@ int _mmcamcorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstSta state_lock = &_MMCAMCORDER_GET_GST_ENCODE_STATE_LOCK(handle); } - pthread_mutex_lock(state_lock); + g_mutex_lock(state_lock); for (k = 0; k < _MMCAMCORDER_STATE_SET_COUNT; k++) { setChangeReturn = gst_element_set_state(pipeline, target_state); @@ -3503,7 +3311,7 @@ int _mmcamcorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstSta /* if we reached the final target state, exit */ if (pipeline_state == target_state) { _mmcam_dbg_log("Set state to %d - DONE", target_state); - pthread_mutex_unlock(state_lock); + g_mutex_unlock(state_lock); return MM_ERROR_NONE; } break; @@ -3511,12 +3319,12 @@ int _mmcamcorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstSta _mmcam_dbg_log("status=GST_STATE_CHANGE_ASYNC."); break; default: - pthread_mutex_unlock(state_lock); + g_mutex_unlock(state_lock); _mmcam_dbg_log("status=GST_STATE_CHANGE_FAILURE."); return MM_ERROR_CAMCORDER_GST_STATECHANGE; } - pthread_mutex_unlock(state_lock); + g_mutex_unlock(state_lock); _mmcam_dbg_err("timeout of gst_element_get_state()!!"); @@ -3526,7 +3334,7 @@ int _mmcamcorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstSta usleep(_MMCAMCORDER_STATE_CHECK_INTERVAL); } - pthread_mutex_unlock(state_lock); + g_mutex_unlock(state_lock); _mmcam_dbg_err("Failure. gst_element_set_state timeout!!");