int cached_focus_mode;
camera_device_e device_type;
camera_attr_ptz_type_e ptz_type;
+
+ /* for shutdown */
+ GMutex lock;
+ GCond cond;
} camera_s;
int _camera_get_mm_handle(camera_h camera , MMHandleType *handle);
int _camera_set_relay_mm_message_callback(camera_h camera, MMMessageCallback callback, void *user_data);
int __camera_start_continuous_focusing(camera_h camera);
int _camera_set_use(camera_h camera, bool used);
-bool _camera_is_used(camera_h camera);
int __convert_camera_error_code(const char* func, int code);
#ifdef __cplusplus
mm_camcorder_set_message_callback(handle->mm_handle,
__mm_camera_message_callback, (void *)handle);
+ g_mutex_init(&handle->lock);
+ g_cond_init(&handle->cond);
+
*camera = (camera_h)handle;
LOGD("legacy camera handle %p", handle);
LOGW("camera handle %p", handle);
ret = mm_camcorder_destroy(handle->mm_handle);
- if (ret == MM_ERROR_NONE)
+ if (ret == MM_ERROR_NONE) {
+ g_cond_clear(&handle->cond);
+ g_mutex_clear(&handle->lock);
free(handle);
+ }
return __convert_camera_error_code(__func__, ret);
}
}
-bool _camera_is_used(camera_h camera)
-{
- camera_s *handle = (camera_s *)camera;
-
- if (handle == NULL) {
- LOGE("handle is NULL");
- return false;
- }
-
- return handle->is_used_in_recorder;
-}
-
-
int _camera_get_mm_handle(camera_h camera, MMHandleType *handle)
{
if (camera == NULL || handle == NULL) {
return __convert_camera_error_code(__func__, ret);
}
+
+
+bool legacy_camera_is_used(camera_h camera)
+{
+ camera_s *handle = (camera_s *)camera;
+
+ if (handle == NULL) {
+ LOGE("handle is NULL");
+ return false;
+ }
+
+ return handle->is_used_in_recorder;
+}
+
+
+bool legacy_camera_wait(camera_h camera, unsigned int timeout)
+{
+ camera_s *handle = (camera_s *)camera;
+ gint64 end_time;
+
+ if (handle == NULL) {
+ LOGE("handle is NULL");
+ return false;
+ }
+
+ end_time = g_get_monotonic_time() + timeout * G_TIME_SPAN_MILLISECOND;
+
+ return (bool)g_cond_wait_until(&handle->cond, &handle->lock, end_time);
+}
+
+
+void legacy_camera_lock(camera_h camera, bool is_lock)
+{
+ camera_s *handle = (camera_s *)camera;
+
+ if (handle == NULL) {
+ LOGE("handle is NULL");
+ return;
+ }
+
+ LOGD("%p lock %d", handle, is_lock);
+
+ if (is_lock)
+ g_mutex_lock(&handle->lock);
+ else
+ g_mutex_unlock(&handle->lock);
+
+ LOGD("done");
+
+ return;
+}
+
+
+void legacy_camera_send_signal(camera_h camera)
+{
+ camera_s *handle = (camera_s *)camera;
+
+ if (handle == NULL) {
+ LOGE("handle is NULL");
+ return;
+ }
+
+ LOGD("send signal");
+
+ g_cond_signal(&handle->cond);
+
+ LOGD("done");
+
+ return;
+}
muse_camera = (muse_camera_handle_s *)muse_core_ipc_get_handle(module);
if (muse_camera == NULL) {
LOGE("NULL handle");
- return MUSE_CAMERA_ERROR_NONE;
+ return MUSE_CAMERA_ERROR_INVALID;
}
+ legacy_camera_lock(muse_camera->camera_handle, true);
+
+ if (legacy_camera_is_used(muse_camera->camera_handle)) {
+ LOGW("camera is used in recorder.. wait...");
+ if (legacy_camera_wait(muse_camera->camera_handle, 3000)) {
+ LOGD("recorder is released");
+ } else {
+ legacy_camera_lock(muse_camera->camera_handle, false);
+ LOGE("wait timeout, could not release camera handle %p", muse_camera->camera_handle);
+ return MUSE_CAMERA_ERROR_INVALID;
+ }
+ }
+
+ legacy_camera_lock(muse_camera->camera_handle, false);
+
again:
legacy_camera_get_state(muse_camera->camera_handle, &state);