Bugfix - directvideosink settings and add exception case without resource manager...
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_audiorec.c
index d0e3afe..f8dd8d4 100644 (file)
 /*---------------------------------------------------------------------------------------
 |    GLOBAL VARIABLE DEFINITIONS for internal                                          |
 ---------------------------------------------------------------------------------------*/
-#define MM_CAMCORDER_START_CHANGE_STATE _MMCamcorderStartHelperFunc((void *)hcamcorder)
-#define MM_CAMCORDER_STOP_CHANGE_STATE _MMCamcorderStopHelperFunc((void *)hcamcorder)
+
 /*---------------------------------------------------------------------------------------
 |    LOCAL VARIABLE DEFINITIONS for internal                                           |
 ---------------------------------------------------------------------------------------*/
 #define RESET_PAUSE_TIME                        0
-#define _MMCAMCORDER_AUDIO_MINIMUM_SPACE        (100*1024)
-#define _MMCAMCORDER_AUDIO_MARGIN_SPACE         (1*1024)
+#define _MMCAMCORDER_AUDIO_MINIMUM_SPACE        ((100*1024) + (5*1024))
 #define _MMCAMCORDER_RETRIAL_COUNT              10
 #define _MMCAMCORDER_FRAME_WAIT_TIME            200000 /* micro second */
 #define _MMCAMCORDER_FREE_SPACE_CHECK_INTERVAL  10
@@ -79,6 +77,7 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle)
        _MMCamcorderSubContext *sc = NULL;
        type_element *aenc_elem = NULL;
        type_element *mux_elem = NULL;
+       type_element *sink_elem = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
@@ -159,15 +158,18 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle)
 
                _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_AENC, aenc_name, NULL, element_list, err);
 
-               if (file_name)
-                       sink_name = "filesink";
-               else
-                       sink_name = "fakesink";
+               _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
+                       CONFIGURE_CATEGORY_MAIN_RECORD,
+                       "RecordsinkElement",
+                       &sink_elem);
+               _mmcamcorder_conf_get_value_element_name(sink_elem, &sink_name);
 
                _mmcam_dbg_log("encode sink : %s", sink_name);
 
                _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_SINK, sink_name, NULL, element_list, err);
 
+               _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, sink_elem);
+
                /* add elements to encode pipeline */
                if (!_mmcamcorder_add_elements_to_bin(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst), element_list)) {
                        _mmcam_dbg_err("add encode elements error.");
@@ -193,6 +195,11 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle)
        srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, "src");
        MMCAMCORDER_ADD_BUFFER_PROBE(srcpad, _MMCAMCORDER_HANDLER_AUDIOREC,
                __mmcamcorder_audio_dataprobe_record, hcamcorder);
+
+       /* for replay gain tag */
+       MMCAMCORDER_ADD_EVENT_PROBE(srcpad, _MMCAMCORDER_HANDLER_AUDIOREC,
+               __mmcamcorder_eventprobe_monitor, hcamcorder);
+
        gst_object_unref(srcpad);
        srcpad = NULL;
 
@@ -312,38 +319,6 @@ _mmcamcorder_destroy_audio_pipeline(MMHandleType handle)
 }
 
 
-/**
- * This function operates each command on audio mode.
- *
- * @param      c               [in]    Handle of camcorder context.
- * @param      command [in]    command type received from Multimedia Framework.
- *
- * @return     This function returns MM_ERROR_NONE on success, or the other values
- *                     on error.
- * @remark
- * @see                _mmcamcorder_set_functions()
- *
- */
- /* ADDED BY SISO */
-
-
-void* _MMCamcorderStartHelperFunc(void *handle)
-{
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       _mmcamcorder_set_state((MMHandleType)hcamcorder, hcamcorder->target_state);
-
-       return NULL;
-}
-
-void* _MMCamcorderStopHelperFunc(void *handle)
-{
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       _mmcamcorder_set_state((MMHandleType)hcamcorder, hcamcorder->target_state);
-
-       return NULL;
-}
-
-
 int
 _mmcamcorder_audio_command(MMHandleType handle, int command)
 {
@@ -409,16 +384,21 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                                goto _ERR_CAMCORDER_AUDIO_COMMAND;
                        }
 
