The user has no way to know when the interrupt is started.
This commit provides the interface for it.
[Version] 0.3.1
[Profile] Common
[Issue Type] Update
[Dependency module] N/A
[Test] [M(T) - Boot=(OK), sdb=(OK), Home=(OK), Touch=(OK), Version=tizen-unified_20170608.1]
Change-Id: If1e561f17137be98d46bf9f7707f81eb8317cbb2
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
typedef void (*recorder_interrupted_cb)(recorder_policy_e policy, recorder_state_e previous, recorder_state_e current, void *user_data);
/**
+ * @brief Called when the recorder interrupt is started by a policy.
+ * @since_tizen 4.0
+ * @param[in] policy The policy that is interrupting the recorder
+ * @param[in] state The current state of the recorder
+ * @param[in] user_data The user data passed from the callback registration function
+ * @see legacy_recorder_set_interrupt_started_cb()
+ */
+typedef void (*recorder_interrupt_started_cb)(recorder_policy_e policy, recorder_state_e state, void *user_data);
+
+/**
* @brief Called when audio stream data was being delivered just before storing in the recorded file.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @remarks The callback function holds the same buffer that will be recorded. \n
int legacy_recorder_unset_interrupted_cb(recorder_h recorder);
/**
+ * @brief Registers a callback function to be called when the media recorder interrupt is started according to a policy.
+ * @since_tizen 4.0
+ * @param[in] recorder The handle to the media recorder
+ * @param[in] callback The callback function to register
+ * @param[in] user_data The user data to be passed to the callback function
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #RECORDER_ERROR_NONE Successful
+ * @retval #RECORDER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see legacy_recorder_unset_interrupt_started_cb()
+ * @see legacy_recorder_interrupt_started_cb()
+ */
+int legacy_recorder_set_interrupt_started_cb(recorder_h recorder, recorder_interrupt_started_cb callback, void *user_data);
+
+/**
+ * @brief Unregisters the callback function.
+ * @since_tizen 4.0
+ * @param[in] recorder The handle to the media recorder
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #RECORDER_ERROR_NONE Successful
+ * @retval #RECORDER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see legacy_recorder_set_interrupt_started_cb()
+ */
+int legacy_recorder_unset_interrupt_started_cb(recorder_h recorder);
+
+/**
* @brief Registers a callback function to be called when audio stream data is being delivered.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @remarks This callback function holds the same buffer that will be recorded. \n
_RECORDER_EVENT_TYPE_AUDIO_STREAM,
_RECORDER_EVENT_TYPE_MUXED_STREAM,
_RECORDER_EVENT_TYPE_ERROR,
+ _RECORDER_EVENT_TYPE_INTERRUPT_STARTED,
_RECORDER_EVENT_TYPE_NUM
} _recorder_event_e;
static int __mm_recorder_msg_cb(int message, void *param, void *user_data)
{
- recorder_s * handle = (recorder_s *)user_data;
+ recorder_s *handle = (recorder_s *)user_data;
MMMessageParamType *m = (MMMessageParamType *)param;
recorder_state_e previous_state;
recorder_recording_limit_type_e type;
+ recorder_policy_e policy = RECORDER_POLICY_NONE;
int recorder_error = 0;
switch (message) {
previous_state = handle->state;
handle->state = __recorder_state_convert(m->state.current, m->state.previous);
- recorder_policy_e policy = RECORDER_POLICY_NONE;
+
if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM) {
switch (m->state.code) {
case MM_MSG_CODE_INTERRUPTED_BY_CALL_START:
}
break;
}
+ case MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_ASM:
+ case MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_SECURITY:
+ case MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_RM:
+ if (handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]) {
+ if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_ASM)
+ policy = RECORDER_POLICY_SOUND;
+ else if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_SECURITY)
+ policy = RECORDER_POLICY_SECURITY;
+ else if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_RM)
+ policy = RECORDER_POLICY_RESOURCE_CONFLICT;
+
+ LOGW("message 0x%x -> policy %d", message, policy);
+
+ if (policy != RECORDER_POLICY_NONE) {
+ ((recorder_interrupt_started_cb)handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED])(policy,
+ handle->state, handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]);
+ }
+ }
+ break;
case MM_MESSAGE_CAMCORDER_MAX_SIZE:
case MM_MESSAGE_CAMCORDER_NO_FREE_SPACE:
case MM_MESSAGE_CAMCORDER_TIME_LIMIT:
}
+int legacy_recorder_set_interrupt_started_cb(recorder_h recorder, recorder_interrupt_started_cb callback, void *user_data)
+{
+ recorder_s *handle = (recorder_s *)recorder;
+
+ if (recorder == NULL) {
+ LOGE("NULL pointer handle");
+ return RECORDER_ERROR_INVALID_PARAMETER;
+ }
+ if (callback == NULL) {
+ LOGE("NULL pointer callback");
+ return RECORDER_ERROR_INVALID_PARAMETER;
+ }
+
+ handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = callback;
+ handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = user_data;
+
+ return RECORDER_ERROR_NONE;
+}
+
+
+int legacy_recorder_unset_interrupt_started_cb(recorder_h recorder)
+{
+ recorder_s *handle = (recorder_s *)recorder;
+
+ if (recorder == NULL) {
+ LOGE("NULL pointer handle");
+ return RECORDER_ERROR_INVALID_PARAMETER;
+ }
+
+ handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
+ handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
+
+ return RECORDER_ERROR_NONE;
+}
+
+
int legacy_recorder_set_audio_stream_cb(recorder_h recorder, recorder_audio_stream_cb callback, void* user_data)
{
int ret = MM_ERROR_NONE;
MUSE_RECORDER_API_GET_DEVICE_STATE,
MUSE_RECORDER_API_SET_MUXED_STREAM_CB,
MUSE_RECORDER_API_UNSET_MUXED_STREAM_CB, /* 65 */
+ MUSE_RECORDER_API_SET_INTERRUPT_STARTED_CB,
+ MUSE_RECORDER_API_UNSET_INTERRUPT_STARTED_CB,
MUSE_RECORDER_API_MAX
} muse_recorder_api_e;
MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_FILE_FORMAT,
MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_ENCODER,
MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_RESOLUTION,
+ MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED,
MUSE_RECORDER_EVENT_TYPE_NUM
} muse_recorder_event_e;
return;
}
+void _recorder_disp_interrupt_started_cb(recorder_policy_e policy, recorder_state_e state, void *user_data)
+{
+ muse_module_h module = (muse_module_h)user_data;
+
+ if (module == NULL) {
+ LOGE("NULL module");
+ return;
+ }
+
+ muse_recorder_msg_event2(MUSE_RECORDER_CB_EVENT,
+ MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED,
+ MUSE_RECORDER_EVENT_CLASS_THREAD_MAIN,
+ module,
+ INT, policy,
+ INT, state);
+
+ return;
+}
+
void _recorder_disp_error_cb(recorder_error_e error, recorder_state_e current_state, void *user_data)
{
muse_module_h module = (muse_module_h)user_data;
return MUSE_RECORDER_ERROR_NONE;
}
+int recorder_dispatcher_set_interrupt_started_cb(muse_module_h module)
+{
+ int ret = RECORDER_ERROR_NONE;
+ muse_recorder_api_e api = MUSE_RECORDER_API_SET_INTERRUPT_STARTED_CB;
+ muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_IMMEDIATE;
+ muse_recorder_handle_s *muse_recorder = NULL;
+
+ muse_recorder = (muse_recorder_handle_s *)muse_core_ipc_get_handle(module);
+ if (muse_recorder == NULL) {
+ LOGE("NULL handle");
+ ret = RECORDER_ERROR_INVALID_OPERATION;
+ muse_recorder_msg_return(api, class, ret, module);
+ return MUSE_RECORDER_ERROR_NONE;
+ }
+
+ ret = legacy_recorder_set_interrupt_started_cb(muse_recorder->recorder_handle,
+ (recorder_interrupt_started_cb)_recorder_disp_interrupt_started_cb,
+ (void *)module);
+
+ muse_recorder_msg_return(api, class, ret, module);
+
+ return MUSE_RECORDER_ERROR_NONE;
+}
+
+int recorder_dispatcher_unset_interrupt_started_cb(muse_module_h module)
+{
+ int ret = RECORDER_ERROR_NONE;
+ muse_recorder_api_e api = MUSE_RECORDER_API_UNSET_INTERRUPT_STARTED_CB;
+ muse_recorder_api_class_e class = MUSE_RECORDER_API_CLASS_IMMEDIATE;
+ muse_recorder_handle_s *muse_recorder = NULL;
+
+ muse_recorder = (muse_recorder_handle_s *)muse_core_ipc_get_handle(module);
+ if (muse_recorder == NULL) {
+ LOGE("NULL handle");
+ ret = RECORDER_ERROR_INVALID_OPERATION;
+ muse_recorder_msg_return(api, class, ret, module);
+ return MUSE_RECORDER_ERROR_NONE;
+ }
+
+ ret = legacy_recorder_unset_interrupt_started_cb(muse_recorder->recorder_handle);
+
+ muse_recorder_msg_return(api, class, ret, module);
+
+ return MUSE_RECORDER_ERROR_NONE;
+}
+
int recorder_dispatcher_set_audio_stream_cb(muse_module_h module)
{
int ret = RECORDER_ERROR_NONE;
recorder_dispatcher_set_sound_stream_info, /* MUSE_RECORDER_API_SET_SOUND_STREAM_INFO */
recorder_dispatcher_get_device_state, /* MUSE_RECORDER_API_GET_DEVICE_STATE */
recorder_dispatcher_set_muxed_stream_cb, /* MUSE_RECORDER_API_SET_MUXED_STREAM_CB */
- recorder_dispatcher_unset_muxed_stream_cb /* MUSE_RECORDER_API_UNSET_MUXED_STREAM_CB */
+ recorder_dispatcher_unset_muxed_stream_cb, /* MUSE_RECORDER_API_UNSET_MUXED_STREAM_CB */
+ recorder_dispatcher_set_interrupt_started_cb, /* MUSE_RECORDER_API_SET_INTERRUPT_STARTED_CB */
+ recorder_dispatcher_unset_interrupt_started_cb /* MUSE_RECORDER_API_UNSET_INTERRUPT_STARTED_CB */
};
return MUSE_RECORDER_ERROR_NONE;
}
- storage_state = (int)muse_core_client_get_cust_data(module);
+ storage_state = (int)(long)muse_core_client_get_cust_data(module);
LOGW("storage state %d", storage_state);
Name: mmsvc-recorder
Summary: A Recorder module for muse server
-Version: 0.3.0
-Release: 2
+Version: 0.3.1
+Release: 0
Group: Multimedia/Libraries
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz