Avoid duplicated call of legacy_camera_create/destroy 45/112845/2
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 1 Feb 2017 09:43:32 +0000 (18:43 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 3 Feb 2017 05:26:37 +0000 (14:26 +0900)
When user calls camera_get_device_state or camera_get_flash_state,
legacy_camera_create and legacy_camera_destroy are always called internally.
But, it's enough to call only once after muse-server starts, so update the code to avoid unnecessary call.

[Version] 0.2.68
[Profile] Common
[Issue Type] Update
[Dependency module] N/A
[Test] [M(T) - Boot=(OK), sdb=(OK), Home=(OK), Touch=(OK), Version=tizen-3.0-mobile_20170131.2]

Change-Id: I93685e0bef44b792c5c899cd0d0009012e7290cd
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
muse/src/muse_camera_dispatcher.c
packaging/mmsvc-camera.spec

index dc01284..d94378e 100644 (file)
 #define KEY_LENGTH 24
 
 #define CAMERA_PRIVILEGE_NAME "http://tizen.org/privilege/camera"
+#define MUSED_KEY_DEVICE_STATE_CHECK  "camera_get_device_state_is_called"
+#define MUSED_KEY_DEVICE_STATE_RETURN "camera_get_device_state_return"
+#define MUSED_KEY_FLASH_STATE_CHECK   "camera_get_flash_state_is_called"
+#define MUSED_KEY_FLASH_STATE_RETURN  "camera_get_flash_state_return"
+#define MUSED_KEY_FLASH_STATE_COUNT   "camera_get_flash_state_count"
 
 static int _camera_remove_export_data(muse_module_h module, int key, int remove_all);
 
@@ -2200,6 +2205,7 @@ int camera_dispatcher_get_flash_state(muse_module_h module)
 {
        int ret = CAMERA_ERROR_NONE;
        int count = 0;
+       bool is_called = false;
        char value_key[KEY_LENGTH] = {'\0',};
        camera_h camera = NULL;
        camera_device_e device_type = CAMERA_DEVICE_CAMERA0;
@@ -2218,22 +2224,37 @@ int camera_dispatcher_get_flash_state(muse_module_h module)
                return MUSE_CAMERA_ERROR_NONE;
        }
 
-       ret = legacy_camera_create(device_type, &camera);
+       muse_core_client_get_value(module, MUSED_KEY_FLASH_STATE_CHECK, (int *)&is_called);
+
+       if (!is_called) {
+               ret = legacy_camera_create(device_type, &camera);
+               if (camera) {
+                       legacy_camera_attr_foreach_supported_flash_mode(camera,
+                               (camera_attr_supported_flash_mode_cb)_camera_dispatcher_callback_supported_flash_mode2,
+                               (void *)&count);
+
+                       legacy_camera_destroy(camera);
+                       camera = NULL;
+               }
+
+               muse_core_client_set_value(module, MUSED_KEY_FLASH_STATE_RETURN, ret);
+               muse_core_client_set_value(module, MUSED_KEY_FLASH_STATE_COUNT, count);
+               muse_core_client_set_value(module, MUSED_KEY_FLASH_STATE_CHECK, (int)true);
+       } else {
+               muse_core_client_get_value(module, MUSED_KEY_FLASH_STATE_RETURN, &ret);
+               muse_core_client_get_value(module, MUSED_KEY_FLASH_STATE_COUNT, &count);
+       }
+
+       LOGD("is_called %d, ret 0x%x, count %d", is_called, ret, count);
+
        if (ret != CAMERA_ERROR_NONE) {
-               LOGE("failed to create camera handle 0x%x", ret);
+               LOGE("failed to create or get camera info 0x%x", ret);
 
                muse_camera_msg_return(api, class, ret, module);
 
                return MUSE_CAMERA_ERROR_NONE;
        }
 
-       ret = legacy_camera_attr_foreach_supported_flash_mode(camera,
-               (camera_attr_supported_flash_mode_cb)_camera_dispatcher_callback_supported_flash_mode2,
-               (void *)&count);
-
-       legacy_camera_destroy(camera);
-       camera = NULL;
-
        if (count < 2) {
                LOGE("count[%d] of supported flash mode is too small, so return NOT_SUPPORTED", count);
 
@@ -4809,6 +4830,7 @@ int camera_dispatcher_get_display_reuse_hint(muse_module_h module)
 int camera_dispatcher_get_device_state(muse_module_h module)
 {
        int ret = CAMERA_ERROR_NONE;
+       bool is_called = false;
        char value_key[KEY_LENGTH] = {'\0',};
        camera_h camera = NULL;
        camera_device_e device_type = CAMERA_DEVICE_CAMERA0;
@@ -4827,7 +4849,23 @@ int camera_dispatcher_get_device_state(muse_module_h module)
                return MUSE_CAMERA_ERROR_NONE;
        }
 
-       ret = legacy_camera_create(device_type, &camera);
+       muse_core_client_get_value(module, MUSED_KEY_DEVICE_STATE_CHECK, (int *)&is_called);
+
+       if (!is_called) {
+               ret = legacy_camera_create(device_type, &camera);
+               if (camera) {
+                       legacy_camera_destroy(camera);
+                       camera = NULL;
+               }
+
+               muse_core_client_set_value(module, MUSED_KEY_DEVICE_STATE_RETURN, ret);
+               muse_core_client_set_value(module, MUSED_KEY_DEVICE_STATE_CHECK, (int)true);
+       } else {
+               muse_core_client_get_value(module, MUSED_KEY_DEVICE_STATE_RETURN, &ret);
+       }
+
+       LOGD("is_called %d, ret 0x%x", is_called, ret);
+
        if (ret != CAMERA_ERROR_NONE) {
                LOGE("failed to create camera handle 0x%x", ret);
 
@@ -4836,16 +4874,13 @@ int camera_dispatcher_get_device_state(muse_module_h module)
                return MUSE_CAMERA_ERROR_NONE;
        }
 
-       legacy_camera_destroy(camera);
-       camera = NULL;
-
        snprintf(value_key, KEY_LENGTH, "device_state_camera%d", device_type);
        muse_core_client_get_value(module, value_key, (int *)&get_device_state);
 
        LOGD("device[%d] state : %d", device_type, get_device_state);
 
        muse_camera_msg_return1(api, class, ret, module, MUSE_CAMERA_GET_TYPE_INT,
-                       -1, "get_device_state", get_device_state, NULL);
+               -1, "get_device_state", get_device_state, NULL);
 
        return MUSE_CAMERA_ERROR_NONE;
 }
index 3c8c6d2..201fb67 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.2.67
+Version:    0.2.68
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0