2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <camera_internal.h>
23 #include <sound_manager.h>
24 #include <sound_manager_internal.h>
26 #include <storage-internal.h>
27 #include <muse_recorder.h>
28 #include <muse_recorder_msg.h>
29 #include <muse_core.h>
30 #include <muse_client.h>
31 #include <recorder_private.h>
34 #include <tzplatform_config.h>
36 #define MODULE_NAME "recorder"
39 /* for device changed callback */
40 static GMutex g_rec_dev_state_changed_cb_lock;
41 static GList *g_rec_dev_state_changed_cb_list;
42 static int g_rec_dev_state_changed_cb_id;
43 static GDBusConnection *g_rec_dev_state_changed_cb_conn;
44 static guint g_rec_dev_state_changed_cb_subscribe_id;
45 static GMutex g_rec_idle_event_lock;
48 static int g_recorder_log_level;
51 static void __recorder_update_api_waiting(recorder_cb_info_s *cb_info, int api, int value)
54 api < 0 || api >= MUSE_RECORDER_API_MAX) {
55 REC_LOG_ERROR("invalid param[%p][%d]", cb_info, api);
59 g_mutex_lock(&(cb_info->api_mutex[api]));
60 cb_info->api_waiting[api] += value;
61 g_mutex_unlock(&(cb_info->api_mutex[api]));
63 REC_LOG_DEBUG("api[%d], value[%d], waiting[%d]",
64 api, value, cb_info->api_waiting[api]);
70 static void __recorder_device_state_changed_cb(GDBusConnection *connection,
71 const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
72 const gchar *signal_name, GVariant *param, gpointer user_data)
75 recorder_type_e type = RECORDER_TYPE_AUDIO;
76 recorder_device_state_e state = RECORDER_DEVICE_STATE_IDLE;
77 GList *tmp_list = NULL;
78 recorder_cb_info *info = NULL;
80 g_mutex_lock(&g_rec_dev_state_changed_cb_lock);
82 if (!g_rec_dev_state_changed_cb_list || !param) {
83 REC_LOG_WARNING("no callback or NULL param[%p]", param);
87 /* get device type and state */
88 g_variant_get(param, "(i)", &value);
91 state = 0x0000ffff & value;
93 REC_LOG_INFO("type[%d], state[%d]", type, state);
95 tmp_list = g_rec_dev_state_changed_cb_list;
98 info = (recorder_cb_info *)tmp_list->data;
101 if (info->callback) {
102 REC_LOG_INFO("start id[%d] callback", info->id);
103 ((recorder_device_state_changed_cb)info->callback)(type, state, info->user_data);
104 REC_LOG_INFO("returned id[%d] callback", info->id);
106 REC_LOG_WARNING("NULL callback for id[%d]", info->id);
110 tmp_list = tmp_list->next;
114 g_mutex_unlock(&g_rec_dev_state_changed_cb_lock);
120 static int _recorder_import_tbm_fd(tbm_bufmgr bufmgr, int fd, tbm_bo *bo, tbm_bo_handle *bo_handle)
122 tbm_bo tmp_bo = NULL;
123 tbm_bo_handle tmp_bo_handle = {NULL, };
125 if (bufmgr == NULL || bo == NULL || bo_handle == NULL || fd < 0) {
126 REC_LOG_ERROR("invalid parameter - bufmgr[%p], bo[%p], bo_handle[%p], fd[%d]",
127 bufmgr, bo, bo_handle, fd);
131 tmp_bo = tbm_bo_import_fd(bufmgr, (tbm_fd)fd);
132 if (tmp_bo == NULL) {
133 REC_LOG_ERROR("bo import failed - bufmgr[%p], fd[%d]", bufmgr, fd);
137 tmp_bo_handle = tbm_bo_map(tmp_bo, TBM_DEVICE_CPU, TBM_OPTION_READ);
138 if (tmp_bo_handle.ptr == NULL) {
139 REC_LOG_ERROR("bo map failed[%p]", tmp_bo);
140 tbm_bo_unref(tmp_bo);
145 /* set bo and bo_handle */
147 *bo_handle = tmp_bo_handle;
149 REC_LOG_VERBOSE("import fd[%d] -> bo[%p]", fd, tmp_bo);
154 static void _recorder_release_imported_bo(tbm_bo *bo)
156 if (bo == NULL || *bo == NULL) {
157 REC_LOG_WARNING("NULL bo");
161 REC_LOG_VERBOSE("release bo[%p]", *bo);
170 static void _recorder_event_handler_video_encode_decision(recorder_cb_info_s *cb_info, char *recv_msg, int *tfd)
173 int event = MUSE_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION;
175 int num_buffer_fd = 0;
176 bool do_encode = true;
179 tbm_bo buffer_bo[BUFFER_MAX_PLANE_NUM] = {NULL, };
180 tbm_bo_handle bo_handle = {.ptr = NULL};
181 tbm_bo_handle buffer_bo_handle[BUFFER_MAX_PLANE_NUM] = {{.ptr = NULL}, };
182 tbm_bo data_bo = NULL;
183 tbm_bo_handle data_bo_handle = {.ptr = NULL};
185 recorder_video_data_s frame;
186 MMCamcorderVideoStreamDataType *stream = NULL;
188 char *send_msg = NULL;
190 /* tfd[0]: MMCamcorderVideoStreamDataType
191 tfd[1]: data_bo or zero copy bo[0]
192 tfd[2]: zero copy bo[1]
193 tfd[3]: zero copy bo[2] */
194 if (!tfd || tfd[0] < 0) {
195 REC_LOG_ERROR("invalid fd[%d]", tfd ? tfd[0] : 0);
199 muse_recorder_msg_get(video_fd, recv_msg);
200 muse_recorder_msg_get(num_buffer_fd, recv_msg);
202 REC_LOG_DEBUG("video_fd[%d], num_buffer_fd[%d], tfd[%d/%d/%d/%d]",
203 video_fd, num_buffer_fd, tfd[0], tfd[1], tfd[2], tfd[3]);
205 memset(&frame, 0x0, sizeof(recorder_video_data_s));
207 if (num_buffer_fd < 0 || num_buffer_fd > BUFFER_MAX_PLANE_NUM) {
208 REC_LOG_ERROR("invalid num buffer fd[%d]", num_buffer_fd);
209 goto _VIDEO_ENCODE_DECISION_CB_HANDLER_DONE;
212 /* import tbm bo and get virtual address */
213 if (!_recorder_import_tbm_fd(cb_info->bufmgr, tfd[0], &bo, &bo_handle)) {
214 REC_LOG_ERROR("failed to import fd[%d]", tfd[0]);
215 goto _VIDEO_ENCODE_DECISION_CB_HANDLER_DONE;
218 if (num_buffer_fd == 0 && tfd[1] >= 0) {
219 /* import tbm data_bo and get virtual address */
220 if (!_recorder_import_tbm_fd(cb_info->bufmgr, tfd[1], &data_bo, &data_bo_handle)) {
221 REC_LOG_ERROR("failed to import data fd[%d]", tfd[1]);
222 goto _VIDEO_ENCODE_DECISION_CB_HANDLER_DONE;
226 /* get stream info */
227 stream = (MMCamcorderVideoStreamDataType *)bo_handle.ptr;
229 for (i = 0 ; i < num_buffer_fd ; i++) {
230 /* import buffer bo and get virtual address */
231 if (!_recorder_import_tbm_fd(cb_info->bufmgr, tfd[i + 1], &buffer_bo[i], &buffer_bo_handle[i])) {
232 REC_LOG_ERROR("failed to import buffer fd[%d]", tfd[i + 1]);
233 goto _VIDEO_ENCODE_DECISION_CB_HANDLER_DONE;
237 if (cb_info->user_cb[event]) {
238 camera_create_preview_frame(stream, num_buffer_fd, buffer_bo_handle, &data_bo_handle, &frame);
239 do_encode = ((recorder_video_encode_decision_cb)cb_info->user_cb[event])(&frame, cb_info->user_data[event]);
242 _VIDEO_ENCODE_DECISION_CB_HANDLER_DONE:
244 send_msg = muse_core_msg_new(MUSE_RECORDER_API_RETURN_BUFFER,
245 MUSE_TYPE_INT, "ret_fd", video_fd,
246 MUSE_TYPE_INT, "buffer_type", MUSE_RECORDER_BUFFER_TYPE_VIDEO_ENCODE_DECISION,
247 MUSE_TYPE_INT, "video_encode_decision", (int)do_encode,
250 if (muse_core_msg_send(cb_info->fd, send_msg) <= 0)
251 REC_LOG_ERROR("sending message failed");
253 muse_core_msg_free(send_msg);
256 REC_LOG_ERROR("failed to create send msg for fd[%d]", tfd[0]);
259 /* release imported bo and fd */
260 for (i = 0 ; i < num_buffer_fd && i < BUFFER_MAX_PLANE_NUM ; i++)
261 _recorder_release_imported_bo(&buffer_bo[i]);
263 /* unmap and unref tbm bo */
265 _recorder_release_imported_bo(&data_bo);
267 _recorder_release_imported_bo(&bo);
269 /* close imported fd */
270 for (i = 0 ; i < MUSE_NUM_FD ; i++) {
280 static void _recorder_client_user_callback(recorder_cb_info_s *cb_info, char *recv_msg, muse_recorder_event_e event, int *tfd)
282 if (recv_msg == NULL || event >= MUSE_RECORDER_EVENT_TYPE_NUM) {
283 REC_LOG_ERROR("invalid parameter - recorder msg[%p], event[%d]", recv_msg, event);
287 REC_LOG_DEBUG("get recorder msg[%s], event[%d]", recv_msg, event);
289 g_mutex_lock(&cb_info->user_cb_mutex[event]);
291 if (cb_info->user_cb[event] == NULL) {
292 if (event != MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM &&
293 event != MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM &&
294 event != MUSE_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION) {
295 g_mutex_unlock(&cb_info->user_cb_mutex[event]);
296 REC_LOG_WARNING("NULL callback for event[%d], return here", event);
299 REC_LOG_WARNING("NULL callback for event[%d], NOT return here", event);
304 case MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE:
310 muse_recorder_msg_get(previous, recv_msg);
311 muse_recorder_msg_get(current, recv_msg);
312 muse_recorder_msg_get(by_policy, recv_msg);
314 ((recorder_state_changed_cb)cb_info->user_cb[event])((recorder_state_e)previous,
315 (recorder_state_e)current,
317 cb_info->user_data[event]);
320 case MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED:
324 muse_recorder_msg_get(type, recv_msg);
326 ((recorder_recording_limit_reached_cb)cb_info->user_cb[event])((recorder_recording_limit_type_e)type,
327 cb_info->user_data[event]);
330 case MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS:
332 int64_t cb_elapsed_time = 0;
333 int64_t cb_file_size = 0;
335 muse_recorder_msg_get_int64(cb_elapsed_time, recv_msg);
336 muse_recorder_msg_get_int64(cb_file_size, recv_msg);
338 ((recorder_recording_status_cb)cb_info->user_cb[event])((unsigned long long)cb_elapsed_time,
339 (unsigned long long)cb_file_size,
340 cb_info->user_data[event]);
343 case MUSE_RECORDER_EVENT_TYPE_INTERRUPTED:
349 muse_recorder_msg_get(policy, recv_msg);
350 muse_recorder_msg_get(previous, recv_msg);
351 muse_recorder_msg_get(current, recv_msg);
353 REC_LOG_WARNING("INTERRUPTED - policy[%d], state[%d] ->[%d]", policy, previous, current);
355 ((recorder_interrupted_cb)cb_info->user_cb[event])((recorder_policy_e)policy,
356 (recorder_state_e)previous,
357 (recorder_state_e)current,
358 cb_info->user_data[event]);
361 case MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED:
366 muse_recorder_msg_get(policy, recv_msg);
367 muse_recorder_msg_get(state, recv_msg);
369 REC_LOG_WARNING("INTERRUPT_STARTED - policy[%d], state[%d]", policy, state);
371 ((recorder_interrupt_started_cb)cb_info->user_cb[event])((recorder_policy_e)policy,
372 (recorder_state_e)state, cb_info->user_data[event]);
375 case MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM:
383 tbm_bo_handle bo_handle = {.ptr = NULL};
384 char *send_msg = NULL;
386 if (!tfd || tfd[0] < 0) {
387 REC_LOG_ERROR("invalid fd[%d]", tfd ? tfd[0] : 0);
391 muse_recorder_msg_get(audio_fd, recv_msg);
393 if (cb_info->user_cb[event]) {
394 if (_recorder_import_tbm_fd(cb_info->bufmgr, tfd[0], &bo, &bo_handle)) {
395 muse_recorder_msg_get(size, recv_msg);
396 muse_recorder_msg_get(format, recv_msg);
397 muse_recorder_msg_get(channel, recv_msg);
398 muse_recorder_msg_get(timestamp, recv_msg);
400 REC_LOG_DEBUG("size[%d], format[%d], channel[%d], timestamp[%d]",
401 size, format, channel, timestamp);
403 ((recorder_audio_stream_cb)cb_info->user_cb[event])((void *)bo_handle.ptr,
404 size, (audio_sample_type_e)format, channel,
405 (unsigned int)timestamp, cb_info->user_data[event]);
407 REC_LOG_VERBOSE("returned");
409 /* release imported bo */
410 _recorder_release_imported_bo(&bo);
412 REC_LOG_ERROR("tbm fd[%d] import failed", tfd[0]);
417 send_msg = muse_core_msg_new(MUSE_RECORDER_API_RETURN_BUFFER,
418 MUSE_TYPE_INT, "ret_fd", audio_fd,
419 MUSE_TYPE_INT, "buffer_type", MUSE_RECORDER_BUFFER_TYPE_AUDIO_STREAM,
422 if (muse_core_msg_send(cb_info->fd, send_msg) <= 0)
423 REC_LOG_ERROR("sending message failed");
425 muse_core_msg_free(send_msg);
428 REC_LOG_ERROR("failed to create send msg for fd[%d]", audio_fd);
431 /* close imported fd */
436 case MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM:
443 tbm_bo_handle bo_handle = {.ptr = NULL};
444 char *send_msg = NULL;
446 if (!tfd || tfd[0] < 0) {
447 REC_LOG_ERROR("invalid fd[%d]", tfd ? tfd[0] : 0);
451 muse_recorder_msg_get(muxed_fd, recv_msg);
453 if (cb_info->user_cb[event]) {
454 if (_recorder_import_tbm_fd(cb_info->bufmgr, tfd[0], &bo, &bo_handle)) {
455 muse_recorder_msg_get(size, recv_msg);
456 muse_recorder_msg_get_int64(offset, recv_msg);
458 REC_LOG_DEBUG("size[%d], offset[%"PRId64"]", size, offset);
460 ((recorder_muxed_stream_cb)cb_info->user_cb[event])((void *)bo_handle.ptr,
461 size, (unsigned long long)offset, cb_info->user_data[event]);
463 REC_LOG_VERBOSE("returned");
465 /* release imported bo */
466 _recorder_release_imported_bo(&bo);
468 REC_LOG_ERROR("tbm fd[%d] import failed", tfd[0]);
473 send_msg = muse_core_msg_new(MUSE_RECORDER_API_RETURN_BUFFER,
474 MUSE_TYPE_INT, "ret_fd", muxed_fd,
475 MUSE_TYPE_INT, "buffer_type", MUSE_RECORDER_BUFFER_TYPE_MUXED_STREAM,
478 if (muse_core_msg_send(cb_info->fd, send_msg) <= 0)
479 REC_LOG_ERROR("sending message failed");
481 muse_core_msg_free(send_msg);
484 REC_LOG_ERROR("failed to create send msg for fd[%d]", tfd[0]);
487 /* close imported fd */
492 case MUSE_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION:
493 _recorder_event_handler_video_encode_decision(cb_info, recv_msg, tfd);
496 case MUSE_RECORDER_EVENT_TYPE_ERROR:
499 int current_state = 0;
501 muse_recorder_msg_get(error, recv_msg);
502 muse_recorder_msg_get(current_state, recv_msg);
504 ((recorder_error_cb)cb_info->user_cb[event])((recorder_error_e)error,
505 (recorder_state_e)current_state,
506 cb_info->user_data[event]);
510 case MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_AUDIO_ENCODER:
514 muse_recorder_msg_get(codec, recv_msg);
516 if (((recorder_supported_audio_encoder_cb)cb_info->user_cb[event])((recorder_audio_codec_e)codec, cb_info->user_data[event]) == false) {
517 cb_info->user_cb[event] = NULL;
518 cb_info->user_data[event] = NULL;
519 REC_LOG_DEBUG("stop foreach callback for SUPPORTED_AUDIO_ENCODER");
523 case MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_FILE_FORMAT:
527 muse_recorder_msg_get(format, recv_msg);
529 if (((recorder_supported_file_format_cb)cb_info->user_cb[event])((recorder_file_format_e)format, cb_info->user_data[event]) == false) {
530 cb_info->user_cb[event] = NULL;
531 cb_info->user_data[event] = NULL;
532 REC_LOG_DEBUG("stop foreach callback for SUPPORTED_FILE_FORMAT");
536 case MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_ENCODER:
540 muse_recorder_msg_get(codec, recv_msg);
542 if (((recorder_supported_video_encoder_cb)cb_info->user_cb[event])((recorder_video_codec_e)codec, cb_info->user_data[event]) == false) {
543 cb_info->user_cb[event] = NULL;
544 cb_info->user_data[event] = NULL;
545 REC_LOG_DEBUG("stop foreach callback for SUPPORTED_VIDEO_ENCODER");
549 default: /* MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_RESOLUTION */
554 muse_recorder_msg_get(width, recv_msg);
555 muse_recorder_msg_get(height, recv_msg);
557 if (((recorder_supported_video_resolution_cb)cb_info->user_cb[event])(width, height, cb_info->user_data[event]) == false) {
558 cb_info->user_cb[event] = NULL;
559 cb_info->user_data[event] = NULL;
560 REC_LOG_DEBUG("stop foreach callback for SUPPORTED_VIDEO_RESOLUTION");
566 g_mutex_unlock(&cb_info->user_cb_mutex[event]);
572 static gboolean _recorder_idle_event_callback(gpointer data)
574 recorder_cb_info_s *cb_info = NULL;
575 recorder_idle_event_s *rec_idle_event = (recorder_idle_event_s *)data;
577 if (rec_idle_event == NULL) {
578 REC_LOG_ERROR("rec_idle_event is NULL");
583 g_mutex_lock(&g_rec_idle_event_lock);
585 cb_info = rec_idle_event->cb_info;
586 if (cb_info == NULL) {
587 REC_LOG_WARNING("recorder cb_info is NULL. event[%p][%d]", rec_idle_event, rec_idle_event->event);
588 g_mutex_unlock(&g_rec_idle_event_lock);
589 goto IDLE_EVENT_CALLBACK_DONE;
592 /* remove event from list */
593 if (cb_info->idle_event_list)
594 cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)rec_idle_event);
596 g_mutex_unlock(&g_rec_idle_event_lock);
599 _recorder_client_user_callback(cb_info, rec_idle_event->recv_msg, rec_idle_event->event, NULL);
601 IDLE_EVENT_CALLBACK_DONE:
603 g_free(rec_idle_event);
604 rec_idle_event = NULL;
610 static void _recorder_deactivate_idle_event_all(recorder_cb_info_s *cb_info)
612 recorder_idle_event_s *rec_idle_event = NULL;
615 if (cb_info == NULL) {
616 REC_LOG_ERROR("cb_info is NULL");
620 g_mutex_lock(&g_rec_idle_event_lock);
622 if (cb_info->idle_event_list == NULL) {
623 REC_LOG_INFO("No event");
625 list = cb_info->idle_event_list;
628 rec_idle_event = list->data;
629 list = g_list_next(list);
631 if (!rec_idle_event) {
632 REC_LOG_WARNING("The event is NULL");
636 if (g_idle_remove_by_data(rec_idle_event)) {
637 REC_LOG_WARNING("remove idle event[%p] done", rec_idle_event);
639 cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)rec_idle_event);
641 g_free(rec_idle_event);
642 rec_idle_event = NULL;
647 REC_LOG_WARNING("set NULL cb_info for event[%p][%d], it will be freed on idle callback",
648 rec_idle_event, rec_idle_event->event);
650 rec_idle_event->cb_info = NULL;
652 cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)rec_idle_event);
655 g_list_free(cb_info->idle_event_list);
656 cb_info->idle_event_list = NULL;
659 g_mutex_unlock(&g_rec_idle_event_lock);
665 static void __recorder_add_msg_to_queue(recorder_cb_info_s *cb_info, int api, int event, int event_class, char *msg, int *tfd)
667 recorder_message_s *rec_msg = NULL;
668 recorder_msg_handler_info_s *msg_handler_info = NULL;
670 if (!cb_info || !msg) {
671 REC_LOG_ERROR("NULL pointer[%p][%p]", cb_info, msg);
675 rec_msg = g_new0(recorder_message_s, 1);
677 REC_LOG_ERROR("failed to alloc rec_msg for[%s]", msg);
682 rec_msg->event = event;
683 rec_msg->event_class = event_class;
685 if (tfd && tfd[0] >= 0)
686 memcpy(rec_msg->tfd, tfd, sizeof(rec_msg->tfd));
688 strncpy(rec_msg->recv_msg, msg, sizeof(rec_msg->recv_msg) - 1);
690 REC_LOG_DEBUG("api[%d], event[%d], event_class[%d]",
691 api, event, event_class);
693 if (event == MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM)
694 msg_handler_info = &cb_info->audio_stream_cb_info;
695 else if (event == MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM)
696 msg_handler_info = &cb_info->muxed_stream_cb_info;
698 msg_handler_info = &cb_info->msg_handler_info;
700 g_mutex_lock(&msg_handler_info->mutex);
701 g_queue_push_tail(msg_handler_info->queue, (gpointer)rec_msg);
702 g_cond_signal(&msg_handler_info->cond);
703 g_mutex_unlock(&msg_handler_info->mutex);
711 static void __recorder_get_api_operation(int api, recorder_cb_info_s *cb_info, char *msg)
713 if (!cb_info || !msg) {
714 REC_LOG_ERROR("NULL pointer[%p][%p]", cb_info, msg);
719 case MUSE_RECORDER_API_GET_STATE:
722 muse_recorder_msg_get(get_state, msg);
723 cb_info->get_int_value[_RECORDER_GET_INT_STATE] = get_state;
726 case MUSE_RECORDER_API_GET_VIDEO_RESOLUTION:
730 muse_recorder_msg_get(get_width, msg);
731 muse_recorder_msg_get(get_height, msg);
732 cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_RESOLUTION] = get_width << 16;
733 cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_RESOLUTION] |= get_height;
736 case MUSE_RECORDER_API_GET_FILE_FORMAT:
739 muse_recorder_msg_get(get_format, msg);
740 cb_info->get_int_value[_RECORDER_GET_INT_FILE_FORMAT] = get_format;
743 case MUSE_RECORDER_API_GET_AUDIO_ENCODER:
746 muse_recorder_msg_get(get_codec, msg);
747 cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_ENCODER] = get_codec;
750 case MUSE_RECORDER_API_GET_VIDEO_ENCODER:
753 muse_recorder_msg_get(get_codec, msg);
754 cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_ENCODER] = get_codec;
757 case MUSE_RECORDER_API_ATTR_GET_SIZE_LIMIT:
760 muse_recorder_msg_get(get_kbyte, msg);
761 cb_info->get_int_value[_RECORDER_GET_INT_SIZE_LIMIT] = get_kbyte;
764 case MUSE_RECORDER_API_ATTR_GET_TIME_LIMIT:
767 muse_recorder_msg_get(get_second, msg);
768 cb_info->get_int_value[_RECORDER_GET_INT_TIME_LIMIT] = get_second;
771 case MUSE_RECORDER_API_ATTR_GET_AUDIO_DEVICE:
774 muse_recorder_msg_get(get_device, msg);
775 cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_DEVICE] = get_device;
778 case MUSE_RECORDER_API_ATTR_GET_AUDIO_SAMPLERATE:
780 int get_samplerate = 0;
781 muse_recorder_msg_get(get_samplerate, msg);
782 cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_SAMPLERATE] = get_samplerate;
785 case MUSE_RECORDER_API_ATTR_GET_AUDIO_ENCODER_BITRATE:
788 muse_recorder_msg_get(get_bitrate, msg);
789 cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_ENCODER_BITRATE] = get_bitrate;
792 case MUSE_RECORDER_API_ATTR_GET_VIDEO_ENCODER_BITRATE:
795 muse_recorder_msg_get(get_bitrate, msg);
796 cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_ENCODER_BITRATE] = get_bitrate;
799 case MUSE_RECORDER_API_ATTR_GET_RECORDING_MOTION_RATE:
802 muse_recorder_msg_get_double(get_rate, msg);
803 cb_info->get_double_value[_RECORDER_GET_DOUBLE_RECORDING_MOTION_RATE] = get_rate;
806 case MUSE_RECORDER_API_ATTR_GET_AUDIO_CHANNEL:
808 int get_channel_count = 0;
809 muse_recorder_msg_get(get_channel_count, msg);
810 cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_CHANNEL] = get_channel_count;
813 case MUSE_RECORDER_API_ATTR_GET_ORIENTATION_TAG:
815 int get_orientation = 0;
816 muse_recorder_msg_get(get_orientation, msg);
817 cb_info->get_int_value[_RECORDER_GET_INT_ORIENTATION_TAG] = get_orientation;
820 case MUSE_RECORDER_API_GET_AUDIO_LEVEL:
822 double get_level = 0.0;
823 muse_recorder_msg_get_double(get_level, msg);
824 cb_info->get_double_value[_RECORDER_GET_DOUBLE_AUDIO_LEVEL] = get_level;
827 case MUSE_RECORDER_API_GET_FILENAME:
829 char get_filename[MUSE_RECORDER_MSG_MAX_LENGTH] = {'\0',};
830 muse_recorder_msg_get_string(get_filename, msg);
831 if (cb_info->get_filename) {
832 free(cb_info->get_filename);
833 cb_info->get_filename = NULL;
835 cb_info->get_filename = strdup(get_filename);
846 static void __recorder_process_msg(recorder_cb_info_s *cb_info, char *msg, int *tfd)
848 int ret = RECORDER_ERROR_NONE;
852 int event_class = -1;
854 if (!cb_info || !msg) {
855 REC_LOG_ERROR("invalid ptr[%p][%p]", cb_info, msg);
859 REC_LOG_DEBUG("msg[%s]", msg);
861 if (!muse_recorder_msg_get(api, msg)) {
862 REC_LOG_ERROR("failed to get recorder api");
866 if (api == MUSE_RECORDER_CB_EVENT) {
867 if (!muse_recorder_msg_get(event, msg) ||
868 !muse_recorder_msg_get(event_class, msg)) {
869 REC_LOG_ERROR("failed to get event or event_class[%s]", msg);
873 if (!muse_recorder_msg_get(api_class, msg)) {
874 REC_LOG_ERROR("failed to get api_class[%s]", msg);
879 if (api_class == MUSE_RECORDER_API_CLASS_IMMEDIATE) {
880 if (api >= MUSE_RECORDER_API_MAX) {
881 REC_LOG_ERROR("invalid api[%d]", api);
885 if (!muse_recorder_msg_get(ret, msg)) {
886 REC_LOG_ERROR("failed to get recorder ret");
890 g_mutex_lock(&cb_info->api_mutex[api]);
892 if (api == MUSE_RECORDER_API_GET_DEVICE_STATE) {
893 g_atomic_int_set(&cb_info->msg_recv_running, 0);
894 REC_LOG_INFO("get device state done. close client cb handler");
897 case MUSE_RECORDER_API_CREATE:
898 if (ret != RECORDER_ERROR_NONE) {
899 g_atomic_int_set(&cb_info->msg_recv_running, 0);
900 REC_LOG_ERROR("create error [0x%x]. closing..", ret);
903 case MUSE_RECORDER_API_DESTROY:
904 if (ret == RECORDER_ERROR_NONE) {
905 g_atomic_int_set(&cb_info->msg_recv_running, 0);
906 REC_LOG_INFO("destroy done. closing..");
910 __recorder_get_api_operation(api, cb_info, msg);
915 if (cb_info->api_waiting[api] > 0) {
916 cb_info->api_ret[api] = ret;
917 cb_info->api_activating[api] = TRUE;
919 g_cond_signal(&cb_info->api_cond[api]);
921 REC_LOG_ERROR("no waiting for api[%d]", api);
924 g_mutex_unlock(&cb_info->api_mutex[api]);
925 } else if (api_class == MUSE_RECORDER_API_CLASS_THREAD_SUB || api == MUSE_RECORDER_CB_EVENT) {
926 __recorder_add_msg_to_queue(cb_info, api, event, event_class, msg, tfd);
928 REC_LOG_WARNING("unknown recorder api[%d] and api_class[%d]", api, api_class);
935 static void *_recorder_msg_handler_func(gpointer data)
939 recorder_message_s *rec_msg = NULL;
940 recorder_idle_event_s *rec_idle_event = NULL;
941 recorder_msg_handler_info_s *handler_info = (recorder_msg_handler_info_s *)data;
942 recorder_cb_info_s *cb_info = NULL;
944 if (!handler_info || !handler_info->cb_info) {
945 REC_LOG_ERROR("NULL handler[%p]", handler_info);
949 cb_info = (recorder_cb_info_s *)handler_info->cb_info;
950 type = handler_info->type;
952 REC_LOG_INFO("t[%d] start", type);
954 g_mutex_lock(&handler_info->mutex);
956 while (g_atomic_int_get(&handler_info->running)) {
957 if (g_queue_is_empty(handler_info->queue)) {
958 REC_LOG_VERBOSE("signal wait...");
959 g_cond_wait(&handler_info->cond, &handler_info->mutex);
960 REC_LOG_VERBOSE("signal received");
962 if (g_atomic_int_get(&handler_info->running) == 0) {
963 REC_LOG_INFO("stop event thread");
968 rec_msg = (recorder_message_s *)g_queue_pop_head(handler_info->queue);
969 g_mutex_unlock(&handler_info->mutex);
970 if (rec_msg == NULL) {
971 REC_LOG_ERROR("NULL message");
972 g_mutex_lock(&handler_info->mutex);
978 if (api < MUSE_RECORDER_API_MAX) {
981 g_mutex_lock(&cb_info->api_mutex[api]);
983 if (muse_recorder_msg_get(ret, rec_msg->recv_msg)) {
984 if (cb_info->api_waiting[api] > 0) {
985 cb_info->api_ret[api] = ret;
986 cb_info->api_activating[api] = TRUE;
988 REC_LOG_DEBUG("recorder api[%d] - return[0x%x]", api, ret);
990 g_cond_signal(&cb_info->api_cond[api]);
992 REC_LOG_ERROR("no waiting for api [%d]", api);
995 REC_LOG_ERROR("t[%d] failed to get ret for api[%d], msg[%s]", type, api, rec_msg->recv_msg);
998 g_mutex_unlock(&cb_info->api_mutex[api]);
999 } else if (api == MUSE_RECORDER_CB_EVENT) {
1000 switch (rec_msg->event_class) {
1001 case MUSE_RECORDER_EVENT_CLASS_THREAD_SUB:
1002 _recorder_client_user_callback(cb_info, rec_msg->recv_msg, rec_msg->event, rec_msg->tfd);
1004 case MUSE_RECORDER_EVENT_CLASS_THREAD_MAIN:
1005 rec_idle_event = g_new0(recorder_idle_event_s, 1);
1006 if (rec_idle_event == NULL) {
1007 REC_LOG_ERROR("event alloc failed");
1011 rec_idle_event->event = rec_msg->event;
1012 rec_idle_event->cb_info = cb_info;
1014 strncpy(rec_idle_event->recv_msg, rec_msg->recv_msg, sizeof(rec_idle_event->recv_msg));
1016 REC_LOG_DEBUG("add recorder event[%d][%p] to IDLE", rec_msg->event, rec_idle_event);
1018 g_mutex_lock(&g_rec_idle_event_lock);
1019 cb_info->idle_event_list = g_list_append(cb_info->idle_event_list, (gpointer)rec_idle_event);
1020 g_mutex_unlock(&g_rec_idle_event_lock);
1022 g_idle_add_full(G_PRIORITY_DEFAULT,
1023 (GSourceFunc)_recorder_idle_event_callback,
1024 (gpointer)rec_idle_event,
1028 REC_LOG_ERROR("unknown event class[%d]", rec_msg->event_class);
1032 REC_LOG_ERROR("unknown api[%d] message", api);
1038 g_mutex_lock(&handler_info->mutex);
1041 /* remove remained event */
1042 while (!g_queue_is_empty(handler_info->queue)) {
1043 rec_msg = (recorder_message_s *)g_queue_pop_head(handler_info->queue);
1045 REC_LOG_INFO("remove message[%p]", rec_msg);
1049 REC_LOG_WARNING("NULL message");
1053 g_mutex_unlock(&handler_info->mutex);
1055 REC_LOG_INFO("return");
1061 static void *_recorder_msg_recv_func(gpointer data)
1064 int recv_length = 0;
1065 int tfd[MUSE_NUM_FD] = {-1, -1, -1, -1};
1066 char *recv_msg = NULL;
1067 recorder_cb_info_s *cb_info = (recorder_cb_info_s *)data;
1069 if (cb_info == NULL) {
1070 REC_LOG_ERROR("cb_info NULL");
1074 REC_LOG_INFO("start");
1076 recv_msg = cb_info->recv_msg;
1078 while (g_atomic_int_get(&cb_info->msg_recv_running)) {
1079 for (i = 0 ; i < MUSE_NUM_FD ; i++)
1082 recv_length = muse_core_msg_recv_fd(cb_info->fd, recv_msg, MUSE_MSG_MAX_LENGTH, tfd);
1083 if (recv_length <= 0) {
1085 cb_info->is_server_connected = FALSE;
1086 REC_LOG_ERROR("receive msg failed - server disconnected");
1091 recv_msg[recv_length] = '\0';
1093 REC_LOG_DEBUG("recv msg[%s], length[%d]", recv_msg, recv_length);
1095 __recorder_process_msg(cb_info, recv_msg, tfd);
1098 REC_LOG_INFO("client cb exit - server connected[%d]", cb_info->is_server_connected);
1100 if (!cb_info->is_server_connected) {
1102 /* send error msg for server disconnection */
1103 char *error_msg = muse_core_msg_new(MUSE_RECORDER_CB_EVENT,
1104 MUSE_TYPE_INT, "error", RECORDER_ERROR_SERVICE_DISCONNECTED,
1105 MUSE_TYPE_INT, "current_state", RECORDER_STATE_NONE,
1109 REC_LOG_ERROR("error_msg failed");
1110 goto CB_HANDLER_EXIT;
1113 REC_LOG_ERROR("add error msg for service disconnection done");
1115 __recorder_add_msg_to_queue(cb_info,
1116 MUSE_RECORDER_CB_EVENT,
1117 MUSE_RECORDER_EVENT_TYPE_ERROR,
1118 MUSE_RECORDER_EVENT_CLASS_THREAD_MAIN,
1122 muse_core_msg_free(error_msg);
1125 REC_LOG_ERROR("add error msg for service disconnection done");
1134 static bool __create_msg_handler_thread(recorder_msg_handler_info_s *handler_info,
1135 int type, const char *thread_name, recorder_cb_info_s *cb_info)
1137 if (!handler_info || !thread_name || !cb_info) {
1138 REC_LOG_ERROR("t[%d] NULL[%p][%p][%p]",
1139 type, handler_info, thread_name, cb_info);
1143 REC_LOG_INFO("t[%d]", type);
1145 handler_info->type = type;
1146 handler_info->queue = g_queue_new();
1147 if (handler_info->queue == NULL) {
1148 REC_LOG_ERROR("t[%d] queue failed", type);
1152 g_mutex_init(&handler_info->mutex);
1153 g_cond_init(&handler_info->cond);
1155 handler_info->cb_info = (void *)cb_info;
1156 g_atomic_int_set(&handler_info->running, 1);
1158 handler_info->thread = g_thread_try_new(thread_name,
1159 _recorder_msg_handler_func, (gpointer)handler_info, NULL);
1160 if (handler_info->thread == NULL) {
1162 REC_LOG_ERROR("t[%d] thread failed", type);
1164 g_mutex_clear(&handler_info->mutex);
1165 g_cond_clear(&handler_info->cond);
1166 g_queue_free(handler_info->queue);
1167 handler_info->queue = NULL;
1173 REC_LOG_INFO("t[%d] done", type);
1179 static void __destroy_msg_handler_thread(recorder_msg_handler_info_s *handler_info)
1183 if (!handler_info) {
1184 REC_LOG_ERROR("NULL handler");
1188 if (!handler_info->thread) {
1189 REC_LOG_WARNING("thread is not created");
1193 type = handler_info->type;
1195 REC_LOG_INFO("t[%d] thread[%p]", type, handler_info->thread);
1197 g_mutex_lock(&handler_info->mutex);
1198 g_atomic_int_set(&handler_info->running, 0);
1199 g_cond_signal(&handler_info->cond);
1200 g_mutex_unlock(&handler_info->mutex);
1202 g_thread_join(handler_info->thread);
1203 handler_info->thread = NULL;
1205 g_mutex_clear(&handler_info->mutex);
1206 g_cond_clear(&handler_info->cond);
1207 g_queue_free(handler_info->queue);
1208 handler_info->queue = NULL;
1210 REC_LOG_INFO("t[%d] done", type);
1216 static recorder_cb_info_s *_recorder_client_callback_new(gint sockfd)
1218 recorder_cb_info_s *cb_info = NULL;
1221 g_return_val_if_fail(sockfd > 0, NULL);
1223 cb_info = g_new0(recorder_cb_info_s, 1);
1224 if (cb_info == NULL) {
1225 REC_LOG_ERROR("cb_info failed");
1229 cb_info->api_waiting[MUSE_RECORDER_API_CREATE] = 1;
1231 for (i = 0 ; i < MUSE_RECORDER_API_MAX ; i++) {
1232 g_mutex_init(&cb_info->api_mutex[i]);
1233 g_cond_init(&cb_info->api_cond[i]);
1236 for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++)
1237 g_mutex_init(&cb_info->user_cb_mutex[i]);
1239 /* message handler thread */
1240 if (!__create_msg_handler_thread(&cb_info->msg_handler_info,
1241 _RECORDER_MESSAGE_HANDLER_TYPE_GENERAL, "recorder_msg_handler", cb_info)) {
1242 REC_LOG_ERROR("msg_handler_info failed");
1246 /* message handler thread for audio stream callback */
1247 if (!__create_msg_handler_thread(&cb_info->audio_stream_cb_info,
1248 _RECORDER_MESSAGE_HANDLER_TYPE_AUDIO_STREAM_CB, "recorder_msg_handler:audio_stream_cb", cb_info)) {
1249 REC_LOG_ERROR("audio_stream_cb_info failed");
1253 /* message handler thread for muxed stream callback */
1254 if (!__create_msg_handler_thread(&cb_info->muxed_stream_cb_info,
1255 _RECORDER_MESSAGE_HANDLER_TYPE_MUXED_STREAM_CB, "recorder_msg_handler:muxed_stream_cb", cb_info)) {
1256 REC_LOG_ERROR("muxed_stream_cb_info failed");
1260 cb_info->fd = sockfd;
1262 /* message receive thread */
1263 g_atomic_int_set(&cb_info->msg_recv_running, 1);
1264 cb_info->msg_recv_thread = g_thread_try_new("recorder_msg_recv",
1265 _recorder_msg_recv_func, (gpointer)cb_info, NULL);
1266 if (cb_info->msg_recv_thread == NULL) {
1267 REC_LOG_ERROR("message receive thread creation failed");
1271 cb_info->is_server_connected = TRUE;
1277 __destroy_msg_handler_thread(&cb_info->msg_handler_info);
1278 __destroy_msg_handler_thread(&cb_info->audio_stream_cb_info);
1279 __destroy_msg_handler_thread(&cb_info->muxed_stream_cb_info);
1281 for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++)
1282 g_mutex_clear(&cb_info->user_cb_mutex[i]);
1284 for (i = 0 ; i < MUSE_RECORDER_API_MAX ; i++) {
1285 g_mutex_clear(&cb_info->api_mutex[i]);
1286 g_cond_clear(&cb_info->api_cond[i]);
1297 static int _recorder_client_wait_for_cb_return(muse_recorder_api_e api, recorder_cb_info_s *cb_info, int time_out)
1299 int ret = RECORDER_ERROR_NONE;
1302 if (!cb_info->is_server_connected) {
1303 REC_LOG_ERROR("server is disconnected");
1304 return RECORDER_ERROR_SERVICE_DISCONNECTED;
1307 g_mutex_lock(&(cb_info->api_mutex[api]));
1309 REC_LOG_INFO("api[%d], timeout[%d]sec", api, time_out);
1311 end_time = g_get_monotonic_time() + time_out * G_TIME_SPAN_SECOND;
1313 while (!cb_info->api_activating[api]) {
1314 if (time_out == RECORDER_CB_NO_TIMEOUT) {
1315 g_cond_wait(&(cb_info->api_cond[api]), &(cb_info->api_mutex[api]));
1316 REC_LOG_WARNING("api[%d] returned[0x%x]", api, cb_info->api_ret[api]);
1317 } else if (!g_cond_wait_until(&(cb_info->api_cond[api]), &(cb_info->api_mutex[api]), end_time)) {
1318 REC_LOG_ERROR("api[%d] was TIMED OUT!", api);
1319 ret = RECORDER_ERROR_INVALID_OPERATION;
1320 goto _CB_RETURN_END;
1323 if (!cb_info->api_activating[api])
1324 REC_LOG_WARNING("invalid signal received, wait again...");
1327 ret = cb_info->api_ret[api];
1328 cb_info->api_activating[api] = FALSE;
1331 g_mutex_unlock(&(cb_info->api_mutex[api]));
1333 if (ret != RECORDER_ERROR_NONE)
1334 REC_LOG_ERROR("ERROR : api[%d] - ret[0x%x]", api, ret);
1340 static int __send_msg_free(muse_recorder_api_e api, recorder_cb_info_s *cb_info,
1341 char *msg, int timeout)
1343 int ret = RECORDER_ERROR_NONE;
1347 REC_LOG_ERROR("NULL handle");
1348 return RECORDER_ERROR_INVALID_PARAMETER;
1352 REC_LOG_ERROR("NULL msg");
1353 return RECORDER_ERROR_OUT_OF_MEMORY;
1356 __recorder_update_api_waiting(cb_info, api, 1);
1358 if (cb_info->is_server_connected)
1359 send_ret = muse_core_msg_send(cb_info->fd, msg);
1362 REC_LOG_ERROR("message send failed");
1363 ret = RECORDER_ERROR_INVALID_OPERATION;
1365 ret = _recorder_client_wait_for_cb_return(api, cb_info, timeout);
1368 __recorder_update_api_waiting(cb_info, api, -1);
1370 muse_core_msg_free(msg);
1372 REC_LOG_INFO("api[%d] - ret[0x%x]", api, ret);
1378 static int _recorder_msg_send(muse_recorder_api_e api, recorder_cb_info_s *cb_info,
1379 int *ret, int timeout)
1381 if (!cb_info || !ret) {
1382 REC_LOG_ERROR("invalid pointer for api[%d] -[%p][%p]", api, cb_info, ret);
1383 return RECORDER_ERROR_INVALID_PARAMETER;
1386 *ret = __send_msg_free(api, cb_info, muse_core_msg_new(api, NULL), timeout);
1388 return RECORDER_ERROR_NONE;
1392 static int _recorder_msg_send_param(muse_recorder_api_e api, recorder_cb_info_s *cb_info,
1393 int *ret, int type, const char *name, void *value)
1397 if (!cb_info || !ret || !name || !value) {
1398 REC_LOG_ERROR("NULL param for api[%d] -[%p,%p,%p,%p]", api, cb_info, ret, name, value);
1399 return RECORDER_ERROR_INVALID_PARAMETER;
1404 msg = muse_core_msg_new(api, type, name, *(int *)value, NULL);
1406 case MUSE_TYPE_DOUBLE:
1407 msg = muse_core_msg_new(api, type, name, *(double *)value, NULL);
1409 case MUSE_TYPE_STRING:
1410 msg = muse_core_msg_new(api, type, name, (char *)value, NULL);
1413 REC_LOG_ERROR("unknown type[%d]", type);
1417 *ret = __send_msg_free(api, cb_info, msg, RECORDER_CB_TIMEOUT);
1419 return RECORDER_ERROR_NONE;
1423 static int _recorder_set_int(recorder_h recorder, muse_recorder_api_e api, const char *name, int value)
1425 int ret = RECORDER_ERROR_NONE;
1426 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1428 if (!pc || !pc->cb_info) {
1429 REC_LOG_ERROR("NULL handle");
1430 return RECORDER_ERROR_INVALID_PARAMETER;
1433 REC_LOG_INFO("api[%d] - value[%d]", api, value);
1435 _recorder_msg_send_param(api, pc->cb_info, &ret,
1436 MUSE_TYPE_INT, name, (void *)&value);
1438 REC_LOG_INFO("api[%d] - ret[0x%x]", api, ret);
1444 static int _recorder_set_cb(recorder_h recorder, muse_recorder_api_e api, muse_recorder_event_e event, bool is_set, void *callback, void *user_data)
1446 int ret = RECORDER_ERROR_NONE;
1447 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1449 if (!pc || !pc->cb_info) {
1450 REC_LOG_ERROR("INVALID_PARAMETER(0x%08x)", RECORDER_ERROR_INVALID_PARAMETER);
1451 return RECORDER_ERROR_INVALID_PARAMETER;
1454 REC_LOG_INFO("Enter[%p] - api[%d], is_set[%d], cb[%p], user_data[%p]",
1455 recorder, api, is_set, callback, user_data);
1457 if (is_set && callback == NULL) {
1458 REC_LOG_ERROR("NULL callback");
1459 return RECORDER_ERROR_INVALID_PARAMETER;
1462 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
1464 if (ret == RECORDER_ERROR_NONE) {
1465 g_mutex_lock(&pc->cb_info->user_cb_mutex[event]);
1467 pc->cb_info->user_cb[event] = callback;
1468 pc->cb_info->user_data[event] = user_data;
1470 g_mutex_unlock(&pc->cb_info->user_cb_mutex[event]);
1473 REC_LOG_INFO("ret[0x%x]", ret);
1479 static void _recorder_client_callback_destroy(recorder_cb_info_s *cb_info)
1483 g_return_if_fail(cb_info != NULL);
1485 /* remove idle event */
1486 _recorder_deactivate_idle_event_all(cb_info);
1488 REC_LOG_INFO("MSG receive thread[%p] destroy", cb_info->msg_recv_thread);
1490 g_thread_join(cb_info->msg_recv_thread);
1491 cb_info->msg_recv_thread = NULL;
1493 REC_LOG_INFO("msg_recv thread removed");
1495 __destroy_msg_handler_thread(&cb_info->msg_handler_info);
1496 __destroy_msg_handler_thread(&cb_info->audio_stream_cb_info);
1497 __destroy_msg_handler_thread(&cb_info->muxed_stream_cb_info);
1499 for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++)
1500 g_mutex_clear(&cb_info->user_cb_mutex[i]);
1502 for (i = 0 ; i < MUSE_RECORDER_API_MAX ; i++) {
1503 g_mutex_clear(&cb_info->api_mutex[i]);
1504 g_cond_clear(&cb_info->api_cond[i]);
1507 if (cb_info->fd > -1) {
1508 muse_client_close(cb_info->fd);
1512 if (cb_info->bufmgr) {
1513 tbm_bufmgr_deinit(cb_info->bufmgr);
1514 cb_info->bufmgr = NULL;
1516 if (cb_info->get_filename) {
1517 free(cb_info->get_filename);
1518 cb_info->get_filename = NULL;
1528 static bool _recorder_storage_device_supported_cb(int storage_id, storage_type_e type, storage_state_e state, const char *path, void *user_data)
1530 char **root_directory = (char **)user_data;
1532 if (root_directory == NULL) {
1533 REC_LOG_ERROR("user data is NULL");
1537 REC_LOG_INFO("storage id[%d], type[%d], state[%d], path[%s]",
1538 storage_id, type, state, path ? path : "NULL");
1540 if (type == STORAGE_TYPE_INTERNAL && path) {
1541 if (*root_directory) {
1542 free(*root_directory);
1543 *root_directory = NULL;
1546 *root_directory = strdup(path);
1547 if (*root_directory) {
1548 REC_LOG_INFO("get root directory[%s]", *root_directory);
1551 REC_LOG_ERROR("strdup[%s] failed", path);
1558 static int _recorder_client_get_root_directory(char **root_directory)
1560 int ret = STORAGE_ERROR_NONE;
1562 if (root_directory == NULL) {
1563 REC_LOG_ERROR("user data is NULL");
1567 ret = storage_foreach_device_supported((storage_device_supported_cb)_recorder_storage_device_supported_cb, root_directory);
1568 if (ret != STORAGE_ERROR_NONE) {
1569 REC_LOG_ERROR("storage_foreach_device_supported failed[0x%x]", ret);
1576 static int _recorder_create_common(recorder_h *recorder, muse_recorder_type_e type, camera_h camera)
1578 int ret = RECORDER_ERROR_NONE;
1579 int destroy_ret = RECORDER_ERROR_NONE;
1581 int module_index = -1;
1582 int log_level = g_recorder_log_level;
1584 char *send_msg = NULL;
1585 char *root_directory = NULL;
1586 intptr_t camera_handle = 0;
1587 intptr_t handle = 0;
1588 tbm_bufmgr bufmgr = NULL;
1589 recorder_cli_s *pc = NULL;
1591 REC_LOG_INFO("type[%d]", type);
1593 if (recorder == NULL) {
1594 REC_LOG_ERROR("NULL pointer for recorder handle");
1595 return RECORDER_ERROR_INVALID_PARAMETER;
1598 if (type == MUSE_RECORDER_TYPE_VIDEO && camera == NULL) {
1599 REC_LOG_ERROR("NULL pointer for camera handle on video recorder mode");
1600 return RECORDER_ERROR_INVALID_PARAMETER;
1603 bufmgr = tbm_bufmgr_init(-1);
1604 if (bufmgr == NULL) {
1605 REC_LOG_ERROR("get tbm bufmgr failed");
1606 return RECORDER_ERROR_INVALID_OPERATION;
1609 pc = g_new0(recorder_cli_s, 1);
1611 ret = RECORDER_ERROR_OUT_OF_MEMORY;
1612 goto _ERR_RECORDER_EXIT;
1615 sock_fd = muse_client_new();
1618 REC_LOG_ERROR("muse_client_new failed - returned fd[%d]", sock_fd);
1619 ret = RECORDER_ERROR_INVALID_OPERATION;
1620 goto _ERR_RECORDER_EXIT;
1624 if (muse_client_get_module_index(MODULE_NAME, &module_index) != MM_ERROR_NONE) {
1625 REC_LOG_ERROR("muse client get module index failed");
1626 ret = RECORDER_ERROR_INVALID_OPERATION;
1627 goto _ERR_RECORDER_EXIT;
1630 if (type == MUSE_RECORDER_TYPE_AUDIO) {
1631 send_msg = muse_core_msg_new(MUSE_RECORDER_API_CREATE,
1632 MUSE_TYPE_INT, "module", module_index,
1633 MUSE_TYPE_INT, PARAM_RECORDER_TYPE, MUSE_RECORDER_TYPE_AUDIO,
1634 MUSE_TYPE_INT, "pid", getpid(),
1637 pc->camera = camera;
1638 camera_handle = (intptr_t)((camera_cli_s *)camera)->remote_handle;
1639 send_msg = muse_core_msg_new(MUSE_RECORDER_API_CREATE,
1640 MUSE_TYPE_INT, "module", module_index,
1641 MUSE_TYPE_INT, PARAM_RECORDER_TYPE, MUSE_RECORDER_TYPE_VIDEO,
1642 MUSE_TYPE_INT, "pid", getpid(),
1643 MUSE_TYPE_POINTER, "camera_handle", camera_handle,
1649 REC_LOG_ERROR("NULL msg");
1650 ret = RECORDER_ERROR_OUT_OF_MEMORY;
1651 goto _ERR_RECORDER_EXIT;
1655 REC_LOG_INFO("sock_fd[%d], msg[%s]", sock_fd, send_msg);
1657 send_ret = muse_core_msg_send(sock_fd, send_msg);
1659 muse_core_msg_free(send_msg);
1664 REC_LOG_ERROR("send msg failed[%d]", errno);
1665 ret = RECORDER_ERROR_INVALID_OPERATION;
1666 goto _ERR_RECORDER_EXIT;
1670 pc->cb_info = _recorder_client_callback_new(sock_fd);
1671 if (pc->cb_info == NULL) {
1672 ret = RECORDER_ERROR_OUT_OF_MEMORY;
1673 goto _ERR_RECORDER_EXIT;
1678 ret = _recorder_client_wait_for_cb_return(MUSE_RECORDER_API_CREATE, pc->cb_info, RECORDER_CB_TIMEOUT);
1680 pc->cb_info->api_waiting[MUSE_RECORDER_API_CREATE] = 0;
1682 if (ret != RECORDER_ERROR_NONE) {
1683 REC_LOG_ERROR("API_CREATE failed[0x%x]", ret);
1684 goto _ERR_RECORDER_EXIT;
1687 /* get log level from message */
1688 muse_recorder_msg_get(log_level, pc->cb_info->recv_msg);
1689 g_recorder_log_level = log_level;
1691 muse_recorder_msg_get_pointer(handle, pc->cb_info->recv_msg);
1694 REC_LOG_ERROR("Receiving Handle Failed!!");
1695 ret = RECORDER_ERROR_INVALID_OPERATION;
1696 goto _ERR_RECORDER_AFTER_CREATE;
1700 if (!_recorder_client_get_root_directory(&root_directory) || root_directory == NULL) {
1702 REC_LOG_ERROR("failed to get root directory of internal storage");
1703 ret = RECORDER_ERROR_INVALID_OPERATION;
1704 goto _ERR_RECORDER_AFTER_CREATE;
1708 REC_LOG_INFO("root directory[%s], log level[%d]", root_directory, g_recorder_log_level);
1710 _recorder_msg_send_param(MUSE_RECORDER_API_ATTR_SET_ROOT_DIRECTORY, pc->cb_info, &ret,
1711 MUSE_TYPE_STRING, "root_directory", (void *)root_directory);
1713 if (ret != RECORDER_ERROR_NONE) {
1714 REC_LOG_ERROR("failed to set root directory[%s]", root_directory);
1715 ret = RECORDER_ERROR_INVALID_OPERATION;
1716 goto _ERR_RECORDER_AFTER_CREATE;
1719 free(root_directory);
1720 root_directory = NULL;
1722 pc->remote_handle = handle;
1723 pc->cb_info->bufmgr = bufmgr;
1725 REC_LOG_INFO("recorder type[%d][%p] create success : remote handle[%td]",
1726 type, pc, pc->remote_handle);
1728 *recorder = (recorder_h)pc;
1730 REC_LOG_INFO("done");
1732 return RECORDER_ERROR_NONE;
1734 _ERR_RECORDER_AFTER_CREATE:
1735 _recorder_msg_send(MUSE_RECORDER_API_DESTROY, pc->cb_info, &destroy_ret, RECORDER_CB_TIMEOUT);
1736 REC_LOG_ERROR("destroy return[0x%x]", destroy_ret);
1739 tbm_bufmgr_deinit(bufmgr);
1742 if (root_directory) {
1743 free(root_directory);
1744 root_directory = NULL;
1748 muse_client_close(sock_fd);
1754 _recorder_client_callback_destroy(pc->cb_info);
1766 static int _recorder_stop(recorder_h recorder, muse_recorder_api_e api)
1768 int ret = RECORDER_ERROR_NONE;
1769 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1770 recorder_state_e current_state = RECORDER_STATE_NONE;
1772 if (!pc || !pc->cb_info) {
1773 REC_LOG_ERROR("NULL handle");
1774 return RECORDER_ERROR_INVALID_PARAMETER;
1777 REC_LOG_INFO("ENTER - api[%d]", api);
1781 ret = recorder_get_state(recorder, ¤t_state);
1782 if (ret != RECORDER_ERROR_NONE) {
1783 REC_LOG_ERROR("failed to get current state[0x%x]", ret);
1784 return RECORDER_ERROR_INVALID_OPERATION;
1787 if (current_state >= RECORDER_STATE_RECORDING) {
1788 ret = camera_stop_evas_rendering(pc->camera, true);
1789 if (ret != CAMERA_ERROR_NONE) {
1790 REC_LOG_ERROR("camera_stop_evas_rendering failed[0x%x]", ret);
1791 return RECORDER_ERROR_INVALID_OPERATION;
1797 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
1799 if (pc->camera && current_state >= RECORDER_STATE_RECORDING)
1800 camera_start_evas_rendering(pc->camera);
1802 REC_LOG_INFO("ret[0x%x]", ret);
1808 int recorder_create_videorecorder(camera_h camera, recorder_h *recorder)
1810 return _recorder_create_common(recorder, MUSE_RECORDER_TYPE_VIDEO, camera);
1814 int recorder_create_audiorecorder(recorder_h *recorder)
1816 return _recorder_create_common(recorder, MUSE_RECORDER_TYPE_AUDIO, NULL);
1820 int recorder_get_state(recorder_h recorder, recorder_state_e *state)
1822 int ret = RECORDER_ERROR_NONE;
1823 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1824 muse_recorder_api_e api = MUSE_RECORDER_API_GET_STATE;
1826 if (!pc || !pc->cb_info) {
1827 REC_LOG_ERROR("NULL handle");
1828 return RECORDER_ERROR_INVALID_PARAMETER;
1831 if (state == NULL) {
1832 REC_LOG_ERROR("NULL pointer state");
1833 return RECORDER_ERROR_INVALID_PARAMETER;
1836 REC_LOG_INFO("Enter, remote_handle[%td]", pc->remote_handle);
1838 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
1840 if (ret == RECORDER_ERROR_NONE)
1841 *state = (recorder_state_e)pc->cb_info->get_int_value[_RECORDER_GET_INT_STATE];
1843 REC_LOG_INFO("ret[0x%x], state[%d]", ret, *state);
1849 int recorder_destroy(recorder_h recorder)
1851 int ret = RECORDER_ERROR_NONE;
1852 muse_recorder_api_e api = MUSE_RECORDER_API_DESTROY;
1853 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1855 if (!pc || !pc->cb_info) {
1856 REC_LOG_ERROR("NULL handle");
1857 return RECORDER_ERROR_INVALID_PARAMETER;
1860 REC_LOG_INFO("ENTER");
1862 if (pc->cb_info->is_server_connected)
1863 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
1865 REC_LOG_WARNING("server disconnected. release resource without send message.");
1867 if (ret == RECORDER_ERROR_NONE) {
1868 _recorder_client_callback_destroy(pc->cb_info);
1873 REC_LOG_INFO("ret[0x%x]", ret);
1879 int recorder_prepare(recorder_h recorder)
1881 int ret = RECORDER_ERROR_NONE;
1882 muse_recorder_api_e api = MUSE_RECORDER_API_PREPARE;
1883 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1885 if (!pc || !pc->cb_info) {
1886 REC_LOG_ERROR("NULL handle");
1887 return RECORDER_ERROR_INVALID_PARAMETER;
1890 REC_LOG_INFO("ENTER");
1892 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
1894 REC_LOG_INFO("ret[0x%x]", ret);
1896 if (ret == RECORDER_ERROR_NONE && pc->camera)
1897 camera_start_evas_rendering(pc->camera);
1903 int recorder_unprepare(recorder_h recorder)
1905 int ret = RECORDER_ERROR_NONE;
1906 muse_recorder_api_e api = MUSE_RECORDER_API_UNPREPARE;
1907 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1908 camera_state_e camera_state = CAMERA_STATE_NONE;
1910 if (!pc || !pc->cb_info) {
1911 REC_LOG_ERROR("NULL handle");
1912 return RECORDER_ERROR_INVALID_PARAMETER;
1915 REC_LOG_INFO("ENTER");
1919 ret = camera_get_state(pc->camera, &camera_state);
1920 if (ret != CAMERA_ERROR_NONE) {
1921 REC_LOG_ERROR("failed to get camera state[0x%x]", ret);
1922 return RECORDER_ERROR_INVALID_OPERATION;
1925 if (camera_state == CAMERA_STATE_PREVIEW) {
1926 ret = camera_stop_evas_rendering(pc->camera, false);
1927 if (ret != CAMERA_ERROR_NONE) {
1928 REC_LOG_ERROR("camera_stop_evas_rendering failed[0x%x]", ret);
1929 return RECORDER_ERROR_INVALID_OPERATION;
1935 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
1937 REC_LOG_INFO("ret[0x%x]", ret);
1943 int recorder_start(recorder_h recorder)
1945 int ret = RECORDER_ERROR_NONE;
1946 muse_recorder_api_e api = MUSE_RECORDER_API_START;
1947 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1948 recorder_state_e current_state = RECORDER_STATE_NONE;
1950 if (!pc || !pc->cb_info) {
1951 REC_LOG_ERROR("NULL handle");
1952 return RECORDER_ERROR_INVALID_PARAMETER;
1955 REC_LOG_INFO("ENTER");
1959 ret = recorder_get_state(recorder, ¤t_state);
1960 if (ret != RECORDER_ERROR_NONE) {
1961 REC_LOG_ERROR("failed to get current state[0x%x]", ret);
1962 return RECORDER_ERROR_INVALID_OPERATION;
1965 if (current_state == RECORDER_STATE_READY) {
1966 ret = camera_stop_evas_rendering(pc->camera, true);
1967 if (ret != CAMERA_ERROR_NONE) {
1968 REC_LOG_ERROR("camera_stop_evas_rendering failed[0x%x]", ret);
1969 return RECORDER_ERROR_INVALID_OPERATION;
1975 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_NO_TIMEOUT);
1977 if (pc->camera && current_state == RECORDER_STATE_READY)
1978 camera_start_evas_rendering(pc->camera);
1980 REC_LOG_INFO("ret[0x%x]", ret);
1986 int recorder_pause(recorder_h recorder)
1988 int ret = RECORDER_ERROR_NONE;
1989 muse_recorder_api_e api = MUSE_RECORDER_API_PAUSE;
1990 recorder_cli_s *pc = (recorder_cli_s *)recorder;
1992 if (!pc || !pc->cb_info) {
1993 REC_LOG_ERROR("NULL handle");
1994 return RECORDER_ERROR_INVALID_PARAMETER;
1997 REC_LOG_INFO("ENTER");
1999 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2001 REC_LOG_INFO("ret[0x%x]", ret);
2007 int recorder_commit(recorder_h recorder)
2009 return _recorder_stop(recorder, MUSE_RECORDER_API_COMMIT);
2013 int recorder_cancel(recorder_h recorder)
2015 return _recorder_stop(recorder, MUSE_RECORDER_API_CANCEL);
2019 int recorder_set_video_resolution(recorder_h recorder, int width, int height)
2022 muse_recorder_api_e api = MUSE_RECORDER_API_SET_VIDEO_RESOLUTION;
2023 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2025 if (!pc || !pc->cb_info) {
2026 REC_LOG_ERROR("NULL handle");
2027 return RECORDER_ERROR_INVALID_PARAMETER;
2030 REC_LOG_INFO("ENTER");
2032 msg = muse_core_msg_new(api,
2033 MUSE_TYPE_INT, "width", width,
2034 MUSE_TYPE_INT, "height", height,
2037 return __send_msg_free(api, pc->cb_info, msg, RECORDER_CB_TIMEOUT);
2041 int recorder_get_video_resolution(recorder_h recorder, int *width, int *height)
2043 int ret = RECORDER_ERROR_NONE;
2044 muse_recorder_api_e api = MUSE_RECORDER_API_GET_VIDEO_RESOLUTION;
2045 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2047 if (!pc || !pc->cb_info) {
2048 REC_LOG_ERROR("NULL handle");
2049 return RECORDER_ERROR_INVALID_PARAMETER;
2052 if (!width || !height) {
2053 REC_LOG_ERROR("NULL pointer width = [%p], height = [%p]", width, height);
2054 return RECORDER_ERROR_INVALID_PARAMETER;
2057 REC_LOG_INFO("ENTER");
2059 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2061 if (ret == RECORDER_ERROR_NONE) {
2062 *width = pc->cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_RESOLUTION] >> 16;
2063 *height = (0x0000ffff & pc->cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_RESOLUTION]);
2066 REC_LOG_INFO("ret[0x%x],[%d]x%d", ret, *width, *height);
2072 int recorder_foreach_supported_video_resolution(recorder_h recorder,
2073 recorder_supported_video_resolution_cb foreach_cb, void *user_data)
2075 int ret = RECORDER_ERROR_NONE;
2076 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2077 muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_RESOLUTION;
2079 if (!pc || !pc->cb_info || foreach_cb == NULL) {
2080 REC_LOG_ERROR("INVALID_PARAMETER(0x%08x)", RECORDER_ERROR_INVALID_PARAMETER);
2081 return RECORDER_ERROR_INVALID_PARAMETER;
2084 REC_LOG_INFO("Enter, handle[%td]", pc->remote_handle);
2086 pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_RESOLUTION] = foreach_cb;
2087 pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_RESOLUTION] = user_data;
2089 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2091 REC_LOG_INFO("ret[0x%x]", ret);
2097 int recorder_get_audio_level(recorder_h recorder, double *level)
2099 int ret = RECORDER_ERROR_NONE;
2100 muse_recorder_api_e api = MUSE_RECORDER_API_GET_AUDIO_LEVEL;
2101 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2103 if (!pc || !pc->cb_info || level == NULL) {
2104 REC_LOG_ERROR("NULL pointer[%p][%p]", pc, level);
2105 return RECORDER_ERROR_INVALID_PARAMETER;
2108 REC_LOG_INFO("ENTER");
2110 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2112 if (ret == RECORDER_ERROR_NONE)
2113 *level = pc->cb_info->get_double_value[_RECORDER_GET_DOUBLE_AUDIO_LEVEL];
2115 REC_LOG_INFO("ret[0x%x], level %lf", ret, *level);
2121 int recorder_set_filename(recorder_h recorder, const char *filename)
2123 int ret = RECORDER_ERROR_NONE;
2125 muse_recorder_api_e api = MUSE_RECORDER_API_SET_FILENAME;
2126 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2127 char set_filename[RECORDER_FILENAME_MAX] = {'\0',};
2129 if (!pc || !pc->cb_info) {
2130 REC_LOG_ERROR("NULL handle");
2131 return RECORDER_ERROR_INVALID_PARAMETER;
2134 if (filename == NULL) {
2135 REC_LOG_ERROR("filename is NULL");
2136 return RECORDER_ERROR_INVALID_PARAMETER;
2139 REC_LOG_INFO("ENTER[%s]", filename);
2141 length = strlen(filename);
2143 if (length >= RECORDER_FILENAME_MAX - 1) {
2144 REC_LOG_ERROR("too long file name [%zu]", length);
2145 return RECORDER_ERROR_INVALID_PARAMETER;
2148 if (storage_get_origin_internal_path(filename, RECORDER_FILENAME_MAX, set_filename) < 0) {
2149 /* Cannot convert. Use original path. */
2150 strncpy(set_filename, filename, length + 1);
2151 pc->cb_info->is_filename_converted = FALSE;
2153 /* Converted. Use converted path. */
2154 REC_LOG_INFO("Converted filename[%s] ->[%s]", filename, set_filename);
2155 pc->cb_info->is_filename_converted = TRUE;
2158 _recorder_msg_send_param(api, pc->cb_info, &ret,
2159 MUSE_TYPE_STRING, "set_filename", (void *)set_filename);
2161 REC_LOG_INFO("ret[0x%x]", ret);
2167 int recorder_get_filename(recorder_h recorder, char **filename)
2169 int ret = RECORDER_ERROR_NONE;
2170 muse_recorder_api_e api = MUSE_RECORDER_API_GET_FILENAME;
2171 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2172 char compat_filename[RECORDER_FILENAME_MAX] = {0, };
2174 if (!pc || !pc->cb_info) {
2175 REC_LOG_ERROR("NULL handle");
2176 return RECORDER_ERROR_INVALID_PARAMETER;
2179 if (filename == NULL) {
2180 REC_LOG_ERROR("filename is NULL");
2181 return RECORDER_ERROR_INVALID_PARAMETER;
2184 REC_LOG_INFO("ENTER");
2186 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2188 if (ret == RECORDER_ERROR_NONE) {
2189 if (pc->cb_info->is_filename_converted == FALSE ||
2190 storage_get_compat_internal_path(pc->cb_info->get_filename, RECORDER_FILENAME_MAX, compat_filename) < 0) {
2191 /* Use original path. */
2192 *filename = pc->cb_info->get_filename;
2194 /* Converted. Use converted path. */
2195 REC_LOG_INFO("Converted filename[%s] ->[%s]", pc->cb_info->get_filename, compat_filename);
2196 *filename = strdup(compat_filename);
2197 free(pc->cb_info->get_filename);
2200 pc->cb_info->get_filename = NULL;
2203 REC_LOG_INFO("ret[0x%x], filename[%s]", ret, (*filename) ? *filename : "NULL");
2209 int recorder_set_file_format(recorder_h recorder, recorder_file_format_e format)
2211 return _recorder_set_int(recorder, MUSE_RECORDER_API_SET_FILE_FORMAT, "set_format", format);
2215 int recorder_get_file_format(recorder_h recorder, recorder_file_format_e *format)
2217 int ret = RECORDER_ERROR_NONE;
2218 muse_recorder_api_e api = MUSE_RECORDER_API_GET_FILE_FORMAT;
2219 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2221 if (!pc || !pc->cb_info) {
2222 REC_LOG_ERROR("NULL handle");
2223 return RECORDER_ERROR_INVALID_PARAMETER;
2226 if (format == NULL) {
2227 REC_LOG_ERROR("NULL pointer data");
2228 return RECORDER_ERROR_INVALID_PARAMETER;
2231 REC_LOG_INFO("ENTER");
2233 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2235 if (ret == RECORDER_ERROR_NONE)
2236 *format = (recorder_file_format_e)pc->cb_info->get_int_value[_RECORDER_GET_INT_FILE_FORMAT];
2238 REC_LOG_INFO("ret[0x%x], format[%d]", ret, *format);
2244 int recorder_set_sound_stream_info(recorder_h recorder, sound_stream_info_h stream_info)
2246 int ret = RECORDER_ERROR_NONE;
2247 muse_recorder_api_e api = MUSE_RECORDER_API_SET_SOUND_STREAM_INFO;
2248 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2249 bool is_available = false;
2250 int stream_index = 0;
2251 char *stream_type = NULL;
2254 if (!pc || !pc->cb_info || stream_info == NULL) {
2255 REC_LOG_ERROR("NULL handle");
2256 return RECORDER_ERROR_INVALID_PARAMETER;
2259 REC_LOG_INFO("ENTER");
2261 ret = sound_manager_is_available_stream_information(stream_info, NATIVE_API_RECORDER, &is_available);
2262 if (ret != SOUND_MANAGER_ERROR_NONE) {
2263 REC_LOG_ERROR("stream info verification failed");
2264 return RECORDER_ERROR_INVALID_OPERATION;
2267 if (is_available == false) {
2268 REC_LOG_ERROR("stream information is not available");
2269 return RECORDER_ERROR_INVALID_OPERATION;
2272 ret = sound_manager_get_type_from_stream_information(stream_info, &stream_type);
2273 ret |= sound_manager_get_index_from_stream_information(stream_info, &stream_index);
2275 if (ret != SOUND_MANAGER_ERROR_NONE) {
2276 REC_LOG_ERROR("sound manager failed[0x%x]", ret);
2277 return RECORDER_ERROR_INVALID_OPERATION;
2280 msg = muse_core_msg_new(api,
2281 MUSE_TYPE_STRING, "stream_type", stream_type,
2282 MUSE_TYPE_INT, "stream_index", stream_index,
2285 return __send_msg_free(api, pc->cb_info, msg, RECORDER_CB_TIMEOUT);
2289 int recorder_set_state_changed_cb(recorder_h recorder, recorder_state_changed_cb callback, void *user_data)
2291 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_STATE_CHANGED_CB,
2292 MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE, true, callback, user_data);
2296 int recorder_unset_state_changed_cb(recorder_h recorder)
2298 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_STATE_CHANGED_CB,
2299 MUSE_RECORDER_EVENT_TYPE_STATE_CHANGE, false, NULL, NULL);
2303 int recorder_set_interrupted_cb(recorder_h recorder, recorder_interrupted_cb callback, void *user_data)
2305 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_INTERRUPTED_CB,
2306 MUSE_RECORDER_EVENT_TYPE_INTERRUPTED, true, callback, user_data);
2310 int recorder_unset_interrupted_cb(recorder_h recorder)
2312 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_INTERRUPTED_CB,
2313 MUSE_RECORDER_EVENT_TYPE_INTERRUPTED, false, NULL, NULL);
2317 int recorder_set_interrupt_started_cb(recorder_h recorder, recorder_interrupt_started_cb callback, void *user_data)
2319 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_INTERRUPT_STARTED_CB,
2320 MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED, true, callback, user_data);
2324 int recorder_unset_interrupt_started_cb(recorder_h recorder)
2326 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_INTERRUPT_STARTED_CB,
2327 MUSE_RECORDER_EVENT_TYPE_INTERRUPT_STARTED, false, NULL, NULL);
2331 int recorder_set_audio_stream_cb(recorder_h recorder, recorder_audio_stream_cb callback, void *user_data)
2333 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_AUDIO_STREAM_CB,
2334 MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM, true, callback, user_data);
2338 int recorder_unset_audio_stream_cb(recorder_h recorder)
2340 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_AUDIO_STREAM_CB,
2341 MUSE_RECORDER_EVENT_TYPE_AUDIO_STREAM, false, NULL, NULL);
2345 int recorder_set_muxed_stream_cb(recorder_h recorder, recorder_muxed_stream_cb callback, void *user_data)
2347 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_MUXED_STREAM_CB,
2348 MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM, true, callback, user_data);
2352 int recorder_unset_muxed_stream_cb(recorder_h recorder)
2354 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_MUXED_STREAM_CB,
2355 MUSE_RECORDER_EVENT_TYPE_MUXED_STREAM, false, NULL, NULL);
2359 int recorder_set_video_encode_decision_cb(recorder_h recorder, recorder_video_encode_decision_cb callback, void *user_data)
2361 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_VIDEO_ENCODE_DECISION_CB,
2362 MUSE_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION, true, callback, user_data);
2366 int recorder_unset_video_encode_decision_cb(recorder_h recorder)
2368 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_VIDEO_ENCODE_DECISION_CB,
2369 MUSE_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION, false, NULL, NULL);
2373 int recorder_set_error_cb(recorder_h recorder, recorder_error_cb callback, void *user_data)
2375 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_ERROR_CB,
2376 MUSE_RECORDER_EVENT_TYPE_ERROR, true, callback, user_data);
2380 int recorder_unset_error_cb(recorder_h recorder)
2382 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_ERROR_CB,
2383 MUSE_RECORDER_EVENT_TYPE_ERROR, false, NULL, NULL);
2387 int recorder_set_recording_status_cb(recorder_h recorder, recorder_recording_status_cb callback, void *user_data)
2389 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_RECORDING_STATUS_CB,
2390 MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS, true, callback, user_data);
2394 int recorder_unset_recording_status_cb(recorder_h recorder)
2396 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_RECORDING_STATUS_CB,
2397 MUSE_RECORDER_EVENT_TYPE_RECORDING_STATUS, false, NULL, NULL);
2401 int recorder_set_recording_limit_reached_cb(recorder_h recorder, recorder_recording_limit_reached_cb callback, void *user_data)
2403 return _recorder_set_cb(recorder, MUSE_RECORDER_API_SET_RECORDING_LIMIT_REACHED_CB,
2404 MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED, true, callback, user_data);
2408 int recorder_unset_recording_limit_reached_cb(recorder_h recorder)
2410 return _recorder_set_cb(recorder, MUSE_RECORDER_API_UNSET_RECORDING_LIMIT_REACHED_CB,
2411 MUSE_RECORDER_EVENT_TYPE_RECORDING_LIMITED, false, NULL, NULL);
2415 int recorder_foreach_supported_file_format(recorder_h recorder, recorder_supported_file_format_cb foreach_cb, void *user_data)
2417 int ret = RECORDER_ERROR_NONE;
2418 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2419 muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_FILE_FORMAT;
2421 if (!pc || !pc->cb_info || foreach_cb == NULL) {
2422 REC_LOG_ERROR("INVALID_PARAMETER(0x%08x)", RECORDER_ERROR_INVALID_PARAMETER);
2423 return RECORDER_ERROR_INVALID_PARAMETER;
2426 REC_LOG_INFO("Enter, handle[%td]", pc->remote_handle);
2428 pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_FILE_FORMAT] = foreach_cb;
2429 pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_FILE_FORMAT] = user_data;
2431 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2433 REC_LOG_INFO("ret[0x%x]", ret);
2439 int recorder_attr_set_size_limit(recorder_h recorder, int kbyte)
2441 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_SIZE_LIMIT, "kbyte", kbyte);
2445 int recorder_attr_set_time_limit(recorder_h recorder, int second)
2447 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_TIME_LIMIT, "second", second);
2451 int recorder_attr_set_audio_device(recorder_h recorder, recorder_audio_device_e device)
2453 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_AUDIO_DEVICE, "set_device", device);
2457 int recorder_set_audio_encoder(recorder_h recorder, recorder_audio_codec_e codec)
2459 return _recorder_set_int(recorder, MUSE_RECORDER_API_SET_AUDIO_ENCODER, "set_codec", codec);
2463 int recorder_get_audio_encoder(recorder_h recorder, recorder_audio_codec_e *codec)
2465 int ret = RECORDER_ERROR_NONE;
2466 muse_recorder_api_e api = MUSE_RECORDER_API_GET_AUDIO_ENCODER;
2467 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2469 if (!pc || !pc->cb_info) {
2470 REC_LOG_ERROR("NULL handle");
2471 return RECORDER_ERROR_INVALID_PARAMETER;
2474 if (codec == NULL) {
2475 REC_LOG_ERROR("codec is NULL");
2476 return RECORDER_ERROR_INVALID_PARAMETER;
2479 REC_LOG_INFO("ENTER");
2481 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2483 if (ret == RECORDER_ERROR_NONE)
2484 *codec = (recorder_audio_codec_e)pc->cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_ENCODER];
2486 REC_LOG_INFO("ret[0x%x], codec[%d]", ret, *codec);
2492 int recorder_set_video_encoder(recorder_h recorder, recorder_video_codec_e codec)
2494 return _recorder_set_int(recorder, MUSE_RECORDER_API_SET_VIDEO_ENCODER, "set_codec", codec);
2498 int recorder_get_video_encoder(recorder_h recorder, recorder_video_codec_e *codec)
2500 int ret = RECORDER_ERROR_NONE;
2501 muse_recorder_api_e api = MUSE_RECORDER_API_GET_VIDEO_ENCODER;
2502 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2504 if (!pc || !pc->cb_info) {
2505 REC_LOG_ERROR("NULL handle");
2506 return RECORDER_ERROR_INVALID_PARAMETER;
2509 if (codec == NULL) {
2510 REC_LOG_ERROR("codec is NULL");
2511 return RECORDER_ERROR_INVALID_PARAMETER;
2514 REC_LOG_INFO("ENTER");
2516 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2518 if (ret == RECORDER_ERROR_NONE)
2519 *codec = (recorder_video_codec_e)pc->cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_ENCODER];
2521 REC_LOG_INFO("ret[0x%x], codec[%d]", ret, *codec);
2527 int recorder_attr_set_audio_samplerate(recorder_h recorder, int samplerate)
2529 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_AUDIO_SAMPLERATE, "samplerate", samplerate);
2533 int recorder_attr_set_audio_encoder_bitrate(recorder_h recorder, int bitrate)
2535 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_AUDIO_ENCODER_BITRATE, "bitrate", bitrate);
2539 int recorder_attr_set_video_encoder_bitrate(recorder_h recorder, int bitrate)
2541 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_VIDEO_ENCODER_BITRATE, "bitrate", bitrate);
2545 int recorder_attr_get_size_limit(recorder_h recorder, int *kbyte)
2547 int ret = RECORDER_ERROR_NONE;
2548 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_SIZE_LIMIT;
2549 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2551 if (!pc || !pc->cb_info) {
2552 REC_LOG_ERROR("NULL handle");
2553 return RECORDER_ERROR_INVALID_PARAMETER;
2556 if (kbyte == NULL) {
2557 REC_LOG_ERROR("NULL pointer kbyte");
2558 return RECORDER_ERROR_INVALID_PARAMETER;
2561 REC_LOG_INFO("ENTER");
2563 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2565 if (ret == RECORDER_ERROR_NONE)
2566 *kbyte = pc->cb_info->get_int_value[_RECORDER_GET_INT_SIZE_LIMIT];
2568 REC_LOG_INFO("ret[0x%x],[%d] kbyte", ret, *kbyte);
2574 int recorder_attr_get_time_limit(recorder_h recorder, int *second)
2576 int ret = RECORDER_ERROR_NONE;
2577 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_TIME_LIMIT;
2578 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2580 if (!pc || !pc->cb_info) {
2581 REC_LOG_ERROR("NULL handle");
2582 return RECORDER_ERROR_INVALID_PARAMETER;
2585 if (second == NULL) {
2586 REC_LOG_ERROR("NULL pointer second");
2587 return RECORDER_ERROR_INVALID_PARAMETER;
2590 REC_LOG_INFO("ENTER");
2592 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2594 if (ret == RECORDER_ERROR_NONE)
2595 *second = pc->cb_info->get_int_value[_RECORDER_GET_INT_TIME_LIMIT];
2597 REC_LOG_INFO("ret[0x%x],[%d] second", ret, *second);
2603 int recorder_attr_get_audio_device(recorder_h recorder, recorder_audio_device_e *device)
2605 int ret = RECORDER_ERROR_NONE;
2606 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_AUDIO_DEVICE;
2607 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2609 if (!pc || !pc->cb_info) {
2610 REC_LOG_ERROR("NULL handle");
2611 return RECORDER_ERROR_INVALID_PARAMETER;
2614 if (device == NULL) {
2615 REC_LOG_ERROR("NULL pointer device");
2616 return RECORDER_ERROR_INVALID_PARAMETER;
2619 REC_LOG_INFO("ENTER");
2621 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2623 if (ret == RECORDER_ERROR_NONE)
2624 *device = (recorder_audio_device_e)pc->cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_DEVICE];
2626 REC_LOG_INFO("ret[0x%x], device[%d]", ret, *device);
2632 int recorder_attr_get_audio_samplerate(recorder_h recorder, int *samplerate)
2634 int ret = RECORDER_ERROR_NONE;
2635 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_AUDIO_SAMPLERATE;
2636 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2638 if (!pc || !pc->cb_info) {
2639 REC_LOG_ERROR("NULL handle");
2640 return RECORDER_ERROR_INVALID_PARAMETER;
2643 if (samplerate == NULL) {
2644 REC_LOG_ERROR("NULL pointer handle");
2645 return RECORDER_ERROR_INVALID_PARAMETER;
2648 REC_LOG_INFO("ENTER");
2650 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2652 if (ret == RECORDER_ERROR_NONE)
2653 *samplerate = pc->cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_SAMPLERATE];
2655 REC_LOG_INFO("ret[0x%x], samplerate[%d]", ret, *samplerate);
2661 int recorder_attr_get_audio_encoder_bitrate(recorder_h recorder, int *bitrate)
2663 int ret = RECORDER_ERROR_NONE;
2664 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_AUDIO_ENCODER_BITRATE;
2665 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2667 if (!pc || !pc->cb_info) {
2668 REC_LOG_ERROR("NULL handle");
2669 return RECORDER_ERROR_INVALID_PARAMETER;
2672 if (bitrate == NULL) {
2673 REC_LOG_ERROR("NULL pointer");
2674 return RECORDER_ERROR_INVALID_PARAMETER;
2677 REC_LOG_INFO("ENTER");
2679 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2681 if (ret == RECORDER_ERROR_NONE)
2682 *bitrate = pc->cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_ENCODER_BITRATE];
2684 REC_LOG_INFO("ret[0x%x], bitrate[%d]", ret, *bitrate);
2690 int recorder_attr_get_video_encoder_bitrate(recorder_h recorder, int *bitrate)
2692 int ret = RECORDER_ERROR_NONE;
2693 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_VIDEO_ENCODER_BITRATE;
2694 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2696 if (!pc || !pc->cb_info) {
2697 REC_LOG_ERROR("NULL handle");
2698 return RECORDER_ERROR_INVALID_PARAMETER;
2701 if (bitrate == NULL) {
2702 REC_LOG_ERROR("NULL pointer");
2703 return RECORDER_ERROR_INVALID_PARAMETER;
2706 REC_LOG_INFO("ENTER");
2708 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2710 if (ret == RECORDER_ERROR_NONE)
2711 *bitrate = pc->cb_info->get_int_value[_RECORDER_GET_INT_VIDEO_ENCODER_BITRATE];
2713 REC_LOG_INFO("ret[0x%x]", ret);
2719 int recorder_foreach_supported_audio_encoder(recorder_h recorder, recorder_supported_audio_encoder_cb foreach_cb, void *user_data)
2721 int ret = RECORDER_ERROR_NONE;
2722 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2723 muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_AUDIO_ENCODER;
2725 if (!pc || !pc->cb_info || foreach_cb == NULL) {
2726 REC_LOG_ERROR("INVALID_PARAMETER(0x%08x)", RECORDER_ERROR_INVALID_PARAMETER);
2727 return RECORDER_ERROR_INVALID_PARAMETER;
2730 REC_LOG_INFO("Enter, handle[%td]", pc->remote_handle);
2732 pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_AUDIO_ENCODER] = foreach_cb;
2733 pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_AUDIO_ENCODER] = user_data;
2735 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2737 REC_LOG_INFO("ret[0x%x]", ret);
2743 int recorder_foreach_supported_video_encoder(recorder_h recorder, recorder_supported_video_encoder_cb foreach_cb, void *user_data)
2745 int ret = RECORDER_ERROR_NONE;
2746 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2747 muse_recorder_api_e api = MUSE_RECORDER_API_FOREACH_SUPPORTED_VIDEO_ENCODER;
2749 if (!pc || !pc->cb_info || foreach_cb == NULL) {
2750 REC_LOG_ERROR("INVALID_PARAMETER(0x%08x)", RECORDER_ERROR_INVALID_PARAMETER);
2751 return RECORDER_ERROR_INVALID_PARAMETER;
2754 REC_LOG_INFO("Enter, handle[%td]", pc->remote_handle);
2756 pc->cb_info->user_cb[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_ENCODER] = foreach_cb;
2757 pc->cb_info->user_data[MUSE_RECORDER_EVENT_TYPE_FOREACH_SUPPORTED_VIDEO_ENCODER] = user_data;
2759 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2761 REC_LOG_INFO("ret[0x%x]", ret);
2767 int recorder_attr_set_mute(recorder_h recorder, bool enable)
2769 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_MUTE, "set_enable", enable);
2773 bool recorder_attr_is_muted(recorder_h recorder)
2776 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_IS_MUTED;
2777 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2779 if (!pc || !pc->cb_info) {
2780 REC_LOG_ERROR("NULL handle");
2784 REC_LOG_INFO("ENTER");
2786 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2788 if (ret == RECORDER_ERROR_SERVICE_DISCONNECTED)
2791 REC_LOG_INFO("ret[%d]", ret);
2797 int recorder_attr_set_recording_motion_rate(recorder_h recorder, double rate)
2799 int ret = RECORDER_ERROR_NONE;
2800 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_SET_RECORDING_MOTION_RATE;
2801 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2803 if (!pc || !pc->cb_info) {
2804 REC_LOG_ERROR("NULL handle");
2805 return RECORDER_ERROR_INVALID_PARAMETER;
2808 REC_LOG_INFO("ENTER - %.20lf", rate);
2810 _recorder_msg_send_param(api, pc->cb_info, &ret,
2811 MUSE_TYPE_DOUBLE, "rate", (void *)&rate);
2813 REC_LOG_INFO("ret[0x%x]", ret);
2819 int recorder_attr_get_recording_motion_rate(recorder_h recorder, double *rate)
2821 int ret = RECORDER_ERROR_NONE;
2822 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_RECORDING_MOTION_RATE;
2823 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2825 if (!pc || !pc->cb_info) {
2826 REC_LOG_ERROR("NULL handle");
2827 return RECORDER_ERROR_INVALID_PARAMETER;
2831 REC_LOG_ERROR("rate is NULL");
2832 return RECORDER_ERROR_INVALID_PARAMETER;
2835 REC_LOG_INFO("ENTER");
2837 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2838 if (ret == RECORDER_ERROR_NONE)
2839 *rate = pc->cb_info->get_double_value[_RECORDER_GET_DOUBLE_RECORDING_MOTION_RATE];
2841 REC_LOG_INFO("ret[0x%x] - rate %.20lf", ret, *rate);
2847 int recorder_attr_set_audio_channel(recorder_h recorder, int channel_count)
2849 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_AUDIO_CHANNEL, "channel_count", channel_count);
2853 int recorder_attr_get_audio_channel(recorder_h recorder, int *channel_count)
2855 int ret = RECORDER_ERROR_NONE;
2856 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_AUDIO_CHANNEL;
2857 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2859 if (!pc || !pc->cb_info) {
2860 REC_LOG_ERROR("NULL handle");
2861 return RECORDER_ERROR_INVALID_PARAMETER;
2864 if (channel_count == NULL) {
2865 REC_LOG_ERROR("channel_count is NULL");
2866 return RECORDER_ERROR_INVALID_PARAMETER;
2869 REC_LOG_INFO("ENTER");
2871 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2873 if (ret == RECORDER_ERROR_NONE)
2874 *channel_count = pc->cb_info->get_int_value[_RECORDER_GET_INT_AUDIO_CHANNEL];
2876 REC_LOG_INFO("ret[0x%x], channel count[%d]", ret, *channel_count);
2882 int recorder_attr_set_orientation_tag(recorder_h recorder, recorder_rotation_e orientation)
2884 return _recorder_set_int(recorder, MUSE_RECORDER_API_ATTR_SET_ORIENTATION_TAG, "set_orientation", orientation);
2888 int recorder_attr_get_orientation_tag(recorder_h recorder, recorder_rotation_e *orientation)
2890 int ret = RECORDER_ERROR_NONE;
2891 muse_recorder_api_e api = MUSE_RECORDER_API_ATTR_GET_ORIENTATION_TAG;
2892 recorder_cli_s *pc = (recorder_cli_s *)recorder;
2894 if (!pc || !pc->cb_info) {
2895 REC_LOG_ERROR("NULL handle");
2896 return RECORDER_ERROR_INVALID_PARAMETER;
2899 if (orientation == NULL) {
2900 REC_LOG_ERROR("orientation is NULL");
2901 return RECORDER_ERROR_INVALID_PARAMETER;
2904 REC_LOG_INFO("ENTER");
2906 _recorder_msg_send(api, pc->cb_info, &ret, RECORDER_CB_TIMEOUT);
2908 if (ret == RECORDER_ERROR_NONE)
2909 *orientation = (recorder_rotation_e)pc->cb_info->get_int_value[_RECORDER_GET_INT_ORIENTATION_TAG];
2911 REC_LOG_INFO("ret[0x%x], orientation[%d]", ret, *orientation);
2917 int recorder_get_device_state(recorder_type_e type, recorder_device_state_e *state)
2919 int ret = RECORDER_ERROR_NONE;
2921 int module_index = -1;
2922 int get_device_state = 0;
2923 char *send_msg = NULL;
2924 char recv_msg[MUSE_RECORDER_MSG_MAX_LENGTH] = {'\0',};
2927 REC_LOG_ERROR("NULL pointer");
2928 return RECORDER_ERROR_INVALID_PARAMETER;
2931 REC_LOG_INFO("Enter - type[%d]", type);
2933 sock_fd = muse_client_new();
2936 REC_LOG_ERROR("muse_client_new failed - returned fd[%d]", sock_fd);
2937 ret = RECORDER_ERROR_INVALID_OPERATION;
2938 goto _GET_DEVICE_STATE_EXIT;
2942 if (muse_client_get_module_index(MODULE_NAME, &module_index) != MM_ERROR_NONE) {
2943 REC_LOG_ERROR("muse client get module index failed");
2944 ret = RECORDER_ERROR_INVALID_OPERATION;
2945 goto _GET_DEVICE_STATE_EXIT;
2948 send_msg = muse_core_msg_new(MUSE_RECORDER_API_GET_DEVICE_STATE,
2949 MUSE_TYPE_INT, "module", module_index,
2950 MUSE_TYPE_INT, PARAM_RECORDER_TYPE, type,
2954 REC_LOG_ERROR("NULL msg");
2955 ret = RECORDER_ERROR_OUT_OF_MEMORY;
2956 goto _GET_DEVICE_STATE_EXIT;
2960 REC_LOG_INFO("sock_fd[%d], msg[%s]", sock_fd, send_msg);
2962 ret = muse_core_msg_send(sock_fd, send_msg);
2964 muse_core_msg_free(send_msg);
2969 REC_LOG_ERROR("send msg failed[%d]", errno);
2970 ret = RECORDER_ERROR_INVALID_OPERATION;
2971 goto _GET_DEVICE_STATE_EXIT;
2975 ret = muse_core_msg_recv(sock_fd, recv_msg, MUSE_RECORDER_MSG_MAX_LENGTH);
2978 REC_LOG_ERROR("recv msg failed[%d]", errno);
2979 ret = RECORDER_ERROR_INVALID_OPERATION;
2980 goto _GET_DEVICE_STATE_EXIT;
2984 if (!muse_recorder_msg_get(ret, recv_msg)) {
2986 REC_LOG_ERROR("failed to get return value from msg[%s]", recv_msg);
2987 ret = RECORDER_ERROR_INVALID_OPERATION;
2988 goto _GET_DEVICE_STATE_EXIT;
2992 if (ret == RECORDER_ERROR_NONE) {
2993 if (muse_recorder_msg_get(get_device_state, recv_msg)) {
2994 *state = (recorder_device_state_e)get_device_state;
2995 REC_LOG_INFO("device type[%d] state[%d]", type, *state);
2997 REC_LOG_ERROR("failed to get device state from msg[%s]", recv_msg);
2998 ret = RECORDER_ERROR_INVALID_OPERATION;
3001 REC_LOG_ERROR("failed[0x%x]", ret);
3004 _GET_DEVICE_STATE_EXIT:
3006 muse_client_close(sock_fd);
3014 int recorder_add_device_state_changed_cb(recorder_device_state_changed_cb callback, void *user_data, int *cb_id)
3016 int ret = RECORDER_ERROR_NONE;
3017 recorder_device_state_e state = RECORDER_DEVICE_STATE_IDLE;
3018 recorder_cb_info *info = NULL;
3020 if (!callback || !cb_id) {
3021 REC_LOG_ERROR("invalid pointer[%p][%p]", callback, cb_id);
3022 return RECORDER_ERROR_INVALID_PARAMETER;
3025 g_mutex_lock(&g_rec_dev_state_changed_cb_lock);
3027 /* check recorder support */
3028 ret = recorder_get_device_state(RECORDER_TYPE_AUDIO, &state);
3029 if (ret != RECORDER_ERROR_NONE) {
3030 REC_LOG_ERROR("get device state failed");
3031 g_mutex_unlock(&g_rec_dev_state_changed_cb_lock);
3035 info = g_new0(recorder_cb_info, 1);
3037 REC_LOG_ERROR("info failed");
3038 ret = RECORDER_ERROR_OUT_OF_MEMORY;
3042 info->id = ++g_rec_dev_state_changed_cb_id;
3043 info->callback = (void *)callback;
3044 info->user_data = user_data;
3048 /* subscribe dbus signal for camera state change */
3049 if (!g_rec_dev_state_changed_cb_conn) {
3050 g_rec_dev_state_changed_cb_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
3051 if (!g_rec_dev_state_changed_cb_conn) {
3052 REC_LOG_ERROR("failed to get gdbus connection");
3053 ret = RECORDER_ERROR_INVALID_OPERATION;
3057 REC_LOG_INFO("subscribe signal[%s][%s][%s]",
3058 MM_CAMCORDER_DBUS_OBJECT,
3059 MM_CAMCORDER_DBUS_INTERFACE_RECORDER,
3060 MM_CAMCORDER_DBUS_SIGNAL_STATE_CHANGED);
3062 g_rec_dev_state_changed_cb_subscribe_id = g_dbus_connection_signal_subscribe(g_rec_dev_state_changed_cb_conn,
3063 NULL, MM_CAMCORDER_DBUS_INTERFACE_RECORDER, MM_CAMCORDER_DBUS_SIGNAL_STATE_CHANGED, MM_CAMCORDER_DBUS_OBJECT, NULL,
3064 G_DBUS_SIGNAL_FLAGS_NONE, (GDBusSignalCallback)__recorder_device_state_changed_cb, NULL, NULL);
3065 if (!g_rec_dev_state_changed_cb_subscribe_id) {
3066 REC_LOG_ERROR("failed to get gdbus connection");
3067 ret = RECORDER_ERROR_INVALID_OPERATION;
3071 REC_LOG_INFO("signal subscribe id[%u]", g_rec_dev_state_changed_cb_subscribe_id);
3074 g_rec_dev_state_changed_cb_list = g_list_prepend(g_rec_dev_state_changed_cb_list, (gpointer)info);
3076 REC_LOG_INFO("callback id[%d]", info->id);
3079 if (ret != RECORDER_ERROR_NONE) {
3086 if (g_rec_dev_state_changed_cb_conn) {
3087 g_object_unref(g_rec_dev_state_changed_cb_conn);
3088 g_rec_dev_state_changed_cb_conn = NULL;
3093 g_mutex_unlock(&g_rec_dev_state_changed_cb_lock);
3099 int recorder_remove_device_state_changed_cb(int cb_id)
3101 int ret = RECORDER_ERROR_NONE;
3102 recorder_device_state_e state = RECORDER_DEVICE_STATE_IDLE;
3103 GList *tmp_list = NULL;
3104 recorder_cb_info *info = NULL;
3106 /* check recorder support */
3107 ret = recorder_get_device_state(RECORDER_TYPE_AUDIO, &state);
3108 if (ret != RECORDER_ERROR_NONE) {
3109 REC_LOG_ERROR("get device state failed");
3113 g_mutex_lock(&g_rec_dev_state_changed_cb_lock);
3115 if (!g_rec_dev_state_changed_cb_list) {
3116 REC_LOG_ERROR("there is no callback info");
3117 ret = RECORDER_ERROR_INVALID_OPERATION;
3121 tmp_list = g_rec_dev_state_changed_cb_list;
3124 info = tmp_list->data;
3125 tmp_list = tmp_list->next;
3128 REC_LOG_WARNING("NULL info");
3132 if (info->id == cb_id) {
3133 g_rec_dev_state_changed_cb_list = g_list_remove(g_rec_dev_state_changed_cb_list, info);
3138 if (!g_rec_dev_state_changed_cb_list) {
3139 /* no remained callback */
3140 if (g_rec_dev_state_changed_cb_conn) {
3141 /* unsubscribe signal */
3142 g_dbus_connection_signal_unsubscribe(g_rec_dev_state_changed_cb_conn, g_rec_dev_state_changed_cb_subscribe_id);
3143 g_rec_dev_state_changed_cb_subscribe_id = 0;
3145 /* unref connection */
3146 g_object_unref(g_rec_dev_state_changed_cb_conn);
3147 g_rec_dev_state_changed_cb_conn = NULL;
3151 REC_LOG_INFO("id[%d] callback removed", cb_id);
3152 ret = RECORDER_ERROR_NONE;
3158 REC_LOG_ERROR("id[%d] callback not found", cb_id);
3159 ret = RECORDER_ERROR_INVALID_PARAMETER;
3162 g_mutex_unlock(&g_rec_dev_state_changed_cb_lock);
3168 int _recorder_get_log_level(void)
3170 return g_recorder_log_level;