+                       SAFE_G_FREE(info->filename);
+
                        if (temp_filename) {
                                info->filename = g_strdup(temp_filename);
                                if (!info->filename) {
-                                       _mmcam_dbg_err("STRDUP was failed");
+                                       _mmcam_dbg_err("STRDUP was failed for [%s]", temp_filename);
                                        goto _ERR_CAMCORDER_AUDIO_COMMAND;
                                }
 
-                               _mmcam_dbg_log("Record start : set file name using attribute - %s\n ", info->filename);
+                               _mmcam_dbg_log("Record start : file name [%s]", info->filename);
 
                                MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", info->filename);
+                       } else {
+                               _mmcam_dbg_log("Recorded data will be written in [%s]", _MMCamcorder_FILENAME_NULL);
+                               MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", _MMCamcorder_FILENAME_NULL);
                        }
 
                        sc->ferror_send = FALSE;
@@ -458,7 +438,7 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                                        /* MSDOS_SUPER_MAGIC : 0x4d44 */
                                        if (file_system_type == MSDOS_SUPER_MAGIC &&
                                            (info->max_size == 0 || info->max_size > FAT32_FILE_SYSTEM_MAX_SIZE)) {
-                                               _mmcam_dbg_warn("FAT32 and too large max[%"G_GUINT64_FORMAT"], set max as %"G_GUINT64_FORMAT,
+                                               _mmcam_dbg_warn("FAT32 and too large max[%"G_GUINT64_FORMAT"], set max as %lu",
                                                        info->max_size, FAT32_FILE_SYSTEM_MAX_SIZE);
                                                info->max_size = FAT32_FILE_SYSTEM_MAX_SIZE;
                                        } else {
@@ -476,9 +456,10 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                                err = -1;
                        }
 
-                       if ((err == -1) || free_space <= (_MMCAMCORDER_AUDIO_MINIMUM_SPACE+(5*1024))) {
+                       if (temp_filename &&
+                               (err == -1 || free_space <= _MMCAMCORDER_AUDIO_MINIMUM_SPACE)) {
                                _mmcam_dbg_err("OUT of STORAGE [err:%d or free space [%" G_GUINT64_FORMAT "] is smaller than [%d]",
-                                       err, free_space, (_MMCAMCORDER_AUDIO_MINIMUM_SPACE+(5*1024)));
+                                       err, free_space, _MMCAMCORDER_AUDIO_MINIMUM_SPACE);
                                return MM_ERROR_OUT_OF_STORAGE;
                        }
                }
