Udpate for force stop function
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_resource.c
index bf4e063..c95918e 100644 (file)
@@ -81,22 +81,18 @@ static void __mmcamcorder_resource_state_callback(mrp_res_context_t *context, mr
        mrp_res_resource_t *resource;
        mmf_camcorder_t* camcorder = NULL;
 
-       if (err != MRP_RES_ERROR_NONE) {
-               _mmcam_dbg_err(" - error message received from Murphy, err(0x%x)", err);
-               return;
-       }
-
        camcorder = (mmf_camcorder_t*)user_data;
 
        mmf_return_if_fail((MMHandleType)camcorder);
+       mmf_return_if_fail(context);
 
-       _mmcam_dbg_log("enter");
+       _mmcam_dbg_warn("enter - state %d", context->state);
 
        _MMCAMCORDER_LOCK_RESOURCE(camcorder);
 
        switch (context->state) {
        case MRP_RES_CONNECTED:
-               _mmcam_dbg_log(" - connected to Murphy");
+               _mmcam_dbg_warn(" - connected to Murphy");
                if ((rset = mrp_res_list_resources(context)) != NULL) {
                        mrp_res_string_array_t *resource_names;
                        resource_names = mrp_res_list_resource_names(rset);
@@ -108,7 +104,7 @@ static void __mmcamcorder_resource_state_callback(mrp_res_context_t *context, mr
                        for (i = 0; i < resource_names->num_strings; i++) {
                                resource = mrp_res_get_resource_by_name(rset, resource_names->strings[i]);
                                if (resource)
-                                       _mmcam_dbg_log(" - available resource: %s", resource->name);
+                                       _mmcam_dbg_warn(" - available resource: %s", resource->name);
                        }
                        mrp_res_free_string_array(resource_names);
                }
@@ -116,22 +112,35 @@ static void __mmcamcorder_resource_state_callback(mrp_res_context_t *context, mr
                _MMCAMCORDER_RESOURCE_SIGNAL(camcorder);
                break;
        case MRP_RES_DISCONNECTED:
-               _mmcam_dbg_log(" - disconnected from Murphy");
+               _mmcam_dbg_err(" - disconnected from Murphy : stop camera");
+
                if (camcorder->resource_manager.rset) {
                        mrp_res_delete_resource_set(camcorder->resource_manager.rset);
                        camcorder->resource_manager.rset = NULL;
                }
+
                if (camcorder->resource_manager.context) {
                        mrp_res_destroy(camcorder->resource_manager.context);
                        camcorder->resource_manager.context = NULL;
                        camcorder->resource_manager.is_connected = FALSE;
                }
+
+               _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+
+               _MMCAMCORDER_LOCK_ASM(camcorder);
+
+               /* Stop the camera */
+               __mmcamcorder_force_stop(camcorder, _MMCAMCORDER_STATE_CHANGE_BY_RM);
+
+               _MMCAMCORDER_UNLOCK_ASM(camcorder);
+
+               _MMCAMCORDER_LOCK_RESOURCE(camcorder);
                break;
        }
 
        _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
 
-       _mmcam_dbg_log("leave");
+       _mmcam_dbg_warn("leave");
 
        return;
 }
@@ -161,14 +170,14 @@ static void __mmcamcorder_resource_set_state_callback(mrp_res_context_t *cx, con
                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]",
+                       _mmcam_dbg_warn(" -- 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");
+                                       _mmcam_dbg_warn("send signal - resource acquire done");
                                        _MMCAMCORDER_RESOURCE_SIGNAL(camcorder);
                                } else {
                                        _mmcam_dbg_warn("remained acquire count %d",
@@ -178,13 +187,13 @@ static void __mmcamcorder_resource_set_state_callback(mrp_res_context_t *cx, con
                                camcorder->resource_manager.acquire_remain++;
 
                                if (camcorder->resource_manager.acquire_remain >= camcorder->resource_manager.acquire_count) {
-                                       _mmcam_dbg_log("resource release done");
+                                       _mmcam_dbg_warn("resource release done");
 
                                        if (camcorder->state > MM_CAMCORDER_STATE_NULL) {
-                                               _mmcam_dbg_log("send resource signal");
+                                               _mmcam_dbg_warn("send resource signal");
                                                _MMCAMCORDER_RESOURCE_SIGNAL(camcorder);
                                        } else {
-                                               _mmcam_dbg_log("skip resource signal - state %d", camcorder->state);
+                                               _mmcam_dbg_warn("skip resource signal - state %d", camcorder->state);
                                        }
                                } else {
                                        _mmcam_dbg_warn("acquired %d, lost %d",
@@ -220,17 +229,19 @@ static void __mmcamcorder_resource_release_cb(mrp_res_context_t *cx, const mrp_r
                return;
        }
 
-       /* set value to inform a status is changed by resource manaer */
-       camcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_RM;
+       _mmcam_dbg_warn("enter");
 
-       _MMCAMCORDER_LOCK_ASM(camcorder);
+       _MMCAMCORDER_LOCK_RESOURCE(camcorder);
 
        if (!mrp_res_equal_resource_set(rs, camcorder->resource_manager.rset)) {
-               _MMCAMCORDER_UNLOCK_ASM(camcorder);
+               _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
                _mmcam_dbg_warn("- resource set(%p) is not same as this camcorder handle's(%p)", rs, camcorder->resource_manager.rset);
                return;
        }
 
+       /* set flag for resource release callback */
+       camcorder->resource_release_cb_calling = TRUE;
+
        _mmcam_dbg_log(" - resource set state of camcorder(%p) is changed to [%s]",
                camcorder, __mmcamcorder_resource_state_to_str(rs->state));
 
@@ -239,18 +250,28 @@ 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_warn(" -- resource name [%s] -> [%s]", res->name, __mmcamcorder_resource_state_to_str(res->state));
                }
        }
 
-       /* Stop the camera */
-       __mmcamcorder_force_stop(camcorder);
+       _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+
+       _MMCAMCORDER_LOCK_ASM(camcorder);
 
-       /* restore value */
-       camcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
+       /* Stop the camera */
+       __mmcamcorder_force_stop(camcorder, _MMCAMCORDER_STATE_CHANGE_BY_RM);
 
        _MMCAMCORDER_UNLOCK_ASM(camcorder);
 
+       _MMCAMCORDER_LOCK_RESOURCE(camcorder);
+
+       /* restore flag for resource release callback */
+       camcorder->resource_release_cb_calling = FALSE;
+
+       _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+
+       _mmcam_dbg_warn("leave");
+
        return;
 }
 
@@ -372,6 +393,40 @@ int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_mana
        return MM_ERROR_NONE;
 }
 
+
+int _mmcamcorder_resource_wait_for_connection(MMCamcorderResourceManager *resource_manager, void *hcamcorder)
+{
+       int ret = MM_ERROR_NONE;
+
+       mmf_return_val_if_fail(resource_manager && hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
+
+       if (resource_manager->is_connected == FALSE) {
+               gint64 end_time = 0;
+
+               /* wait for resource manager connected */
+               _mmcam_dbg_warn("not connected. wait for signal...");
+
+               end_time = g_get_monotonic_time() + (__MMCAMCORDER_RESOURCE_WAIT_TIME * G_TIME_SPAN_SECOND);
+
+               if (_MMCAMCORDER_RESOURCE_WAIT_UNTIL(hcamcorder, end_time)) {
+                       _mmcam_dbg_warn("signal received");
+                       ret = MM_ERROR_NONE;
+               } else {
+                       _mmcam_dbg_err("connection timeout");
+                       ret = MM_ERROR_RESOURCE_INTERNAL;
+               }
+       } else {
+               _mmcam_dbg_warn("already connected");
+       }
+
+       _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+
+       return ret;
+}
+
+
 int _mmcamcorder_resource_manager_prepare(MMCamcorderResourceManager *resource_manager, MMCamcorderResourceType resource_type)
 {
        MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);