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.
18 #define LOG_TAG "TIZEN_N_SOUND_MANAGER"
20 #include <sound_manager.h>
21 #include <sound_manager_private.h>
25 sound_manager_volume_changed_cb user_cb;
26 }_changed_volume_info_s;
28 _session_interrupt_info_s g_session_interrupt_cb_table = {0, NULL, NULL};
29 _volume_changed_info_s g_volume_changed_cb_table = {NULL, NULL};
30 _device_connected_info_s g_device_connected_cb_table = {NULL, NULL};
31 _device_changed_info_s g_device_info_changed_cb_table = {NULL, NULL};
33 sound_session_type_e g_cached_session = -1;
34 sound_session_voip_mode_e g_cached_voip_mode = -1;
36 int sound_manager_get_max_volume(sound_type_e type, int *max)
40 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
42 if(type >= SOUND_TYPE_NUM || type < 0)
43 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
44 int ret = mm_sound_volume_get_step(type, &volume);
47 *max = volume -1; // actual volume step can be max step - 1
49 return __convert_sound_manager_error_code(__func__, ret);
52 int sound_manager_set_volume(sound_type_e type, int volume)
54 if(type >= SOUND_TYPE_NUM || type < 0)
55 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
57 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
59 int ret = mm_sound_volume_set_value(type, volume);
60 LOGI("returns : type=%d, volume=%d, ret=0x%x", type, volume, ret);
62 return __convert_sound_manager_error_code(__func__, ret);
65 int sound_manager_get_volume(sound_type_e type, int *volume)
68 if(type >= SOUND_TYPE_NUM || type < 0)
69 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
71 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
72 int ret = mm_sound_volume_get_value(type, &uvolume);
77 LOGI("returns : type=%d, volume=%d, ret=0x%x", type, *volume, ret);
79 return __convert_sound_manager_error_code(__func__, ret);
82 int sound_manager_set_current_sound_type(sound_type_e type)
84 int ret = MM_ERROR_NONE;
85 if(type >= SOUND_TYPE_NUM || type < 0)
86 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
88 ret = mm_sound_volume_primary_type_set(type);
90 return __convert_sound_manager_error_code(__func__, ret);
93 int sound_manager_get_current_sound_type(sound_type_e *type)
95 int ret = MM_ERROR_NONE;
97 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
98 ret = mm_sound_volume_get_current_playing_type((volume_type_t *)type);
100 LOGI("returns : type=%d, ret=0x%x", *type, ret);
102 return __convert_sound_manager_error_code(__func__, ret);
105 int sound_manager_unset_current_sound_type(void)
107 int ret = MM_ERROR_NONE;
108 ret = mm_sound_volume_primary_type_clear();
110 return __convert_sound_manager_error_code(__func__, ret);
113 int sound_manager_set_volume_changed_cb(sound_manager_volume_changed_cb callback, void* user_data)
115 int ret = MM_ERROR_NONE;
116 ret = mm_sound_add_volume_changed_callback((mm_sound_volume_changed_cb)callback, user_data);
117 if (ret == MM_ERROR_NONE) {
118 g_volume_changed_cb_table.user_cb = (sound_manager_volume_changed_cb)callback;
119 g_volume_changed_cb_table.user_data = user_data;
122 return __convert_sound_manager_error_code(__func__, ret);
125 int sound_manager_unset_volume_changed_cb(void)
127 int ret = MM_ERROR_NONE;
128 if (g_volume_changed_cb_table.user_cb) {
129 ret = mm_sound_remove_volume_changed_callback();
130 if (ret == MM_ERROR_NONE) {
131 g_volume_changed_cb_table.user_cb = NULL;
132 g_volume_changed_cb_table.user_data = NULL;
135 ret = MM_ERROR_SOUND_INTERNAL;
138 return __convert_sound_manager_error_code(__func__, ret);
141 int sound_manager_set_session_type(sound_session_type_e type)
143 int ret = MM_ERROR_NONE;
144 int cur_session = -1;
145 int new_session = MM_SESSION_TYPE_MEDIA;
147 LOGI(">> enter : type=%d", type);
149 if(type < SOUND_SESSION_TYPE_MEDIA || type > SOUND_SESSION_TYPE_VOIP)
150 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
153 case SOUND_SESSION_TYPE_MEDIA:
154 new_session = MM_SESSION_TYPE_MEDIA;
156 case SOUND_SESSION_TYPE_ALARM:
157 new_session = MM_SESSION_TYPE_ALARM;
159 case SOUND_SESSION_TYPE_NOTIFICATION:
160 new_session = MM_SESSION_TYPE_NOTIFY;
162 case SOUND_SESSION_TYPE_EMERGENCY:
163 new_session = MM_SESSION_TYPE_EMERGENCY;
165 case SOUND_SESSION_TYPE_VOIP:
166 new_session = MM_SESSION_TYPE_VOIP;
170 /* valid session check */
171 ret = mm_session_get_current_type(&cur_session);
173 if (cur_session == MM_SESSION_TYPE_MEDIA_RECORD) {
174 if (type > SOUND_SESSION_TYPE_MEDIA) {
175 LOGE("<< leave : Could not set this type(%d) during camera/recorder/audio-io(in)/radio", type);
176 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
179 if (cur_session == MM_SESSION_TYPE_CALL ||
180 cur_session == MM_SESSION_TYPE_VIDEOCALL ||
181 cur_session >= MM_SESSION_TYPE_VOICE_RECOGNITION) {
182 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
186 if(g_session_interrupt_cb_table.is_registered) {
187 if (new_session == cur_session ||
188 ((new_session == SOUND_SESSION_TYPE_MEDIA) && (cur_session == MM_SESSION_TYPE_MEDIA_RECORD))) {
189 LOGI("<< leave : already set type=%d, ret=0x%x", type, ret);
190 return SOUND_MANAGER_ERROR_NONE;
192 ret = mm_session_finish();
193 if (ret != MM_ERROR_NONE) {
194 return __convert_sound_manager_error_code(__func__, ret);
196 g_session_interrupt_cb_table.is_registered = 0;
197 g_cached_voip_mode = -1;
200 ret = mm_session_init_ex(new_session , __session_interrupt_cb, NULL);
202 g_session_interrupt_cb_table.is_registered = 1;
204 if (new_session == MM_SESSION_TYPE_VOIP) {
205 /* set default sub-session for voip */
206 ret = mm_session_set_subsession (MM_SUBSESSION_TYPE_RINGTONE, MM_SUBSESSION_OPTION_NONE);
207 if (ret != MM_ERROR_NONE) {
208 return __convert_sound_manager_error_code(__func__, ret);
210 g_cached_voip_mode = SOUND_SESSION_VOIP_MODE_RINGTONE;
212 LOGI("<< leave : type=%d, ret=0x%x", type, ret);
214 return __convert_sound_manager_error_code(__func__, ret);
217 int sound_manager_get_session_type(sound_session_type_e *type)
219 int ret = MM_ERROR_NONE;
223 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
224 ret = mm_session_get_current_type(&cur_session);
226 cur_session = SOUND_SESSION_TYPE_DEFAULT;
227 if ((cur_session > MM_SESSION_TYPE_EMERGENCY) && (cur_session != MM_SESSION_TYPE_VOIP)) {
228 if( g_cached_session != -1 )
229 cur_session = g_cached_session;
230 else //will be never reach here. just prevent code
231 cur_session = SOUND_SESSION_TYPE_DEFAULT;
234 switch(cur_session) {
235 case MM_SESSION_TYPE_MEDIA:
236 case MM_SESSION_TYPE_MEDIA_RECORD:
237 *type = SOUND_SESSION_TYPE_MEDIA;
239 case MM_SESSION_TYPE_ALARM:
240 *type = SOUND_SESSION_TYPE_ALARM;
242 case MM_SESSION_TYPE_NOTIFY:
243 *type = SOUND_SESSION_TYPE_NOTIFICATION;
245 case MM_SESSION_TYPE_EMERGENCY:
246 *type = SOUND_SESSION_TYPE_EMERGENCY;
248 case MM_SESSION_TYPE_VOIP:
249 *type = SOUND_SESSION_TYPE_VOIP;
256 LOGI("returns : type=%d, ret=0x%x", *type, ret);
261 int sound_manager_set_media_session_option(sound_session_option_for_starting_e s_option, sound_session_option_for_during_play_e d_option)
263 int ret = MM_ERROR_NONE;
265 int session_option = 0;
268 LOGI(">> enter : option for starting=%d, for during play=%d", s_option, d_option);
270 if(s_option < 0 || s_option > SOUND_SESSION_OPTION_PAUSE_OTHERS_WHEN_START)
271 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
272 if(d_option < 0 || d_option > SOUND_SESSION_OPTION_UNINTERRUPTIBLE_DURING_PLAY)
273 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
275 ret = mm_session_get_current_information(&session, &session_option);
276 if ( ret != 0 || !g_session_interrupt_cb_table.is_registered) {
277 LOGW("need to set session type first");
278 return __convert_sound_manager_error_code(__func__, ret);
279 } else if ( ret == 0 && session > MM_SESSION_TYPE_MEDIA ) {
280 if (session == MM_SESSION_TYPE_MEDIA_RECORD) {
281 if (!g_session_interrupt_cb_table.is_registered) {
282 LOGE("Already set by camera/recorder/audio-io(in)/radio API, but need to set session to Media first");
283 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
286 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
291 case SOUND_SESSION_OPTION_MIX_WITH_OTHERS_WHEN_START:
292 if (session_option & MM_SESSION_OPTION_PAUSE_OTHERS) {
293 ret = mm_session_update_option(MM_SESSION_UPDATE_TYPE_REMOVE, MM_SESSION_OPTION_PAUSE_OTHERS);
295 return __convert_sound_manager_error_code(__func__, ret);
300 case SOUND_SESSION_OPTION_PAUSE_OTHERS_WHEN_START:
301 if (!(session_option & MM_SESSION_OPTION_PAUSE_OTHERS)) {
302 ret = mm_session_update_option(MM_SESSION_UPDATE_TYPE_ADD, MM_SESSION_OPTION_PAUSE_OTHERS);
304 return __convert_sound_manager_error_code(__func__, ret);
312 case SOUND_SESSION_OPTION_INTERRUPTIBLE_DURING_PLAY:
313 if (session_option & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
314 ret = mm_session_update_option(MM_SESSION_UPDATE_TYPE_REMOVE, MM_SESSION_OPTION_UNINTERRUPTIBLE);
316 return __convert_sound_manager_error_code(__func__, ret);
321 case SOUND_SESSION_OPTION_UNINTERRUPTIBLE_DURING_PLAY:
322 if (!(session_option & MM_SESSION_OPTION_UNINTERRUPTIBLE)) {
323 ret = mm_session_update_option(MM_SESSION_UPDATE_TYPE_ADD, MM_SESSION_OPTION_UNINTERRUPTIBLE);
325 return __convert_sound_manager_error_code(__func__, ret);
333 LOGI("<< leave : updated");
335 LOGI("<< leave : already set same option(%x), skip it", session_option);
338 return __convert_sound_manager_error_code(__func__, ret);
341 int sound_manager_get_media_session_option(sound_session_option_for_starting_e *s_option, sound_session_option_for_during_play_e *d_option)
343 int ret = MM_ERROR_NONE;
345 int session_options = 0;
349 if( s_option == NULL || d_option == NULL )
350 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
352 ret = mm_session_get_current_information(&session, &session_options);
354 return __convert_sound_manager_error_code(__func__, ret);
355 } else if (session > SOUND_SESSION_TYPE_MEDIA ) {
356 if (session == MM_SESSION_TYPE_MEDIA_RECORD) {
357 if (!g_session_interrupt_cb_table.is_registered) {
358 LOGE("Already set by camera/recorder/audio-io(in)/radio API, but need to set session to Media first");
359 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
362 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
366 if (session_options & MM_SESSION_OPTION_PAUSE_OTHERS) {
367 *s_option = SOUND_SESSION_OPTION_PAUSE_OTHERS_WHEN_START;
369 *s_option = SOUND_SESSION_OPTION_MIX_WITH_OTHERS_WHEN_START;
371 if (session_options & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
372 *d_option = SOUND_SESSION_OPTION_UNINTERRUPTIBLE_DURING_PLAY;
374 *d_option = SOUND_SESSION_OPTION_INTERRUPTIBLE_DURING_PLAY;
377 LOGI("<< leave : option for starting=%d, for during play=%d", *s_option, *d_option);
379 return SOUND_MANAGER_ERROR_NONE;
382 int sound_manager_set_media_session_resumption_option(sound_session_option_for_resumption_e option)
384 int ret = MM_ERROR_NONE;
386 int session_option = 0;
389 LOGI(">> enter : option for resumption=%d (0:by system, 1:by system or media paused)", option);
391 if(option < SOUND_SESSION_OPTION_RESUMPTION_BY_SYSTEM || option > SOUND_SESSION_OPTION_RESUMPTION_BY_SYSTEM_OR_MEDIA_PAUSED)
392 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
394 ret = mm_session_get_current_information(&session, &session_option);
395 if ( ret != 0 || !g_session_interrupt_cb_table.is_registered) {
396 LOGW("need to set session type first");
397 return __convert_sound_manager_error_code(__func__, ret);
398 } else if ( ret == 0 && session > MM_SESSION_TYPE_MEDIA ) {
399 if (session == MM_SESSION_TYPE_MEDIA_RECORD) {
400 if (!g_session_interrupt_cb_table.is_registered) {
401 LOGE("Already set by camera/recorder/audio-io(in)/radio API, but need to set session to Media first");
402 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
405 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
410 case SOUND_SESSION_OPTION_RESUMPTION_BY_SYSTEM:
411 if (session_option & MM_SESSION_OPTION_RESUME_BY_SYSTEM_OR_MEDIA_PAUSED) {
412 ret = mm_session_update_option(MM_SESSION_UPDATE_TYPE_REMOVE, MM_SESSION_OPTION_RESUME_BY_SYSTEM_OR_MEDIA_PAUSED);
414 return __convert_sound_manager_error_code(__func__, ret);
419 case SOUND_SESSION_OPTION_RESUMPTION_BY_SYSTEM_OR_MEDIA_PAUSED:
420 if (!(session_option & MM_SESSION_OPTION_RESUME_BY_SYSTEM_OR_MEDIA_PAUSED)) {
421 ret = mm_session_update_option(MM_SESSION_UPDATE_TYPE_ADD, MM_SESSION_OPTION_RESUME_BY_SYSTEM_OR_MEDIA_PAUSED);
423 return __convert_sound_manager_error_code(__func__, ret);
431 LOGI("<< leave : updated");
433 LOGI("<< leave : already set same option(%x), skip it", session_option);
436 return __convert_sound_manager_error_code(__func__, ret);
439 int sound_manager_get_media_session_resumption_option(sound_session_option_for_resumption_e *option)
441 int ret = MM_ERROR_NONE;
443 int session_options = 0;
448 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
449 ret = mm_session_get_current_information(&session, &session_options);
451 return __convert_sound_manager_error_code(__func__, ret);
452 } else if (session > SOUND_SESSION_TYPE_MEDIA ) {
453 if (session == MM_SESSION_TYPE_MEDIA_RECORD) {
454 if (!g_session_interrupt_cb_table.is_registered) {
455 LOGE("Already set by camera/recorder/audio-io(in)/radio API, but need to set session to Media first");
456 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
459 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
463 if (session_options & MM_SESSION_OPTION_RESUME_BY_SYSTEM_OR_MEDIA_PAUSED) {
464 *option = SOUND_SESSION_OPTION_RESUMPTION_BY_SYSTEM_OR_MEDIA_PAUSED;
466 *option = SOUND_SESSION_OPTION_RESUMPTION_BY_SYSTEM;
469 LOGI("<< leave : option for resumption=%d (0:by system, 1:by system or media paused)", *option);
471 return SOUND_MANAGER_ERROR_NONE;
474 int sound_manager_set_voip_session_mode(sound_session_voip_mode_e mode)
476 int ret = MM_ERROR_NONE;
478 int session_options = 0;
480 LOGI(">> enter : mode=%d", mode);
482 ret = mm_session_get_current_information(&session, &session_options);
483 if( ret != MM_ERROR_NONE ) {
484 return __convert_sound_manager_error_code(__func__, ret);
485 } else if (session != MM_SESSION_TYPE_VOIP ) {
486 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
489 if(mode < SOUND_SESSION_VOIP_MODE_RINGTONE || mode > SOUND_SESSION_VOIP_MODE_VOICE_WITH_BLUETOOTH) {
490 ret = MM_ERROR_INVALID_ARGUMENT;
491 return __convert_sound_manager_error_code(__func__, ret);
494 if (mode == SOUND_SESSION_VOIP_MODE_RINGTONE) {
496 if (g_cached_voip_mode != mode) {
497 ret = mm_session_set_subsession (MM_SUBSESSION_TYPE_RINGTONE, MM_SUBSESSION_OPTION_NONE);
498 if (ret != MM_ERROR_NONE) {
499 return __convert_sound_manager_error_code(__func__, ret);
502 g_cached_voip_mode = mode;
504 mm_sound_route route;
505 bool need_to_check_device = false;
506 bool do_subsession = true;
508 case SOUND_SESSION_VOIP_MODE_RINGTONE:
509 do_subsession = false;
511 case SOUND_SESSION_VOIP_MODE_VOICE_WITH_BUILTIN_RECEIVER:
512 route = MM_SOUND_ROUTE_IN_MIC_OUT_RECEIVER;
514 case SOUND_SESSION_VOIP_MODE_VOICE_WITH_BUILTIN_SPEAKER:
515 route = MM_SOUND_ROUTE_IN_MIC_OUT_SPEAKER;
517 case SOUND_SESSION_VOIP_MODE_VOICE_WITH_AUDIO_JACK:
518 route = MM_SOUND_ROUTE_IN_MIC_OUT_HEADPHONE;
519 need_to_check_device = true;
521 case SOUND_SESSION_VOIP_MODE_VOICE_WITH_BLUETOOTH:
522 route = MM_SOUND_ROUTE_INOUT_BLUETOOTH;
523 need_to_check_device = true;
527 if (need_to_check_device) {
528 int w_ret = MM_ERROR_NONE;
529 MMSoundDeviceList_t device_list;
530 MMSoundDevice_t device;
531 do_subsession = false;
533 ret = mm_sound_get_current_device_list(MM_SOUND_DEVICE_STATE_DEACTIVATED_FLAG, &device_list);
534 if (ret != MM_ERROR_NONE) {
535 return __convert_sound_manager_error_code(__func__, ret);
537 while ((w_ret = mm_sound_get_next_device(device_list, &device)) == MM_ERROR_NONE) {
538 mm_sound_device_type_e type;
539 ret = mm_sound_get_device_type(device, &type);
540 if (ret != MM_ERROR_NONE)
541 return __convert_sound_manager_error_code(__func__, ret);
544 case SOUND_SESSION_VOIP_MODE_VOICE_WITH_AUDIO_JACK:
545 if (type == MM_SOUND_DEVICE_TYPE_AUDIOJACK)
546 do_subsession = true;
548 case SOUND_SESSION_VOIP_MODE_VOICE_WITH_BLUETOOTH:
549 if (type == MM_SOUND_DEVICE_TYPE_BLUETOOTH) {
550 mm_sound_device_io_direction_e io_direction;
551 ret = mm_sound_get_device_io_direction(device, &io_direction);
552 if (ret != MM_ERROR_NONE)
553 return __convert_sound_manager_error_code(__func__, ret);
554 if (io_direction == MM_SOUND_DEVICE_IO_DIRECTION_BOTH)
555 do_subsession = true;
565 if (do_subsession && (g_cached_voip_mode != mode)) {
566 ret = mm_session_set_subsession (MM_SUBSESSION_TYPE_VOICE, MM_SUBSESSION_OPTION_NONE);
567 if (ret != MM_ERROR_NONE) {
568 return __convert_sound_manager_error_code(__func__, ret);
571 ret = mm_sound_set_active_route(route);
572 if (ret != MM_ERROR_NONE) {
573 return __convert_sound_manager_error_code(__func__, ret);
575 g_cached_voip_mode = mode;
578 ret = MM_ERROR_SOUND_INTERNAL;
582 LOGI("<< leave : session=%p, mode=%d, ret=0x%x", session, mode, ret);
584 return __convert_sound_manager_error_code(__func__, ret);
587 int sound_manager_get_voip_session_mode(sound_session_voip_mode_e *mode)
589 int ret = MM_ERROR_NONE;
591 int session_options = 0;
595 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
598 ret = mm_session_get_current_information(&session, &session_options);
599 if( ret != MM_ERROR_NONE ) {
600 return __convert_sound_manager_error_code(__func__, ret);
601 } else if (session != MM_SESSION_TYPE_VOIP ) {
602 return __convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
605 ret = mm_session_get_subsession ((mm_subsession_t *)&subsession);
606 if(ret != MM_ERROR_NONE) {
607 return __convert_sound_manager_error_code(__func__, ret);
609 switch (subsession) {
610 case MM_SUBSESSION_TYPE_VOICE:
612 int w_ret = MM_ERROR_NONE;
613 bool need_to_out = false;
614 MMSoundDeviceList_t device_list;
615 MMSoundDevice_t device;
616 ret = mm_sound_get_current_device_list(MM_SOUND_DEVICE_STATE_ACTIVATED_FLAG, &device_list);
617 if (ret != MM_ERROR_NONE) {
618 return __convert_sound_manager_error_code(__func__, ret);
620 while ((w_ret = mm_sound_get_next_device(device_list, &device)) == MM_ERROR_NONE) {
621 mm_sound_device_type_e type;
622 ret = mm_sound_get_device_type(device, &type);
623 if (ret != MM_ERROR_NONE)
624 return __convert_sound_manager_error_code(__func__, ret);
626 case MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER:
627 *mode = SOUND_SESSION_VOIP_MODE_VOICE_WITH_BUILTIN_SPEAKER;
630 case MM_SOUND_DEVICE_TYPE_BUILTIN_RECEIVER:
631 *mode = SOUND_SESSION_VOIP_MODE_VOICE_WITH_BUILTIN_RECEIVER;
634 case MM_SOUND_DEVICE_TYPE_AUDIOJACK:
635 *mode = SOUND_SESSION_VOIP_MODE_VOICE_WITH_AUDIO_JACK;
638 case MM_SOUND_DEVICE_TYPE_BLUETOOTH:
639 *mode = SOUND_SESSION_VOIP_MODE_VOICE_WITH_BLUETOOTH;
651 case MM_SUBSESSION_TYPE_RINGTONE:
652 *mode = SOUND_SESSION_VOIP_MODE_RINGTONE;
658 LOGI("returns : session=%p, mode=%d, ret=0x%x", session, *mode, ret);
660 return __convert_sound_manager_error_code(__func__, ret);
663 int sound_manager_set_session_interrupted_cb(sound_session_interrupted_cb callback, void *user_data)
665 int ret = MM_ERROR_NONE;
667 return __convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT);
669 if(g_session_interrupt_cb_table.is_registered ==0){
670 ret = mm_session_init_ex(SOUND_SESSION_TYPE_DEFAULT /*default*/ , __session_interrupt_cb, NULL);
672 return __convert_sound_manager_error_code(__func__, ret);
673 g_session_interrupt_cb_table.is_registered = 1;
676 g_session_interrupt_cb_table.user_cb = (sound_session_interrupted_cb)callback;
677 g_session_interrupt_cb_table.user_data = user_data;
678 return SOUND_MANAGER_ERROR_NONE;
681 int sound_manager_unset_session_interrupted_cb(void)
683 int ret = MM_ERROR_NONE;
684 if (g_session_interrupt_cb_table.user_cb) {
685 g_session_interrupt_cb_table.user_cb = NULL;
686 g_session_interrupt_cb_table.user_data = NULL;
688 ret = MM_ERROR_SOUND_INTERNAL;
690 return __convert_sound_manager_error_code(__func__, ret);
693 int sound_manager_get_current_device_list(sound_device_mask_e device_mask, sound_device_list_h *device_list)
695 int ret = MM_ERROR_NONE;
696 ret = mm_sound_get_current_device_list((mm_sound_device_flags_e)device_mask, device_list);
698 return __convert_sound_manager_error_code(__func__, ret);
701 int sound_manager_get_next_device (sound_device_list_h device_list, sound_device_h *device)
703 int ret = MM_ERROR_NONE;
704 ret = mm_sound_get_next_device(device_list, device);
706 return __convert_sound_manager_error_code(__func__, ret);
709 int sound_manager_get_prev_device (sound_device_list_h device_list, sound_device_h *device)
711 int ret = MM_ERROR_NONE;
712 ret = mm_sound_get_prev_device(device_list, device);
714 return __convert_sound_manager_error_code(__func__, ret);
717 int sound_manager_get_device_type (sound_device_h device, sound_device_type_e *type)
719 int ret = MM_ERROR_NONE;
720 ret = mm_sound_get_device_type(device, (mm_sound_device_type_e*)type);
722 return __convert_sound_manager_error_code(__func__, ret);
725 int sound_manager_get_device_io_direction (sound_device_h device, sound_device_io_direction_e *io_direction)
727 int ret = MM_ERROR_NONE;
728 ret = mm_sound_get_device_io_direction(device, (mm_sound_device_io_direction_e*)io_direction);
730 return __convert_sound_manager_error_code(__func__, ret);
733 int sound_manager_get_device_id (sound_device_h device, int *id)
735 int ret = MM_ERROR_NONE;
736 ret = mm_sound_get_device_id(device, id);
738 return __convert_sound_manager_error_code(__func__, ret);
741 int sound_manager_get_device_name (sound_device_h device, char **name)
743 int ret = MM_ERROR_NONE;
744 ret = mm_sound_get_device_name(device, name);
746 return __convert_sound_manager_error_code(__func__, ret);
749 int sound_manager_get_device_state (sound_device_h device, sound_device_state_e *state)
751 int ret = MM_ERROR_NONE;
752 ret = mm_sound_get_device_state(device, (mm_sound_device_state_e*)state);
754 return __convert_sound_manager_error_code(__func__, ret);
757 int sound_manager_set_device_connected_cb (sound_device_mask_e device_mask, sound_device_connected_cb callback, void *user_data)
759 int ret = MM_ERROR_NONE;
760 ret = mm_sound_add_device_connected_callback((mm_sound_device_flags_e)device_mask, (mm_sound_device_connected_cb)callback, user_data);
761 if (ret == MM_ERROR_NONE) {
762 g_device_connected_cb_table.user_cb = (sound_device_connected_cb)callback;
763 g_device_connected_cb_table.user_data = user_data;
766 return __convert_sound_manager_error_code(__func__, ret);
769 int sound_manager_unset_device_connected_cb (void)
771 int ret = MM_ERROR_NONE;
772 if (g_device_connected_cb_table.user_cb) {
773 ret = mm_sound_remove_device_connected_callback();
774 if (ret == MM_ERROR_NONE) {
775 g_device_connected_cb_table.user_cb = NULL;
776 g_device_connected_cb_table.user_data = NULL;
779 ret = MM_ERROR_SOUND_INTERNAL;
782 return __convert_sound_manager_error_code(__func__, ret);
785 int sound_manager_set_device_information_changed_cb (sound_device_mask_e device_mask, sound_device_information_changed_cb callback, void *user_data)
787 int ret = MM_ERROR_NONE;
788 ret = mm_sound_add_device_information_changed_callback((mm_sound_device_flags_e)device_mask, (mm_sound_device_info_changed_cb)callback, user_data);
789 if (ret == MM_ERROR_NONE) {
790 g_device_info_changed_cb_table.user_cb = (sound_device_information_changed_cb)callback;
791 g_device_info_changed_cb_table.user_data = user_data;
794 return __convert_sound_manager_error_code(__func__, ret);
797 int sound_manager_unset_device_information_changed_cb (void)
799 int ret = MM_ERROR_NONE;
800 if (g_device_info_changed_cb_table.user_cb) {
801 ret = mm_sound_remove_device_information_changed_callback();
802 if (ret == MM_ERROR_NONE) {
803 g_device_info_changed_cb_table.user_cb = NULL;
804 g_device_info_changed_cb_table.user_data = NULL;
807 ret = MM_ERROR_SOUND_INTERNAL;
810 return __convert_sound_manager_error_code(__func__, ret);
813 __attribute__ ((destructor))
814 void __sound_manager_finalize(void)
816 int ret = MM_ERROR_NONE;
818 if(g_session_interrupt_cb_table.is_registered){
820 ret = mm_session_finish();
821 if (ret != MM_ERROR_NONE) {
822 LOGE("[%s] failed to mm_session_finish(), ret(0x%x)", __func__, ret);
824 g_session_interrupt_cb_table.is_registered = 0;
829 __attribute__ ((constructor))
830 void __sound_manager_initialize(void)