summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeongmo Yang <jm80.yang@samsung.com>2018-05-08 17:19:12 +0900
committerJeongmo Yang <jm80.yang@samsung.com>2018-05-08 19:58:32 +0900
commit8c6c6ac5cd41d1a0d55fe5be2ddf64a97d0a7512 (patch)
treec23565e8e777a3da90ed80624842c143a30e412e
parent0a2c79fac3c6e890634282c40ac811c1df14d040 (diff)
parent0a24fe951462c81b7ffca80235179dcb89be9a42 (diff)
downloadrecorder-8c6c6ac5cd41d1a0d55fe5be2ddf64a97d0a7512.tar.gz
recorder-8c6c6ac5cd41d1a0d55fe5be2ddf64a97d0a7512.tar.bz2
recorder-8c6c6ac5cd41d1a0d55fe5be2ddf64a97d0a7512.zip
Merge branch 'tizen' into tizen_line_coverage
Change-Id: I9dae424b54378c86d637e42dfccea92d03389217
-rw-r--r--CMakeLists.txt2
-rw-r--r--capi-media-recorder-tool.manifest5
-rw-r--r--doc/recorder_doc.h26
-rw-r--r--include/recorder.h4
-rw-r--r--include/recorder_private.h1
-rw-r--r--packaging/capi-media-recorder.spec27
-rw-r--r--src/recorder.c161
-rw-r--r--test/recorder_test.c8
8 files changed, 175 insertions, 59 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 257929d..7acb542 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,9 +71,7 @@ CONFIGURE_FILE(
)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
-IF(TIZEN_FEATURE_TESTSUITE)
ADD_SUBDIRECTORY(test)
-ENDIF(TIZEN_FEATURE_TESTSUITE)
IF(UNIX)
diff --git a/capi-media-recorder-tool.manifest b/capi-media-recorder-tool.manifest
new file mode 100644
index 0000000..a76fdba
--- /dev/null
+++ b/capi-media-recorder-tool.manifest
@@ -0,0 +1,5 @@
+<manifest>
+ <request>
+ <domain name="_" />
+ </request>
+</manifest>
diff --git a/doc/recorder_doc.h b/doc/recorder_doc.h
index a6d9834..25d08d5 100644
--- a/doc/recorder_doc.h
+++ b/doc/recorder_doc.h
@@ -58,43 +58,43 @@
* <td> recorder_create_videorecorder()<br>recorder_create_audiorecorder() </td>
* <td> NONE </td>
* <td> CREATED </td>
- * <td> ASYNC </td>
+ * <td> SYNC </td>
* </tr>
* <tr>
* <td> recorder_destroy() </td>
* <td> CREATED </td>
* <td> NONE </td>
- * <td> ASYNC </td>
+ * <td> SYNC </td>
* </tr>
* <tr>
* <td> recorder_prepare() </td>
* <td> CREATED </td>
* <td> READY</td>
- * <td> ASYNC </td>
+ * <td> SYNC </td>
* </tr>
* <tr>
* <td> recorder_unprepare() </td>
* <td> READY </td>
* <td> CREATED </td>
- * <td> ASYNC </td>
+ * <td> SYNC </td>
* </tr>
* <tr>
* <td> recorder_start() </td>
* <td> READY / PAUSED </td>
* <td> RECORDING </td>
- * <td> ASYNC </td>
+ * <td> SYNC </td>
* </tr>
* <tr>
* <td> recorder_pause() </td>
* <td> RECORDING </td>
* <td> PAUSED </td>
- * <td> ASYNC </td>
+ * <td> SYNC </td>
* </tr>
* <tr>
* <td> recorder_cancel() <br>recorder_commit() </td>
* <td> RECORDING / PAUSED </td>
* <td> READY </td>
- * <td> ASYNC </td>
+ * <td> SYNC </td>
* </tr>
* </table>
* </div>
@@ -154,8 +154,8 @@
*
* @section CAPI_MEDIA_RECORDER_MODULE_FEATURE Related Features
* This API is related with the following features:\n
- * - http://tizen.org/feature/camera\n
- * - http://tizen.org/feature/microphone
+ * - http://tizen.org/feature/media.audio_recording\n
+ * - http://tizen.org/feature/media.video_recording
*
* It is recommended to design feature related codes in your application for reliability.\n
* You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n
@@ -191,8 +191,8 @@
*
* @section CAPI_MEDIA_RECORDER_ATTRIBUTES_MODULE_FEATURE Related Features
* This API is related with the following features:\n
- * - http://tizen.org/feature/camera\n
- * - http://tizen.org/feature/microphone
+ * - http://tizen.org/feature/media.audio_recording\n
+ * - http://tizen.org/feature/media.video_recording
*
* It is recommended to design feature related codes in your application for reliability.\n
* You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n
@@ -219,8 +219,8 @@
*
* @section CAPI_MEDIA_RECORDER_CAPABILITY_MODULE_FEATURE Related Features
* This API is related with the following features:\n
- * - http://tizen.org/feature/camera\n
- * - http://tizen.org/feature/microphone
+ * - http://tizen.org/feature/media.audio_recording\n
+ * - http://tizen.org/feature/media.video_recording
*
* It is recommended to design feature related codes in your application for reliability.\n
* You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n
diff --git a/include/recorder.h b/include/recorder.h
index f64c79d..1cda6ad 100644
--- a/include/recorder.h
+++ b/include/recorder.h
@@ -390,6 +390,8 @@ typedef bool (*recorder_supported_video_encoder_cb)(recorder_video_codec_e codec
* #CAMERA_STATE_CAPTURED -> #RECORDER_STATE_READY
* @remarks The privilege %http://tizen.org/privilege/recorder is not required since 4.0,\n
* but it is required in all earlier versions.
+ * @remarks Since 4.0, It's related to the following feature: %http://tizen.org/feature/media.video_recording \n
+ * instead of using %http://tizen.org/feature/microphone
* @param[in] camera The handle to the camera
* @param[out] recorder A handle to the recorder
* @return @c 0 on success, otherwise a negative error value
@@ -412,6 +414,8 @@ int recorder_create_videorecorder(camera_h camera, recorder_h *recorder);
* @remarks You must release @a recorder using recorder_destroy().
* @remarks The privilege %http://tizen.org/privilege/recorder is not required since 4.0,\n
* but it is required in all earlier versions.
+ * @remarks Since 4.0, It's related to the following feature: %http://tizen.org/feature/media.audio_recording \n
+ * instead of using %http://tizen.org/feature/microphone
* @param[out] recorder A handle to the recorder
* @return @c 0 on success, otherwise a negative error value
* @retval #RECORDER_ERROR_NONE Successful
diff --git a/include/recorder_private.h b/include/recorder_private.h
index 9955a9a..1e56eaf 100644
--- a/include/recorder_private.h
+++ b/include/recorder_private.h
@@ -108,6 +108,7 @@ typedef struct _recorder_cb_info_s {
/* user callback */
gpointer user_cb[MUSE_RECORDER_EVENT_TYPE_NUM];
gpointer user_data[MUSE_RECORDER_EVENT_TYPE_NUM];
+ GMutex user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_NUM];
/* tbm */
tbm_bufmgr bufmgr;
diff --git a/packaging/capi-media-recorder.spec b/packaging/capi-media-recorder.spec
index d9a48b2..109cb9d 100644
--- a/packaging/capi-media-recorder.spec
+++ b/packaging/capi-media-recorder.spec
@@ -1,7 +1,7 @@
Name: capi-media-recorder
Summary: A Recorder API
-Version: 0.3.5
-Release: 0
+Version: 0.3.9
+Release: 2
Group: Multimedia/API
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz
@@ -39,18 +39,21 @@ Requires: %{name} = %{version}-%{release}
Development related files for a Recorder library in Tizen Native API.
+%package tool
+Summary: A recorder API testsuite
+Requires: %{name} = %{version}-%{release}
+
+%description tool
+Tizen Native recorder API testsuite.
+
+
%prep
%setup -q
%build
MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
-%cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} \
-%if "%{TIZEN_PRODUCT_TV}" != "1"
- -DTIZEN_FEATURE_TESTSUITE=On
-%else
- -DTIZEN_FEATURE_TESTSUITE=Off
-%endif
+%cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
make %{?jobs:-j%jobs}
@@ -69,11 +72,13 @@ rm -rf %{buildroot}
%manifest capi-media-recorder.manifest
%license LICENSE.APLv2
%{_libdir}/libcapi-media-recorder.so.*
-%if "%{TIZEN_PRODUCT_TV}" != "1"
-%{_bindir}/*
-%endif
%files devel
%{_includedir}/media/recorder.h
%{_libdir}/pkgconfig/*.pc
%{_libdir}/libcapi-media-recorder.so
+
+%files tool
+%manifest capi-media-recorder-tool.manifest
+%license LICENSE.APLv2
+%{_bindir}/*
diff --git a/src/recorder.c b/src/recorder.c
index 54ec1a6..2433b7b 100644
--- a/src/recorder.c
+++ b/src/recorder.c
@@ -170,9 +170,17 @@ static void _recorder_client_user_callback(recorder_cb_info_s *cb_info, char *re
/*LOGD("get recorder msg %s, event %d", recv_msg, event);*/
+ g_mutex_lock(&cb_info->user_cb_mutex[event]);
+
if (cb_info->user_cb[event] == NULL) {
- LOGW("user callback for event %d is not set", event);
- return;
+ if (event != MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM &&
+ event != MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM) {
+ g_mutex_unlock(&cb_info->user_cb_mutex[event]);
+ LOGW("NULL callback for event %d, return here", event);
+ return;
+ } else {
+ LOGW("NULL callback for event %d, NOT return here", event);
+ }
}
switch (event) {
@@ -276,25 +284,23 @@ static void _recorder_client_user_callback(recorder_cb_info_s *cb_info, char *re
break;
}
- if (!_recorder_import_tbm_key(cb_info->bufmgr, tbm_key, &bo, &bo_handle)) {
- LOGE("tbm key %d import failed", tbm_key);
- break;
- }
+ if (cb_info->user_cb[event]) {
+ if (_recorder_import_tbm_key(cb_info->bufmgr, tbm_key, &bo, &bo_handle)) {
+ muse_recorder_msg_get(size, recv_msg);
+ muse_recorder_msg_get(format, recv_msg);
+ muse_recorder_msg_get(channel, recv_msg);
+ muse_recorder_msg_get(timestamp, recv_msg);
- muse_recorder_msg_get(size, recv_msg);
- muse_recorder_msg_get(format, recv_msg);
- muse_recorder_msg_get(channel, recv_msg);
- muse_recorder_msg_get(timestamp, recv_msg);
-
- ((recorder_audio_stream_cb)cb_info->user_cb[event])((void *)bo_handle.ptr,
- size,
- (audio_sample_type_e)format,
- channel,
- (unsigned int)timestamp,
- cb_info->user_data[event]);
+ ((recorder_audio_stream_cb)cb_info->user_cb[event])((void *)bo_handle.ptr,
+ size, (audio_sample_type_e)format, channel,
+ (unsigned int)timestamp, cb_info->user_data[event]);
- /* release imported bo */
- _recorder_release_imported_bo(&bo);
+ /* release imported bo */
+ _recorder_release_imported_bo(&bo);
+ } else {
+ LOGE("tbm key %d import failed", tbm_key);
+ }
+ }
/* return buffer */
send_msg = muse_core_msg_new(MUSE_RECORDER_API_RETURN_BUFFER,
@@ -322,19 +328,20 @@ static void _recorder_client_user_callback(recorder_cb_info_s *cb_info, char *re
break;
}
- if (!_recorder_import_tbm_key(cb_info->bufmgr, tbm_key, &bo, &bo_handle)) {
- LOGE("tbm key %d import failed", tbm_key);
- break;
- }
+ if (cb_info->user_cb[event]) {
+ if (_recorder_import_tbm_key(cb_info->bufmgr, tbm_key, &bo, &bo_handle)) {
+ muse_recorder_msg_get(size, recv_msg);
+ muse_recorder_msg_get(offset, recv_msg);
- muse_recorder_msg_get(size, recv_msg);
- muse_recorder_msg_get(offset, recv_msg);
+ ((recorder_muxed_stream_cb)cb_info->user_cb[event])((void *)bo_handle.ptr,
+ size, (unsigned long long)offset, cb_info->user_data[event]);
- ((recorder_muxed_stream_cb)cb_info->user_cb[event])((void *)bo_handle.ptr,
- size, (unsigned long long)offset, cb_info->user_data[event]);
-
- /* release imported bo */
- _recorder_release_imported_bo(&bo);
+ /* release imported bo */
+ _recorder_release_imported_bo(&bo);
+ } else {
+ LOGE("tbm key %d import failed", tbm_key);
+ }
+ }
/* return buffer */
send_msg = muse_core_msg_new(MUSE_RECORDER_API_RETURN_BUFFER,
@@ -428,6 +435,8 @@ static void _recorder_client_user_callback(recorder_cb_info_s *cb_info, char *re
}
}
+ g_mutex_unlock(&cb_info->user_cb_mutex[event]);
+
return;
}
@@ -505,6 +514,20 @@ static void _recorder_deactivate_idle_event_all(recorder_cb_info_s *cb_info)
continue;
}
+ if (g_idle_remove_by_data(rec_idle_event)) {
+ LOGW("remove idle event %p done", rec_idle_event);
+
+ cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)rec_idle_event);
+
+ g_mutex_clear(&rec_idle_event->event_mutex);
+ g_free(rec_idle_event);
+ rec_idle_event = NULL;
+
+ continue;
+ }
+
+ LOGW("remove idle event %p failed", rec_idle_event);
+
if (!g_mutex_trylock(&rec_idle_event->event_mutex)) {
LOGW("lock failed, %p event is calling now", rec_idle_event);
@@ -1027,6 +1050,11 @@ static void *_recorder_msg_recv_func(gpointer data)
LOGW("incompleted message [len %d]", remained_length);
+ if (remained_msg) {
+ free(remained_msg);
+ remained_msg = NULL;
+ }
+
remained_msg = (char *)malloc(remained_length + 1);
if (remained_msg) {
strncpy(remained_msg, recv_msg + prev_pos, remained_length);
@@ -1190,6 +1218,9 @@ static recorder_cb_info_s *_recorder_client_callback_new(gint sockfd)
g_mutex_init(&cb_info->idle_event_mutex);
g_cond_init(&cb_info->idle_event_cond);
+ for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++)
+ g_mutex_init(&cb_info->user_cb_mutex[i]);
+
/* message handler thread */
if (!__create_msg_handler_thread(&cb_info->msg_handler_info,
_RECORDER_MESSAGE_HANDLER_TYPE_GENERAL, "recorder_msg_handler", cb_info)) {
@@ -1232,6 +1263,9 @@ ErrorExit:
__destroy_msg_handler_thread(&cb_info->audio_stream_cb_info);
__destroy_msg_handler_thread(&cb_info->muxed_stream_cb_info);
+ for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++)
+ g_mutex_clear(&cb_info->user_cb_mutex[i]);
+
g_mutex_clear(&cb_info->idle_event_mutex);
g_cond_clear(&cb_info->idle_event_cond);
@@ -1415,6 +1449,9 @@ static void _recorder_client_callback_destroy(recorder_cb_info_s *cb_info)
__destroy_msg_handler_thread(&cb_info->audio_stream_cb_info);
__destroy_msg_handler_thread(&cb_info->muxed_stream_cb_info);
+ for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++)
+ g_mutex_clear(&cb_info->user_cb_mutex[i]);
+
g_mutex_clear(&cb_info->idle_event_mutex);
g_cond_clear(&cb_info->idle_event_cond);
@@ -2307,8 +2344,12 @@ int recorder_set_state_changed_cb(recorder_h recorder, recorder_state_changed_cb
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE]);
}
LOGD("ret : 0x%x", ret);
@@ -2333,8 +2374,12 @@ int recorder_unset_state_changed_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE]);
}
LOGD("ret : 0x%x", ret);
@@ -2359,8 +2404,12 @@ int recorder_set_interrupted_cb(recorder_h recorder, recorder_interrupted_cb cal
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED]);
}
LOGD("ret : 0x%x", ret);
@@ -2385,8 +2434,12 @@ int recorder_unset_interrupted_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPTED]);
}
LOGD("ret : 0x%x", ret);
@@ -2411,8 +2464,12 @@ int recorder_set_interrupt_started_cb(recorder_h recorder, recorder_interrupt_st
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]);
}
LOGD("ret : 0x%x", ret);
@@ -2437,8 +2494,12 @@ int recorder_unset_interrupt_started_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]);
}
LOGD("ret : 0x%x", ret);
@@ -2463,8 +2524,12 @@ int recorder_set_audio_stream_cb(recorder_h recorder, recorder_audio_stream_cb c
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM]);
}
LOGD("ret : 0x%x", ret);
@@ -2489,8 +2554,12 @@ int recorder_unset_audio_stream_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM]);
}
LOGD("ret : 0x%x", ret);
@@ -2515,8 +2584,12 @@ int recorder_set_muxed_stream_cb(recorder_h recorder, recorder_muxed_stream_cb c
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM]);
}
LOGD("ret : 0x%x", ret);
@@ -2541,8 +2614,12 @@ int recorder_unset_muxed_stream_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM]);
}
LOGD("ret : 0x%x", ret);
@@ -2567,8 +2644,12 @@ int recorder_set_error_cb(recorder_h recorder, recorder_error_cb callback, void
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_ERROR]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_ERROR] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_ERROR] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_ERROR]);
}
LOGD("ret : 0x%x", ret);
@@ -2593,8 +2674,12 @@ int recorder_unset_error_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_ERROR]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_ERROR] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_ERROR] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_ERROR]);
}
LOGD("ret : 0x%x", ret);
@@ -2619,8 +2704,12 @@ int recorder_set_recording_status_cb(recorder_h recorder, recorder_recording_sta
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS]);
}
LOGD("ret : 0x%x", ret);
@@ -2645,8 +2734,12 @@ int recorder_unset_recording_status_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS]);
}
LOGD("ret : 0x%x", ret);
@@ -2669,8 +2762,12 @@ int recorder_set_recording_limit_reached_cb(recorder_h recorder, recorder_record
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = callback;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = user_data;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED]);
}
LOGD("ret : 0x%x", ret);
@@ -2695,8 +2792,12 @@ int recorder_unset_recording_limit_reached_cb(recorder_h recorder)
_recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
if (ret == RECORDER_ERROR_NONE) {
+ g_mutex_lock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED]);
+
pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = NULL;
pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = NULL;
+
+ g_mutex_unlock(&pc->cb_info->user_cb_mutex[MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED]);
}
LOGD("ret : 0x%x", ret);
diff --git a/test/recorder_test.c b/test/recorder_test.c
index ce48d36..c3d0bab 100644
--- a/test/recorder_test.c
+++ b/test/recorder_test.c
@@ -325,7 +325,7 @@ static void _recording_muxed_stream_cb(void *stream, int size, unsigned long lon
g_print("\tRECORDING MUXED STREAM CB - %p, size %d, offset %llu\n", stream, size, offset);
if (stream && size > 0) {
- if (access(TARGET_FILENAME_MUXED_CB, F_OK))
+ if (offset == 0)
fp = fopen(TARGET_FILENAME_MUXED_CB, "w");
else
fp = fopen(TARGET_FILENAME_MUXED_CB, "rb+");
@@ -335,9 +335,11 @@ static void _recording_muxed_stream_cb(void *stream, int size, unsigned long lon
g_print("\tback to %llu\n", offset);
}
- fseeko(fp, (off_t)offset, SEEK_SET);
+ if (fseeko(fp, (off_t)offset, SEEK_SET) == 0)
+ fwrite(stream, 1, size, fp);
+ else
+ g_print("\nSeek Error : offset %llu\n", offset);
- fwrite(stream, 1, size, fp);
fclose(fp);
fp = NULL;
} else {