Do not call resource init in case of audio only recording mode
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_internal.c
index 3eb1590..ecc1220 100644 (file)
@@ -143,6 +143,7 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
        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->mtsafe).mstream_cb_lock);
 #ifdef _MMCAMCORDER_MURPHY_SUPPORT
        g_cond_init(&(hcamcorder->mtsafe).resource_cond);
        g_mutex_init(&(hcamcorder->mtsafe).resource_lock);
@@ -398,6 +399,16 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
 
                        _mmcam_dbg_log("DPM camera changed cb id %d", hcamcorder->dpm_camera_cb_id);
                }
+
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+               /* 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;
+               }
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
        } else {
                _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main,
                        CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
@@ -422,16 +433,6 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
                }
        }
 
-#ifdef _MMCAMCORDER_MURPHY_SUPPORT
-       /* 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;
-       }
-#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
-
        traceBegin(TTRACE_TAG_CAMERA, "MMCAMCORDER:CREATE:INIT_GSTREAMER");
 
        ret = __mmcamcorder_gstreamer_init(hcamcorder->conf_main);
@@ -491,27 +492,29 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
        }
 
 #ifdef _MMCAMCORDER_MURPHY_SUPPORT
-       _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
+       if (info->videodev_type != MM_VIDEO_DEVICE_NONE) {
+               _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
 
-       if (hcamcorder->resource_manager.is_connected == FALSE) {
-               gint64 end_time = 0;
+               if (hcamcorder->resource_manager.is_connected == FALSE) {
+                       gint64 end_time = 0;
 
-               /* wait for resource manager connected */
-               _mmcam_dbg_log("resource manager is not connected. wait for signal...");
+                       /* wait for resource manager connected */
+                       _mmcam_dbg_log("resource manager is not connected. wait for signal...");
 
-               end_time = g_get_monotonic_time() + (__MMCAMCORDER_RESOURCE_WAIT_TIME * G_TIME_SPAN_SECOND);
+                       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");
-               } else {
-                       _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
-                       _mmcam_dbg_err("timeout");
-                       ret = MM_ERROR_RESOURCE_INTERNAL;
-                       goto _ERR_DEFAULT_VALUE_INIT;
+                       if (_MMCAMCORDER_RESOURCE_WAIT_UNTIL(hcamcorder, end_time)) {
+                               _mmcam_dbg_warn("signal received");
+                       } else {
+                               _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+                               _mmcam_dbg_err("timeout");
+                               ret = MM_ERROR_RESOURCE_INTERNAL;
+                               goto _ERR_DEFAULT_VALUE_INIT;
+                       }
                }
-       }
 
-       _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+               _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+       }
 #endif /* _MMCAMCORDER_MURPHY_SUPPORT */
 
        /* Set initial state */
@@ -565,6 +568,7 @@ _ERR_DEFAULT_VALUE_INIT:
        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->mtsafe).mstream_cb_lock);
 #ifdef _MMCAMCORDER_MURPHY_SUPPORT
        g_cond_clear(&(hcamcorder->mtsafe).resource_cond);
        g_mutex_clear(&(hcamcorder->mtsafe).resource_lock);
@@ -802,6 +806,7 @@ int _mmcamcorder_destroy(MMHandleType handle)
        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->mtsafe).mstream_cb_lock);
 #ifdef _MMCAMCORDER_MURPHY_SUPPORT
        g_cond_clear(&(hcamcorder->mtsafe).resource_cond);
        g_mutex_clear(&(hcamcorder->mtsafe).resource_lock);
@@ -1061,6 +1066,9 @@ int _mmcamcorder_realize(MMHandleType handle)
                                if (dpm_camera_state == DPM_DISALLOWED) {
                                        _mmcam_dbg_err("CAMERA DISALLOWED by DPM");
                                        ret = MM_ERROR_POLICY_RESTRICTED;
+
+                                       _mmcamcorder_request_dpm_popup(hcamcorder->gdbus_conn, "camera");
+
                                        goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
                                }
                        } else {
@@ -1099,7 +1107,8 @@ int _mmcamcorder_realize(MMHandleType handle)
                /* acquire resources */
                _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
 
-               if (hcamcorder->resource_manager.rset && _mmcamcorder_resource_manager_acquire(&hcamcorder->resource_manager)) {
+               ret = _mmcamcorder_resource_manager_acquire(&hcamcorder->resource_manager);
+               if (ret != MM_ERROR_NONE) {
                        _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
 
                        _mmcam_dbg_err("could not acquire resources");
@@ -1489,6 +1498,10 @@ int _mmcamcorder_start(MMHandleType handle)
 
        _mmcamcorder_set_state(handle, MM_CAMCORDER_STATE_PREPARE);
 
+       /* set attributes related sensor - after start preview */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO)
+               _mmcamcorder_set_attribute_to_camsensor2(handle);
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -1749,6 +1762,9 @@ int _mmcamcorder_record(MMHandleType handle)
                        if (dpm_mic_state == DPM_DISALLOWED) {
                                _mmcam_dbg_err("MIC DISALLOWED by DPM");
                                ret = MM_ERROR_COMMON_INVALID_PERMISSION;
+
+                               _mmcamcorder_request_dpm_popup(hcamcorder->gdbus_conn, "microphone");
+
                                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
                        }
                } else {
@@ -2032,6 +2048,31 @@ int _mmcamcorder_set_audio_stream_callback(MMHandleType handle, mm_camcorder_aud
 }
 
 
+int _mmcamcorder_set_muxed_stream_callback(MMHandleType handle, mm_camcorder_muxed_stream_callback callback, void *user_data)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       _mmcam_dbg_log("");
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       if (callback == NULL)
+               _mmcam_dbg_warn("Muxed Stream Callback is disabled, because application sets it to NULL");
+
+       if (!_MMCAMCORDER_TRYLOCK_MSTREAM_CALLBACK(hcamcorder)) {
+               _mmcam_dbg_warn("Application's muxed stream callback is running now");
+               return MM_ERROR_CAMCORDER_INVALID_CONDITION;
+       }
+
+       hcamcorder->mstream_cb = callback;
+       hcamcorder->mstream_cb_param = user_data;
+
+       _MMCAMCORDER_UNLOCK_MSTREAM_CALLBACK(hcamcorder);
+
+       return MM_ERROR_NONE;
+}
+
+
 int _mmcamcorder_set_video_capture_callback(MMHandleType handle, mm_camcorder_video_capture_callback callback, void *user_data)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
@@ -3196,9 +3237,9 @@ GstBusSyncReply _mmcamcorder_encode_pipeline_bus_sync_callback(GstBus *bus, GstM
 
                                _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
                        }
-               }
 
-               goto DROP_MESSAGE;
+                       goto DROP_MESSAGE;
+               }
        }
 
        if (err) {
@@ -3423,6 +3464,8 @@ void _mmcamcorder_dpm_camera_policy_changed_cb(const char *name, const char *val
                hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
 
                _MMCAMCORDER_UNLOCK_ASM(hcamcorder);
+
+               _mmcamcorder_request_dpm_popup(hcamcorder->gdbus_conn, "camera");
        }
 
        _mmcam_dbg_warn("done");
@@ -4019,6 +4062,8 @@ static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int cod
 
                        _MMCAMCORDER_UNLOCK_ASM(hcamcorder);
 
+                       _mmcamcorder_request_dpm_popup(hcamcorder->gdbus_conn, "microphone");
+
                        return MM_ERROR_POLICY_RESTRICTED;
                }
        }