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_MANGER"
20 #include <sound_manager.h>
22 #include <mm_sound_private.h>
29 #include <mm_session.h>
30 #include <mm_session_private.h>
32 #define MAX_VOLUME_TYPE 5
36 sound_manager_volume_changed_cb user_cb;
37 }_changed_volume_info_s;
42 sound_session_notify_cb user_cb;
43 void *interrupted_user_data;
44 sound_interrupted_cb interrupted_cb;
45 }_session_notify_info_s;
49 sound_available_route_changed_cb user_cb;
50 }_changed_available_route_info_s;
54 sound_active_device_changed_cb user_cb;
55 }_changed_active_device_info_s;
57 static _changed_volume_info_s g_volume_changed_cb_table;
58 static _session_notify_info_s g_session_notify_cb_table = {0, NULL, NULL, NULL, NULL};
60 static void __volume_changed_cb(void *user_data)
62 sound_type_e type = (sound_type_e)user_data;
65 sound_manager_get_volume(type, &new_volume);
66 if(g_volume_changed_cb_table.user_cb)
67 (g_volume_changed_cb_table.user_cb)(type, new_volume, g_volume_changed_cb_table.user_data);
70 static void __session_notify_cb(session_msg_t msg, session_event_t event, void *user_data){
71 if(g_session_notify_cb_table.user_cb){
72 g_session_notify_cb_table.user_cb(msg, g_session_notify_cb_table.user_data);
74 if( g_session_notify_cb_table.interrupted_cb ){
75 sound_interrupted_code_e e = SOUND_INTERRUPTED_COMPLETED;
76 if( msg == MM_SESSION_MSG_RESUME )
77 e = SOUND_INTERRUPTED_COMPLETED;
80 case MM_SESSION_EVENT_OTHER_APP :
81 e = SOUND_INTERRUPTED_BY_OTHER_APP;
83 case MM_SESSION_EVENT_CALL :
84 e = SOUND_INTERRUPTED_BY_CALL;
86 case MM_SESSION_EVENT_ALARM :
87 e = SOUND_INTERRUPTED_BY_ALARM;
89 case MM_SESSION_EVENT_EARJACK_UNPLUG:
90 e = SOUND_INTERRUPTED_BY_EARJACK_UNPLUG;
92 case MM_SESSION_EVENT_RESOURCE_CONFLICT:
93 e = SOUND_INTERRUPTED_BY_RESOURCE_CONFLICT;
96 e = SOUND_INTERRUPTED_BY_OTHER_APP;
100 g_session_notify_cb_table.interrupted_cb(e, g_session_notify_cb_table.interrupted_user_data);
104 static int __convert_sound_manager_error_code(const char *func, int code){
105 int ret = SOUND_MANAGER_ERROR_NONE;
106 char *errorstr = NULL;
110 case SOUND_MANAGER_ERROR_INVALID_PARAMETER:
111 ret = SOUND_MANAGER_ERROR_INVALID_PARAMETER;
112 errorstr = "INVALID_PARAMETER";
115 ret = SOUND_MANAGER_ERROR_NONE;
116 errorstr = "ERROR_NONE";
118 case MM_ERROR_INVALID_ARGUMENT:
119 case MM_ERROR_SOUND_INVALID_POINTER:
120 ret = SOUND_MANAGER_ERROR_INVALID_PARAMETER;
121 errorstr = "INVALID_PARAMETER";
123 case MM_ERROR_SOUND_INTERNAL:
124 ret = SOUND_MANAGER_ERROR_INVALID_OPERATION;
125 errorstr = "INVALID_OPERATION" ;
127 case MM_ERROR_SOUND_VOLUME_NO_INSTANCE:
128 case MM_ERROR_SOUND_VOLUME_CAPTURE_ONLY:
129 ret = SOUND_MANAGER_ERROR_NO_PLAYING_SOUND;
130 errorstr = "NO_PLAYING_SOUND" ;
133 LOGE("[%s] %s(0x%08x) : core frameworks error code(0x%08x)",func, errorstr, ret, code);
137 int sound_manager_get_max_volume(sound_type_e type, int *max)
141 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
143 if(type > MAX_VOLUME_TYPE || type < 0)
144 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
145 int ret = mm_sound_volume_get_step(type, &volume);
148 *max = volume -1; // actual volume step can be max step - 1
150 return __convert_sound_manager_error_code(__func__, ret);
153 int sound_manager_set_volume(sound_type_e type, int volume)
155 if(type > MAX_VOLUME_TYPE || type < 0)
156 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
158 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
160 int ret = mm_sound_volume_set_value(type, volume);
162 return __convert_sound_manager_error_code(__func__, ret);
165 int sound_manager_get_volume(sound_type_e type, int *volume)
167 unsigned int uvolume;
168 if(type > MAX_VOLUME_TYPE || type < 0)
169 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
171 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
172 int ret = mm_sound_volume_get_value(type, &uvolume);
177 return __convert_sound_manager_error_code(__func__, ret);
180 int sound_manager_get_current_sound_type(sound_type_e *type)
183 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
185 ret = mm_sound_volume_get_current_playing_type((volume_type_t *)type);
187 return __convert_sound_manager_error_code(__func__, ret);
190 int sound_manager_set_volume_changed_cb(sound_manager_volume_changed_cb callback, void* user_data)
193 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
195 g_volume_changed_cb_table.user_cb = callback;
196 g_volume_changed_cb_table.user_data = user_data;
197 for(i = 0 ; i <= MAX_VOLUME_TYPE ; i++)
199 mm_sound_volume_add_callback(i , __volume_changed_cb ,(void*) i);
204 void sound_manager_unset_volume_changed_cb(void)
207 for(i = 0 ; i <= MAX_VOLUME_TYPE ; i++)
209 mm_sound_volume_remove_callback(i);
211 g_volume_changed_cb_table.user_cb = NULL;
212 g_volume_changed_cb_table.user_data = NULL;
215 int sound_manager_get_a2dp_status(bool *connected , char** bt_name){
216 int ret = mm_sound_route_get_a2dp_status((int*)connected , bt_name);
218 return __convert_sound_manager_error_code(__func__, ret);
221 int sound_manager_set_session_type(sound_session_type_e type){
223 if(type < 0 || type > SOUND_SESSION_TYPE_EXCLUSIVE)
224 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
226 if(g_session_notify_cb_table.is_registered){
228 g_session_notify_cb_table.is_registered = 0;
231 ret = mm_session_init_ex(type , __session_notify_cb, NULL);
233 g_session_notify_cb_table.is_registered = 1;
235 return __convert_sound_manager_error_code(__func__, ret);
238 int sound_manager_set_session_notify_cb(sound_session_notify_cb callback , void *user_data){
241 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
244 if(g_session_notify_cb_table.is_registered ==0){
245 ret = mm_session_init_ex(SOUND_SESSION_TYPE_SHARE /*default*/ , __session_notify_cb, NULL);
247 return __convert_sound_manager_error_code(__func__, ret);
248 g_session_notify_cb_table.is_registered = 1;
251 g_session_notify_cb_table.user_cb = callback;
252 g_session_notify_cb_table.user_data = user_data;
253 return SOUND_MANAGER_ERROR_NONE;
256 void sound_manager_unset_session_notify_cb(void){
257 g_session_notify_cb_table.user_cb = NULL;
258 g_session_notify_cb_table.user_data = NULL;
261 int sound_manager_set_interrupted_cb(sound_interrupted_cb callback, void *user_data){
264 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
266 if(g_session_notify_cb_table.is_registered ==0){
267 ret = mm_session_init_ex(SOUND_SESSION_TYPE_SHARE /*default*/ , __session_notify_cb, NULL);
269 return __convert_sound_manager_error_code(__func__, ret);
270 g_session_notify_cb_table.is_registered = 1;
273 g_session_notify_cb_table.interrupted_cb= callback;
274 g_session_notify_cb_table.interrupted_user_data = user_data;
275 return SOUND_MANAGER_ERROR_NONE;
278 void sound_manager_unset_interrupted_cb(void){
279 g_session_notify_cb_table.interrupted_cb= NULL;
280 g_session_notify_cb_table.interrupted_user_data = NULL;
284 int sound_manager_set_volume_key_type(volume_key_type_e type){
285 if(type < VOLUME_KEY_TYPE_NONE || type > VOLUME_KEY_TYPE_CALL)
286 return __convert_sound_manager_error_code(__func__, SOUND_MANAGER_ERROR_INVALID_PARAMETER);
288 if(type == VOLUME_KEY_TYPE_NONE)
289 ret = mm_sound_volume_primary_type_clear();
291 ret = mm_sound_volume_primary_type_set(type);
293 return __convert_sound_manager_error_code(__func__, ret);
296 int sound_manager_foreach_available_route (sound_available_route_cb callback, void *user_data)
299 ret = mm_sound_foreach_available_route_cb((mm_sound_available_route_cb)callback, user_data);
301 return __convert_sound_manager_error_code(__func__, ret);
304 int sound_manager_set_active_route (sound_route_e route)
307 ret = mm_sound_set_active_route(route);
309 return __convert_sound_manager_error_code(__func__, ret);
312 int sound_manager_get_active_device (sound_device_in_e *in, sound_device_out_e *out)
315 ret = mm_sound_get_active_device((mm_sound_device_in *)in, (mm_sound_device_out *)out);
317 return __convert_sound_manager_error_code(__func__, ret);
320 bool sound_manager_is_route_available (sound_route_e route)
323 mm_sound_is_route_available(route, &is_available);
328 int sound_manager_set_available_route_changed_cb (sound_available_route_changed_cb callback, void *user_data)
331 ret = mm_sound_add_available_route_changed_callback((mm_sound_available_route_changed_cb)callback, user_data);
333 return __convert_sound_manager_error_code(__func__, ret);
336 void sound_manager_unset_available_route_changed_cb (void)
338 mm_sound_remove_available_route_changed_callback();
341 int sound_manager_set_active_device_changed_cb (sound_active_device_changed_cb callback, void *user_data)
344 ret = mm_sound_add_active_device_changed_callback((mm_sound_active_device_changed_cb)callback, user_data);
346 return __convert_sound_manager_error_code(__func__, ret);
349 void sound_manager_unset_active_device_changed_cb (void)
351 mm_sound_remove_active_device_changed_callback();
354 struct sound_call_session_s
359 int sound_manager_call_session_create(sound_call_session_type_e type, sound_call_session_h *session)
361 int ret = SOUND_MANAGER_ERROR_NONE;
362 sound_call_session_h handle = NULL;
364 if(type < SOUND_SESSION_TYPE_CALL || type > SOUND_SESSION_TYPE_VOIP || session == NULL) {
365 ret = SOUND_MANAGER_ERROR_INVALID_PARAMETER;
369 handle = malloc(sizeof(struct sound_call_session_s));
372 ret = SOUND_MANAGER_ERROR_INVALID_OPERATION;
376 memset(handle, 0, sizeof(struct sound_call_session_s));
379 case SOUND_SESSION_TYPE_CALL:
380 ret = mm_session_init(MM_SESSION_TYPE_CALL);
382 case SOUND_SESSION_TYPE_VOIP:
383 ret = mm_session_init(MM_SESSION_TYPE_VIDEOCALL);
387 if(ret != MM_ERROR_NONE)
392 return SOUND_MANAGER_ERROR_NONE;
398 return __convert_sound_manager_error_code(__func__, ret);
401 int sound_manager_call_session_set_mode(sound_call_session_h session, sound_call_session_mode_e mode)
403 int ret = SOUND_MANAGER_ERROR_NONE;
405 if(mode < SOUND_CALL_SESSION_MODE_VOICE || mode > SOUND_CALL_SESSION_MODE_MEDIA || session == NULL) {
406 ret = SOUND_MANAGER_ERROR_INVALID_PARAMETER;
410 ret = mm_session_set_subsession ((mm_subsession_t)mode);
412 if(ret != MM_ERROR_NONE)
415 return SOUND_MANAGER_ERROR_NONE;
418 return __convert_sound_manager_error_code(__func__, ret);
421 int sound_manager_call_session_get_mode(sound_call_session_h session, sound_call_session_mode_e *mode)
423 int ret = SOUND_MANAGER_ERROR_NONE;
425 if(mode == NULL || session == NULL) {
426 ret = SOUND_MANAGER_ERROR_INVALID_PARAMETER;
430 ret = mm_session_get_subsession ((mm_subsession_t *)mode);
432 if(ret != MM_ERROR_NONE)
435 return SOUND_MANAGER_ERROR_NONE;
438 return __convert_sound_manager_error_code(__func__, ret);
441 int sound_manager_call_session_destroy(sound_call_session_h session)
443 int ret = SOUND_MANAGER_ERROR_NONE;
444 sound_call_session_h *handle = (sound_call_session_h *)session;
446 if(session == NULL) {
447 ret = SOUND_MANAGER_ERROR_INVALID_PARAMETER;
451 ret = mm_session_finish();
453 if(ret != MM_ERROR_NONE)
459 return SOUND_MANAGER_ERROR_NONE;
462 return __convert_sound_manager_error_code(__func__, ret);