X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_camcorder_resource.c;h=3c15e0adb349155ea11281259f0b6b6fbc6dc417;hb=6012f7ec5032f940e8446a7aec9a9ee001ba05c6;hp=793630def00d48e0d4a223381ff03f9b5f210501;hpb=e5c25b3688ac5b621ae3077c4e55763646a80c50;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git diff --git a/src/mm_camcorder_resource.c b/src/mm_camcorder_resource.c index 793630d..3c15e0a 100644 --- a/src/mm_camcorder_resource.c +++ b/src/mm_camcorder_resource.c @@ -26,8 +26,8 @@ #define MRP_RESOURCE_TYPE_EXCLUSIVE FALSE const char* mm_camcorder_resource_str[MM_CAMCORDER_RESOURCE_MAX] = { - "camera", - "video_overlay" + "camera", + "video_overlay" }; #define MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(x_camcorder_resource_manager) \ @@ -36,7 +36,7 @@ do { \ _mmcam_dbg_err("no resource manager instance"); \ return MM_ERROR_INVALID_ARGUMENT; \ } \ -} while(0); +} while (0); #define MMCAMCORDER_CHECK_CONNECTION_RESOURCE_MANAGER(x_camcorder_resource_manager) \ do { \ @@ -49,7 +49,7 @@ do { \ return MM_ERROR_RESOURCE_NOT_INITIALIZED; \ } \ } \ -} while(0); +} while (0); static char *__mmcamcorder_resource_state_to_str(mrp_res_resource_state_t st) { @@ -90,6 +90,10 @@ static void __mmcamcorder_resource_state_callback(mrp_res_context_t *context, mr mmf_return_if_fail((MMHandleType)camcorder); + _mmcam_dbg_log("enter"); + + _MMCAMCORDER_LOCK_RESOURCE(camcorder); + switch (context->state) { case MRP_RES_CONNECTED: _mmcam_dbg_log(" - connected to Murphy"); @@ -98,17 +102,18 @@ static void __mmcamcorder_resource_state_callback(mrp_res_context_t *context, mr resource_names = mrp_res_list_resource_names(rset); if (!resource_names) { _mmcam_dbg_err(" - no resources available"); + _MMCAMCORDER_UNLOCK_RESOURCE(camcorder); return; } for (i = 0; i < resource_names->num_strings; i++) { resource = mrp_res_get_resource_by_name(rset, resource_names->strings[i]); - if (resource) { + if (resource) _mmcam_dbg_log(" - available resource: %s", resource->name); - } } mrp_res_free_string_array(resource_names); } camcorder->resource_manager.is_connected = TRUE; + _MMCAMCORDER_RESOURCE_SIGNAL(camcorder); break; case MRP_RES_DISCONNECTED: _mmcam_dbg_log(" - disconnected from Murphy"); @@ -124,6 +129,10 @@ static void __mmcamcorder_resource_state_callback(mrp_res_context_t *context, mr break; } + _MMCAMCORDER_UNLOCK_RESOURCE(camcorder); + + _mmcam_dbg_log("leave"); + return; } @@ -136,8 +145,11 @@ static void __mmcamcorder_resource_set_state_callback(mrp_res_context_t *cx, con mmf_return_if_fail((MMHandleType)camcorder); + _MMCAMCORDER_LOCK_RESOURCE(camcorder); + if (!mrp_res_equal_resource_set(rs, camcorder->resource_manager.rset)) { _mmcam_dbg_warn("- resource set(%p) is not same as this camcorder handle's(%p)", rs, camcorder->resource_manager.rset); + _MMCAMCORDER_UNLOCK_RESOURCE(camcorder); return; } @@ -151,12 +163,43 @@ static void __mmcamcorder_resource_set_state_callback(mrp_res_context_t *cx, con } else { _mmcam_dbg_log(" -- resource name [%s] -> [%s]", res->name, __mmcamcorder_resource_state_to_str(res->state)); + + if (res->state == MRP_RES_RESOURCE_ACQUIRED) { + camcorder->resource_manager.acquire_remain--; + + if (camcorder->resource_manager.acquire_remain <= 0) { + _mmcam_dbg_log("send signal - resource acquire done"); + _MMCAMCORDER_RESOURCE_SIGNAL(camcorder); + } else { + _mmcam_dbg_warn("remained acquire count %d", + camcorder->resource_manager.acquire_remain); + } + } else if (res->state == MRP_RES_RESOURCE_LOST) { + camcorder->resource_manager.acquire_remain++; + + if (camcorder->resource_manager.acquire_remain >= camcorder->resource_manager.acquire_count) { + _mmcam_dbg_log("resource release done"); + + if (camcorder->state > MM_CAMCORDER_STATE_NULL) { + _mmcam_dbg_log("send resource signal"); + _MMCAMCORDER_RESOURCE_SIGNAL(camcorder); + } else { + _mmcam_dbg_log("skip resource signal - state %d", camcorder->state); + } + } else { + _mmcam_dbg_warn("acquired %d, lost %d", + camcorder->resource_manager.acquire_count, + camcorder->resource_manager.acquire_remain); + } + } } } mrp_res_delete_resource_set(camcorder->resource_manager.rset); camcorder->resource_manager.rset = mrp_res_copy_resource_set(rs); + _MMCAMCORDER_UNLOCK_RESOURCE(camcorder); + return; } @@ -183,6 +226,7 @@ static void __mmcamcorder_resource_release_cb(mrp_res_context_t *cx, const mrp_r _MMCAMCORDER_LOCK_ASM(camcorder); if (!mrp_res_equal_resource_set(rs, camcorder->resource_manager.rset)) { + _MMCAMCORDER_UNLOCK_ASM(camcorder); _mmcam_dbg_warn("- resource set(%p) is not same as this camcorder handle's(%p)", rs, camcorder->resource_manager.rset); return; } @@ -195,8 +239,7 @@ static void __mmcamcorder_resource_release_cb(mrp_res_context_t *cx, const mrp_r if (res == NULL) { _mmcam_dbg_warn(" -- %s not present in resource set", mm_camcorder_resource_str[i]); } else { - _mmcam_dbg_log(" -- resource name [%s] -> [%s]", - res->name, __mmcamcorder_resource_state_to_str(res->state)); + _mmcam_dbg_log(" -- resource name [%s] -> [%s]", res->name, __mmcamcorder_resource_state_to_str(res->state)); } } @@ -211,11 +254,12 @@ static void __mmcamcorder_resource_release_cb(mrp_res_context_t *cx, const mrp_r return; } -static int __mmcamcorder_resource_create_resource_set(MMCamcorderResourceManager *resource_manager) +int _mmcamcorder_resource_create_resource_set(MMCamcorderResourceManager *resource_manager) { if (resource_manager->rset) { - _mmcam_dbg_err(" - resource set was already created"); - return MM_ERROR_RESOURCE_INVALID_STATE; + _mmcam_dbg_warn(" - resource set was already created, delete it"); + mrp_res_delete_resource_set(resource_manager->rset); + resource_manager->rset = NULL; } resource_manager->rset = mrp_res_create_resource_set(resource_manager->context, @@ -226,9 +270,10 @@ static int __mmcamcorder_resource_create_resource_set(MMCamcorderResourceManager return MM_ERROR_RESOURCE_INTERNAL; } - if (!mrp_res_set_autorelease(TRUE, resource_manager->rset)) { + if (!mrp_res_set_autorelease(TRUE, resource_manager->rset)) _mmcam_dbg_warn(" - could not set autorelease flag!"); - } + + _mmcam_dbg_log("done"); return MM_ERROR_NONE; } @@ -237,15 +282,19 @@ static int __mmcamcorder_resource_include_resource(MMCamcorderResourceManager *r { mrp_res_resource_t *resource = NULL; resource = mrp_res_create_resource(resource_manager->rset, - resource_name, - MRP_RESOURCE_TYPE_MANDATORY, - MRP_RESOURCE_TYPE_EXCLUSIVE); + resource_name, + MRP_RESOURCE_TYPE_MANDATORY, + MRP_RESOURCE_TYPE_EXCLUSIVE); if (resource == NULL) { _mmcam_dbg_err(" - could not include resource[%s]", resource_name); return MM_ERROR_RESOURCE_INTERNAL; } - _mmcam_dbg_log(" - include resource[%s]", resource_name); + resource_manager->acquire_count++; + resource_manager->acquire_remain = resource_manager->acquire_count; + + _mmcam_dbg_log(" - count[%d] include resource[%s]", + resource_manager->acquire_count, resource_name); return MM_ERROR_NONE; } @@ -274,39 +323,32 @@ int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_mana MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); resource_manager->mloop = mrp_mainloop_glib_get(g_main_loop_new(NULL, TRUE)); - if (resource_manager->mloop) { - resource_manager->context = mrp_res_create(resource_manager->mloop, __mmcamcorder_resource_state_callback, user_data); - if (resource_manager->context == NULL) { - _mmcam_dbg_err(" - could not get context for resource manager"); - mrp_mainloop_destroy(resource_manager->mloop); - resource_manager->mloop = NULL; - return MM_ERROR_RESOURCE_INTERNAL; - } - resource_manager->user_data = user_data; - } else { - _mmcam_dbg_err("- could not get mainloop for resource manager"); + if (!resource_manager->mloop) { + _mmcam_dbg_err("failed to get mainloop for mrp"); + return MM_ERROR_RESOURCE_INTERNAL; + } + + resource_manager->context = mrp_res_create(resource_manager->mloop, __mmcamcorder_resource_state_callback, user_data); + if (!resource_manager->context) { + _mmcam_dbg_err("could not get context for mrp"); + mrp_mainloop_destroy(resource_manager->mloop); + resource_manager->mloop = NULL; return MM_ERROR_RESOURCE_INTERNAL; } + resource_manager->user_data = user_data; + + _mmcam_dbg_log("done"); + return MM_ERROR_NONE; } int _mmcamcorder_resource_manager_prepare(MMCamcorderResourceManager *resource_manager, MMCamcorderResourceType resource_type) { - int ret = MM_ERROR_NONE; MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); MMCAMCORDER_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); - if (!resource_manager->rset) { - ret = __mmcamcorder_resource_create_resource_set(resource_manager); - } - if (ret == MM_ERROR_NONE) { - ret = __mmcamcorder_resource_include_resource(resource_manager, mm_camcorder_resource_str[resource_type]); - } else { - _mmcam_dbg_err("failed to create resource set 0x%x", ret); - } - - return ret; + return __mmcamcorder_resource_include_resource(resource_manager, mm_camcorder_resource_str[resource_type]); } int _mmcamcorder_resource_manager_acquire(MMCamcorderResourceManager *resource_manager) @@ -363,28 +405,10 @@ int _mmcamcorder_resource_manager_release(MMCamcorderResourceManager *resource_m return ret; } -int _mmcamcorder_resource_manager_unprepare(MMCamcorderResourceManager *resource_manager) -{ - int ret = MM_ERROR_NONE; - MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMCAMCORDER_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); - - if (resource_manager->rset == NULL) { - _mmcam_dbg_err("- could not unprepare for resource_manager, _mmcamcorder_resource_manager_prepare() first"); - ret = MM_ERROR_RESOURCE_INVALID_STATE; - } else { - mrp_res_delete_resource_set(resource_manager->rset); - resource_manager->rset = NULL; - _mmcam_dbg_log("delete resource set done"); - } - - return ret; -} int _mmcamcorder_resource_manager_deinit(MMCamcorderResourceManager *resource_manager) { MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMCAMCORDER_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); if (resource_manager->rset) { if (resource_manager->rset->state == MRP_RES_RESOURCE_ACQUIRED) {