@@ -503,11 +484,11 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                        if (info->filesize > 0) {
                                break;
                        } else if (count == _MMCAMCORDER_RETRIAL_COUNT) {
-                               _mmcam_dbg_err("Pause fail, wait 200 ms, but file size is %lld",
+                               _mmcam_dbg_err("Pause fail, wait 200 ms, but file size is %"G_GUINT64_FORMAT,
                                        info->filesize);
                                return MM_ERROR_CAMCORDER_INVALID_CONDITION;
                        } else {
-                               _mmcam_dbg_warn("Wait for enough audio frame, retry count[%d], file size is %lld",
+                               _mmcam_dbg_warn("Wait for enough audio frame, retry count[%d], file size is %"G_GUINT64_FORMAT,
                                        count, info->filesize);
                        }
                        usleep(_MMCAMCORDER_FRAME_WAIT_TIME);
@@ -533,13 +514,12 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                if (ret != MM_ERROR_NONE)
                        goto _ERR_CAMCORDER_AUDIO_COMMAND;
 
-               if (info->bMuxing) {
+               if (info->bMuxing)
                        MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
-               } else {
+               else
                        MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", FALSE);
-               }
 
-               _mmcamcorder_gst_set_state(handle, sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, GST_STATE_NULL);
+               _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_NULL);
 
                sc->pipeline_time = 0;
                sc->pause_time = 0;
@@ -556,7 +536,7 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
        case _MMCamcorder_CMD_COMMIT:
        {
                int count = 0;
-
+               guint64 free_space = 0;
                _mmcam_dbg_log("_MMCamcorder_CMD_COMMIT");
 
                if (info->b_commiting) {
@@ -571,16 +551,23 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                        if (info->filesize > 0) {
                                break;
                        } else if (count == _MMCAMCORDER_RETRIAL_COUNT) {
-                               _mmcam_dbg_err("Commit fail, waited 200 ms, but file size is %lld", info->filesize);
+                               _mmcam_dbg_err("Commit fail, waited 200 ms, but file size is %"G_GUINT64_FORMAT, info->filesize);
                                        info->b_commiting = FALSE;
                                return MM_ERROR_CAMCORDER_INVALID_CONDITION;
                        } else {
-                               _mmcam_dbg_warn("Waiting for enough audio frame, re-count[%d], file size is %lld",
+                               _mmcam_dbg_warn("Waiting for enough audio frame, re-count[%d], file size is %"G_GUINT64_FORMAT,
                                        count, info->filesize);
                        }
                        usleep(_MMCAMCORDER_FRAME_WAIT_TIME);
                }
 
+               _mmcamcorder_get_freespace(hcamcorder->storage_info.type, &free_space);
+               if (free_space < _MMCAMCORDER_AUDIO_MINIMUM_SPACE) {
+                       _mmcam_dbg_warn("_MMCamcorder_CMD_COMMIT out of storage [%" G_GUINT64_FORMAT "]", free_space);
+                       ret = MM_ERROR_OUT_OF_STORAGE;
+                       goto _ERR_CAMCORDER_AUDIO_COMMAND;
+               }
+
                if (audioSrc) {
                        if (gst_element_send_event(audioSrc, gst_event_new_eos()) == FALSE) {
                                _mmcam_dbg_err("send EOS failed");
@@ -678,11 +665,10 @@ int _mmcamcorder_audio_handle_eos(MMHandleType handle)
 
        _mmcamcorder_send_message(handle, &msg);
 
-       if (info->bMuxing) {
+       if (info->bMuxing)
                MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
-       } else {
+       else
                MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", FALSE);
-       }
 
        _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_NULL);
 
@@ -951,11 +937,10 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa
                        _mmcam_dbg_warn("Free Space : [%" G_GUINT64_FORMAT "], file size : [%" G_GUINT64_FORMAT "]",
                                free_space, audioinfo->filesize);
 
-                       if (audioinfo->bMuxing) {
+                       if (audioinfo->bMuxing)
                                MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
-                       } else {
+                       else
                                MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", TRUE);
-                       }
 
                        sc->isMaxsizePausing = TRUE;
                        msg.id = MM_MESSAGE_CAMCORDER_NO_FREE_SPACE;
@@ -992,11 +977,10 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa
                        audioinfo->max_size, audioinfo->filesize, trailer_size);
 
                /* just same as pause status. After blocking two queue, this function will not call again. */
-               if (audioinfo->bMuxing) {
+               if (audioinfo->bMuxing)
                        MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
-               } else {
+               else
                        MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", TRUE);
-               }
 
                msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
                msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
@@ -1004,7 +988,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa
                msg.param.recording_status.remained_time = 0;
                _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
 
-               _mmcam_dbg_warn("Last filesize sent by message : %d", audioinfo->filesize + trailer_size);
+               _mmcam_dbg_warn("Last filesize sent by message : %"G_GUINT64_FORMAT, audioinfo->filesize + trailer_size);
 
                sc->isMaxsizePausing = TRUE;
                msg.id = MM_MESSAGE_CAMCORDER_MAX_SIZE;
@@ -1019,11 +1003,10 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa
                _mmcam_dbg_warn("Current time : [%" G_GUINT64_FORMAT "], Maximum time : [%" G_GUINT64_FORMAT "]", \
                        rec_pipe_time, audioinfo->max_time);
 
-               if (audioinfo->bMuxing) {
+               if (audioinfo->bMuxing)
                        MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
-               } else {
+               else
                        MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", TRUE);
-               }
 
                sc->isMaxtimePausing = TRUE;
                msg.id = MM_MESSAGE_CAMCORDER_TIME_LIMIT;
@@ -1123,7 +1106,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle)
 
                nread = fread(&buf, sizeof(char), sizeof(buf), f);
 
-               _mmcam_dbg_log("recorded file fread %d", nread);
+               _mmcam_dbg_log("recorded file fread %zu", nread);
 
                udta_size = _mmcamcorder_get_container_size(buf);