4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include <setting-profile.h>
25 #include <iniparser.h>
27 #include <app_manager.h>
28 #include <metadata_extractor.h>
30 #include <efl_assist.h>
31 #include <sound_manager_internal.h>
33 #define PLAY_FEEDBACK(f_type, f_pattern) {\
34 if (feedback_initialize() == FEEDBACK_ERROR_NONE) {\
35 feedback_play_type(f_type, f_pattern);\
36 feedback_deinitialize();\
40 typedef struct _SliderIcons {
46 SliderIcons slider_icons[SND_SLIDER_MAX] = {
47 {SND_SLIDER_CALL, ICON_CALL_MUTE, ICON_CALL_NORMAL},
48 {SND_SLIDER_NOTI, ICON_NOTI_MUTE, ICON_NOTI_NORMAL},
49 {SND_SLIDER_MEDIA, ICON_MEDIA_MUTE, ICON_MEDIA_NORMAL},
50 {SND_SLIDER_SYSTEM, ICON_SYSTEM_MUTE, ICON_SYSTEM_NORMAL},
51 /*{SND_SLIDER_MAX, "", ""} */
54 char *setting_sound_get_slider_icon(int type, int volume)
56 if (type < SND_SLIDER_CALL || type >= SND_SLIDER_MAX)
59 SETTING_TRACE("type : %d, volume : %d", type, volume);
60 /* 1.Call ringtone has 3 icon status */
61 if (SND_SLIDER_CALL == type) {
65 vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound);
66 vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vibration);
68 if (sound && !vibration)
69 return ICON_CALL_NORMAL;
70 else if (vibration && !sound)
72 else if (!vibration && !sound)
73 return ICON_CALL_MUTE;
75 return ICON_CALL_NORMAL;
78 /* 2.Other types, just have two icon status */
80 return slider_icons[type].volume;
82 return slider_icons[type].mute;
86 void setting_sound_update_slider_icon(Setting_GenGroupItem_Data *item_data, int type)
89 ret_if(!item_data || !item_data->eo_check);
91 Evas_Object *icon = elm_object_content_get(item_data->eo_check);
93 char *new_file = setting_sound_get_slider_icon(type, item_data->chk_status);
94 elm_image_file_set(icon, new_file, NULL);
98 char *setting_media_basename(char *path)
100 if (NULL == path || '\0' == path[0]) {
101 return NULL; /* invalid arguement */
104 if (safeStrCmp(path, "silent") == 0)
105 return (char *)g_strdup(_("IDS_ST_BODY_PHONEPROFILES_SILENT"));
107 metadata_extractor_h metadata = NULL;
109 int ret = metadata_extractor_create(&metadata);
110 if (ret == METADATA_EXTRACTOR_ERROR_NONE && metadata) {
111 ret = metadata_extractor_set_path(metadata, path);
112 if (ret == METADATA_EXTRACTOR_ERROR_NONE) {
113 ret = metadata_extractor_get_metadata(metadata, METADATA_TITLE, &title);
114 metadata_extractor_destroy(metadata);
116 char *strdup_title = (char *)g_strdup(title);
120 return setting_file_basename(path);
123 metadata_extractor_destroy(metadata);
124 return setting_file_basename(path);
127 return setting_file_basename(path);
131 static Evas_Object *__sound_slider_icon_get(void *data, Evas_Object *obj, const char *part)
133 /*SETTING_TRACE_BEGIN; */
134 /*appcore_measure_start(); */
135 retv_if(data == NULL, NULL);
137 if (safeStrCmp(part, "elm.icon")) {
138 /*SETTING_TRACE("EDC part [%s]", part); */
142 Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *)data;
143 Evas_Object *slider = setting_create_slider(obj, item_data->evas,
144 item_data->l_swallow_path,
145 item_data->r_swallow_path,
146 item_data->chk_status,
147 item_data->isIndicatorVisible,
148 item_data->slider_min,
149 item_data->slider_max,
150 item_data->chk_change_cb,
151 item_data->start_change_cb,
152 item_data->stop_change_cb,
157 if (0 == safeStrCmp(item_data->keyStr, "IDS_ST_BODY_MEDIA")) {
158 elm_object_style_set(slider, "warning");
160 Edje_Message_Float_Set *msg = alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double)));
162 msg->val[0] = 0.66667;
163 edje_object_message_send(_EDJ(slider), EDJE_MESSAGE_FLOAT_SET, 0, msg);
164 elm_slider_indicator_format_set(slider, "%1.0f");
165 elm_slider_indicator_show_set(slider, 1);
168 item_data->eo_check = slider;
170 evas_object_pass_events_set(slider, EINA_TRUE);
171 evas_object_propagate_events_set(slider, EINA_FALSE);
173 if (item_data->userdata == NULL)
179 /* ***************************************************
183 ***************************************************/
184 #define SETTING_DEFAULT_FOLDER_PATH "/opt/usr/share/settings/" /*resolve P130805-7070 */
185 #define SDCARD_PATH "/opt/storage/sdcard/"
187 int setting_sound_check_file_exist(void *data, const char *file_path)
189 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
190 retv_if(file_path == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
192 /*resolve P130805-7070 */
193 if (0 == safeStrNCmp(file_path, SETTING_DEFAULT_FOLDER_PATH, safeStrLen(SETTING_DEFAULT_FOLDER_PATH))) {
194 SETTING_TRACE("Default file[%s]!", file_path);
195 return SETTING_RETURN_SUCCESS;
198 if (!ecore_file_exists(file_path)) {
199 if (safeStrCmp(file_path, "silent") == 0) {
200 SETTING_TRACE("%s", file_path);
201 return SETTING_RETURN_SUCCESS;
203 SETTING_TRACE_ERROR("Cannot find the ringtone file[%s]!", file_path);
204 if (0 == safeStrNCmp(file_path, SDCARD_PATH, safeStrLen(SDCARD_PATH))) {
205 char *strdup_file_path = strdup(file_path);
207 int ret = vconf_set_str(VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_STR, strdup_file_path);
209 SETTING_TRACE_DEBUG("failed to set vconf");
211 FREE(strdup_file_path);
213 return SETTING_RETURN_FAIL;
216 int mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;
217 vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &mmc_status);
218 if (VCONFKEY_SYSMAN_MMC_MOUNTED != mmc_status) {
219 if (!safeStrNCmp(SETTING_PROFILE_MMC_PATH, file_path, safeStrLen(SETTING_PROFILE_MMC_PATH))) {
220 return SETTING_RETURN_FAIL;
223 return SETTING_RETURN_SUCCESS;
226 static void __enable_sound_menu(void *data)
230 SettingProfileUG *ad = data;
232 Setting_GenGroupItem_Data *item_to_update = NULL;
235 /*1.Enable "Vibrate when ringing" */
236 item_to_update = ad->data_sound_when_ring;
237 setting_genlist_item_disabled_set(item_to_update, EINA_FALSE);
240 /*2.Enable "Notification", via Sound Manager */
241 item_to_update = ad->data_noti_volume;
242 if (item_to_update && item_to_update->item && item_to_update->eo_check) {
244 int ret = sound_manager_get_volume(SOUND_TYPE_NOTIFICATION, &mm_value);
245 SETTING_TRACE("ret:%d", ret);
246 item_to_update->chk_status = mm_value;
247 elm_slider_value_set(item_to_update->eo_check, item_to_update->chk_status);
248 elm_object_item_disabled_set(item_to_update->item, EINA_FALSE);
249 elm_object_disabled_set(item_to_update->eo_check, EINA_FALSE);
251 setting_sound_update_slider_icon(item_to_update, SND_SLIDER_NOTI);
255 /*3.Enable "System", via Sound Manager */
256 item_to_update = ad->data_touch_volume;
257 if (item_to_update && item_to_update->item && item_to_update->eo_check) {
259 int ret = sound_manager_get_volume(SOUND_TYPE_SYSTEM, &mm_value);
260 SETTING_TRACE("ret:%d", ret);
261 item_to_update->chk_status = mm_value;
262 elm_slider_value_set(item_to_update->eo_check, item_to_update->chk_status);
263 elm_object_item_disabled_set(item_to_update->item, EINA_FALSE);
264 elm_object_disabled_set(item_to_update->eo_check, EINA_FALSE);
266 setting_sound_update_slider_icon(item_to_update, SND_SLIDER_SYSTEM);
270 /*4.Enable "Call ringtone", via "Backuped" value */
271 item_to_update = ad->data_call_volume;
272 if (item_to_update && item_to_update->eo_check) {
273 SETTING_TRACE("....ad->is_ringtone_slidering:%d, ad->data_call_volume->chk_status:%d",
274 ad->is_ringtone_slidering, item_to_update->chk_status);
275 if (ad->is_ringtone_slidering) return;/*do need to restore from BACKUP VOLUME */
278 int ret = sound_manager_get_volume(SOUND_TYPE_RINGTONE, &mm_value);
279 if (mm_value <= 0) mm_value = 1;
280 /*SETTING_TRACE("ret:%d", ret); */
281 sound_manager_set_volume(SOUND_TYPE_RINGTONE, mm_value);
282 item_to_update->chk_status = mm_value;
283 elm_slider_value_set(item_to_update->eo_check, item_to_update->chk_status);
284 SETTING_TRACE("ad->data_call_volume->chk_status : %d", item_to_update->chk_status);
289 static void __disable_sound_menu(void *data)
293 SettingProfileUG *ad = data;
294 ad->sound_on = FALSE;
296 __close_player(ad, SND_SLIDER_NOTI);
297 __close_player(ad, SND_SLIDER_MEDIA);
299 if (ad->mp_ringtone) {
300 SETTING_TRACE_DEBUG("player_set_mute");
301 player_set_mute(*(ad->mp_ringtone), 1);
303 Setting_GenGroupItem_Data *item_to_update = NULL;
305 /*1.Disable "Vibrate when ringing" */
306 item_to_update = ad->data_sound_when_ring;
307 setting_genlist_item_disabled_set(item_to_update, EINA_TRUE);
309 /*2.Disable "Notification" */
310 item_to_update = ad->data_noti_volume;
311 if (item_to_update && item_to_update->item && item_to_update->eo_check) {
312 item_to_update->chk_status = 0;
313 elm_slider_value_set(item_to_update->eo_check, item_to_update->chk_status);
314 elm_object_item_disabled_set(item_to_update->item, EINA_TRUE);
315 elm_object_disabled_set(item_to_update->eo_check, EINA_TRUE);
317 /* Change notification slider's icon as mute style */
318 setting_sound_update_slider_icon(item_to_update, SND_SLIDER_NOTI);
321 /*3.Disable "System" */
322 item_to_update = ad->data_touch_volume;
323 if (item_to_update && item_to_update->item && item_to_update->eo_check) {
324 item_to_update->chk_status = 0;
325 elm_slider_value_set(item_to_update->eo_check, item_to_update->chk_status);
326 elm_object_item_disabled_set(item_to_update->item, EINA_TRUE);
327 elm_object_disabled_set(item_to_update->eo_check, EINA_TRUE);
329 /* Change system slider's icon as mute style */
330 setting_sound_update_slider_icon(item_to_update, SND_SLIDER_SYSTEM);
333 /*4.Disable "Call ringtone" */
334 item_to_update = ad->data_call_volume;
335 if (item_to_update && item_to_update->eo_check) {
336 /*DO NOT CHANGE Backup Values(VCONFKEY_SETAPPL_RINGTONE_BACKUP_VOLUME) */
337 item_to_update->chk_status = 0;
338 elm_slider_value_set(item_to_update->eo_check, item_to_update->chk_status);
339 SETTING_TRACE("item_to_update->chk_status : %d", item_to_update->chk_status);
344 static void ___sound_vconf_change_cb(keynode_t *key, void *data)
346 ret_if(data == NULL);
347 SettingProfileUG *ad = data;
350 char *pa_ringtone = NULL;
351 char *sub_desc = NULL;
352 char *vconf_name = vconf_keynode_get_name(key);
353 Setting_GenGroupItem_Data *item_to_update = NULL;
355 if (!safeStrCmp(vconf_name, VCONFKEY_SYSMAN_MMC_STATUS)) {
356 status = vconf_keynode_get_int(key);
357 SETTING_TRACE("status:%d", status);
358 if (VCONFKEY_SYSMAN_MMC_MOUNTED != status) {
359 /* when remove mmc card, change default tone */
360 char *call_tone = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR);
361 if (call_tone && !safeStrNCmp(SETTING_PROFILE_MMC_PATH, call_tone, safeStrLen(SETTING_PROFILE_MMC_PATH))) {
363 ret = vconf_set_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, SETTING_DEFAULT_CALL_TONE_SDK);
365 ret = vconf_set_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, SETTING_DEFAULT_CALL_TONE);
368 SETTING_TRACE_DEBUG("failed to set vconf");
372 ret_if((!ad->mp_ringtone && !ad->mp_noti && !ad->mp_media));
373 SETTING_TRACE("song_playing:%s", ad->song_playing);
375 if (!safeStrNCmp(SETTING_PROFILE_MMC_PATH, ad->song_playing, safeStrLen(SETTING_PROFILE_MMC_PATH))) {
377 setting_sound_close_all_mm_players(ad);
378 /* close vibration */
381 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_SOUND_STATUS_BOOL)) {
382 status = vconf_keynode_get_bool(key);
383 SETTING_TRACE_DEBUG("sound status is changed. %d", status);
385 __enable_sound_menu(ad);
387 __disable_sound_menu(ad);
391 setting_sound_update_slider_icon(ad->data_call_volume, SND_SLIDER_CALL);
392 /*FIX P141016-02659 Only In sound mode should enable "vibrate when ringing" */
393 setting_genlist_item_disabled_set(ad->data_sound_when_ring, !status);
394 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL)) {
395 status = vconf_keynode_get_bool(key);
396 SETTING_TRACE_DEBUG("vibration status is changed. %d", status);
398 PLAY_FEEDBACK(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_VIBRATION_ON)
401 setting_sound_update_slider_icon(ad->data_call_volume, SND_SLIDER_CALL);
402 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL)) {
403 item_to_update = ad->data_sound_when_ring;
404 status = vconf_keynode_get_bool(key);
405 if (item_to_update && item_to_update->eo_check) {
406 item_to_update->chk_status = status;
407 elm_check_state_set(item_to_update->eo_check, item_to_update->chk_status);
409 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_BUTTON_SOUNDS_BOOL)) {
410 item_to_update = ad->data_button_sounds;
411 status = vconf_keynode_get_bool(key);
412 if (item_to_update && item_to_update->eo_check) {
413 item_to_update->chk_status = status;
414 elm_check_state_set(item_to_update->eo_check, item_to_update->chk_status);
416 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_TOUCH_SOUNDS_BOOL)) {
417 item_to_update = ad->data_touch_sounds;
418 status = vconf_keynode_get_bool(key);
419 if (item_to_update && item_to_update->eo_check) {
420 item_to_update->chk_status = status;
421 elm_check_state_set(item_to_update->eo_check, item_to_update->chk_status);
423 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_SOUND_LOCK_BOOL)) {
424 item_to_update = ad->data_lock_sound;
425 status = vconf_keynode_get_bool(key);
426 if (item_to_update && item_to_update->eo_check) {
427 item_to_update->chk_status = status;
428 elm_check_state_set(item_to_update->eo_check, item_to_update->chk_status);
432 else if (!safeStrCmp(vconf_name, VCONFKEY_ISE_KEYSOUND)) {
433 item_to_update = ad->data_keyboard_sound;
434 status = vconf_keynode_get_bool(key);
435 if (item_to_update && item_to_update->eo_check) {
436 item_to_update->chk_status = status;
437 elm_check_state_set(item_to_update->eo_check, item_to_update->chk_status);
441 else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR)) {
442 item_to_update = ad->data_call_alert_tone;
444 pa_ringtone = (char *)g_strdup(vconf_keynode_get_str(key));
445 if (setting_sound_check_file_exist(ad, pa_ringtone) == SETTING_RETURN_FAIL) {
448 pa_ringtone = (char *)g_strdup(SETTING_DEFAULT_CALL_TONE_SDK);
451 pa_ringtone = (char *)g_strdup(SETTING_DEFAULT_CALL_TONE);
453 ret = vconf_set_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, pa_ringtone);
455 SETTING_TRACE_DEBUG("failed to set vconf");
457 sub_desc = setting_media_basename(pa_ringtone);
458 if (item_to_update) {
459 item_to_update->sub_desc = (char *)g_strdup(sub_desc);
460 elm_genlist_item_update(item_to_update->item);
464 } else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR)) {
465 item_to_update = ad->data_msg_alert_tone;
466 pa_ringtone = (char *)g_strdup(vconf_keynode_get_str(key));
467 if (setting_sound_check_file_exist(ad, pa_ringtone) == SETTING_RETURN_FAIL) {
469 pa_ringtone = (char *)g_strdup(SETTING_DEFAULT_MSG_TONE);
470 ret = vconf_set_str(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, pa_ringtone);
472 SETTING_TRACE_DEBUG("failed to set vconf");
474 sub_desc = setting_media_basename(pa_ringtone);
475 if (item_to_update) {
476 item_to_update->sub_desc = (char *)g_strdup(sub_desc);
477 elm_genlist_item_update(item_to_update->item);
484 int setting_sound_listen_vconf_change(void *data)
486 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
489 (void)vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_STATUS, ___sound_vconf_change_cb, data);
492 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, ___sound_vconf_change_cb, data);
493 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, ___sound_vconf_change_cb, data);
495 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL, ___sound_vconf_change_cb, data);
496 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_BUTTON_SOUNDS_BOOL, ___sound_vconf_change_cb, data);
497 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_SOUNDS_BOOL, ___sound_vconf_change_cb, data);
498 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, ___sound_vconf_change_cb, data);
499 /* (void)vconf_notify_key_changed(VCONFKEY_ISE_KEYSOUND, ___sound_vconf_change_cb, data); */
502 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, ___sound_vconf_change_cb, data);
503 (void)vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, ___sound_vconf_change_cb, data);
508 int setting_sound_unlisten_vconf_change(void *data)
512 (void)vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_STATUS, ___sound_vconf_change_cb);
515 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, ___sound_vconf_change_cb);
516 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, ___sound_vconf_change_cb);
518 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL, ___sound_vconf_change_cb);
519 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_BUTTON_SOUNDS_BOOL, ___sound_vconf_change_cb);
520 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_SOUNDS_BOOL, ___sound_vconf_change_cb);
521 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, ___sound_vconf_change_cb);
522 /*(void)vconf_ignore_key_changed(VCONFKEY_ISE_KEYSOUND, ___sound_vconf_change_cb); */
525 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, ___sound_vconf_change_cb);
526 (void)vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, ___sound_vconf_change_cb);
530 static Eina_Bool __volume_up_timer_cb(void *data)
533 retv_if(!data, EINA_FALSE);
534 SettingProfileUG *ad = (SettingProfileUG *)data;
536 if (ad->is_pressing == FALSE) {
537 ad->updown_timer = NULL;
541 sound_type_e sound_type = 0;
543 sound_manager_get_current_sound_type(&sound_type);
544 if (sound_type == SOUND_TYPE_MEDIA) {
545 int ret = sound_manager_get_volume(sound_type, &volume);
546 SETTING_TRACE("ret:%d", ret);
548 sound_manager_set_volume(sound_type, ++volume);
549 if (ad->data_media_volume && ad->data_media_volume->eo_check) {
550 ad->data_media_volume->chk_status = volume;
551 elm_slider_value_set(ad->data_media_volume->eo_check, volume);
555 int ret = sound_manager_get_volume(SOUND_TYPE_RINGTONE, &volume);
556 SETTING_TRACE("ret:%d", ret);
558 sound_manager_set_volume(SOUND_TYPE_RINGTONE, ++volume);
559 if (ad->data_call_volume && ad->data_call_volume->eo_check) {
560 ad->data_call_volume->chk_status = volume;
561 elm_slider_value_set(ad->data_call_volume->eo_check, volume);
562 SETTING_TRACE("ad->data_call_volume->chk_status : %d", ad->data_call_volume->chk_status);
570 static Eina_Bool __volume_down_timer_cb(void *data)
573 retv_if(!data, EINA_FALSE);
574 SettingProfileUG *ad = (SettingProfileUG *)data;
576 if (ad->is_pressing == FALSE) {
577 ad->updown_timer = NULL;
581 sound_type_e sound_type = 0;
583 sound_manager_get_current_sound_type(&sound_type);
584 if (sound_type == SOUND_TYPE_MEDIA) {
585 int ret = sound_manager_get_volume(sound_type, &volume);
586 SETTING_TRACE("ret:%d", ret);
588 sound_manager_set_volume(sound_type, --volume);
589 if (ad->data_media_volume && ad->data_media_volume->eo_check) {
590 ad->data_media_volume->chk_status = volume;
591 elm_slider_value_set(ad->data_media_volume->eo_check, volume);
595 int ret = sound_manager_get_volume(SOUND_TYPE_RINGTONE, &volume);
596 SETTING_TRACE("ret:%d", ret);
598 sound_manager_set_volume(SOUND_TYPE_RINGTONE, --volume);
600 /* change to Vibration mode */
601 vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, FALSE);
602 vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, TRUE);
603 PLAY_FEEDBACK(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_VIBRATION_ON);
605 if (ad->data_call_volume && ad->data_call_volume->eo_check) {
606 ad->data_call_volume->chk_status = volume;
607 elm_slider_value_set(ad->data_call_volume->eo_check, volume);
608 SETTING_TRACE("ad->data_call_volume->chk_status : %d", ad->data_call_volume->chk_status);
609 setting_sound_update_slider_icon(ad->data_call_volume, SND_SLIDER_CALL);
618 static Eina_Bool __volume_key_up_cb(void *data, int type, void *event)
621 retv_if(!data || !event, EINA_TRUE);
622 SettingProfileUG *ad = (SettingProfileUG *)data;
624 Ecore_Event_Key *ev = event;
625 char *key = (char *)ev->key;
629 if (!safeStrCmp(key, KEY_VOLUMEUP) || !safeStrCmp(key, KEY_VOLUMEDOWN)) {
630 ad->is_pressing = FALSE;
631 if (ad->updown_timer) {
632 ecore_timer_del(ad->updown_timer);
633 ad->updown_timer = NULL;
641 static Eina_Bool __volume_key_down_cb(void *data, int type, void *event)
644 retv_if(!data || !event, EINA_TRUE);
645 SettingProfileUG *ad = (SettingProfileUG *)data;
647 Ecore_Event_Key *ev = event;
648 char *key = (char *)ev->key;
652 /* get current sound type */
653 sound_type_e sound_type;
656 if (!safeStrCmp(key, KEY_VOLUMEUP)) {
657 SETTING_TRACE("Press KEY_VOLUMEUP");
660 * On the volume popup,
661 * 1) if user controls the slider, don't play any sounds��just change volume.
662 * 2) if user controls the HW volume key for ringtone sound, the beep sound is supported
665 * 1) if user controls the slider, change volume & play sound
666 * 2) if user controls the HW volume key, do nothing(DO NOT change volume,DO NoT play sound)
668 if (0 != safeStrCmp(ad->viewtype, VOLUME_APP_NAME)) {
672 /*if (ad->view_type != SETTING_PROF_VIEW_VOL) return EINA_TRUE; */
674 ad->is_pressing = TRUE;
676 sound_manager_get_current_sound_type(&sound_type);
677 if (sound_type == SOUND_TYPE_MEDIA) {
678 SETTING_TRACE("sound_type == SOUND_TYPE_MEDIA")
679 int ret = sound_manager_get_volume(sound_type, &volume);
680 SETTING_TRACE("ret:%d", ret);
683 int ret = sound_manager_set_volume(sound_type, volume);
685 if (/*ret == SOUND_MANAGER_ERROR_NO_OPERATION ||*/ ret == SOUND_MANAGER_ERROR_INTERNAL) {
686 SETTING_TRACE_DEBUG("didn't set volume");
688 ad->data_media_volume->chk_status = 10;
689 elm_slider_value_set(ad->data_media_volume->eo_check, 10);
694 if (ad->data_media_volume && ad->data_media_volume->eo_check) {
695 ad->data_media_volume->chk_status = volume;
696 elm_slider_value_set(ad->data_media_volume->eo_check, volume);
700 SETTING_TRACE("sound_type == SOUND_TYPE_RINGTONE")
701 int ret = sound_manager_get_volume(SOUND_TYPE_RINGTONE, &volume);
702 /*ad->backup_ringtong_volume = volume; */
703 /*vconf_set_int(VCONFKEY_SETAPPL_RINGTONE_BACKUP_VOLUME, ad->backup_ringtong_volume); */
704 /*SETTING_TRACE("ret:%d, volume:%d, ad->backup_ringtong_volume:%d", ret, volume, ad->backup_ringtong_volume); */
706 sound_manager_set_volume(SOUND_TYPE_RINGTONE, ++volume);
709 vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound);
710 if (volume > 0 && !sound) {
711 vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, TRUE);
712 vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, FALSE);
713 ad->data_call_volume->chk_status = volume;
714 setting_sound_update_slider_icon(ad->data_call_volume, SND_SLIDER_CALL);
716 if (ad->data_call_volume && ad->data_call_volume->eo_check) {
717 ad->data_call_volume->chk_status = volume;
718 elm_slider_value_set(ad->data_call_volume->eo_check, volume);
719 SETTING_TRACE("ad->data_call_volume->chk_status : %d", ad->data_call_volume->chk_status);
723 SETTING_TRACE("ad->mp_ringtone:%p, volume:%d", ad->mp_ringtone, volume);
724 if (ad->mp_ringtone == NULL) {
725 setting_sound_close_other_mm_players_but_type(ad, SOUND_TYPE_RINGTONE);
727 setting_sound_play_sound_origin(&(ad->mp_ringtone), ad, NULL,
728 "/opt/usr/share/settings/Sys/Volume_control.ogg",
730 SOUND_TYPE_RINGTONE);
733 player_state_e state;
734 player_get_state(*(ad->mp_ringtone), &state);
735 if (state == PLAYER_STATE_PAUSED) {
736 SETTING_TRACE("state == PLAYER_STATE_PAUSED");
737 player_start(*(ad->mp_ringtone));
738 } else if (state == PLAYER_STATE_PLAYING) {
739 SETTING_TRACE("state == PLAYER_STATE_PLAYING");
740 player_set_mute(*(ad->mp_ringtone), FALSE);
744 ad->updown_timer = ecore_timer_add(0.5, __volume_up_timer_cb, ad);
745 } else if (!safeStrCmp(key, KEY_VOLUMEDOWN)) {
746 SETTING_TRACE("Press KEY_VOLUMEDOWN");
749 * On the volume popup,
750 * 1) if user controls the slider, don't play any sounds��just change volume.
751 * 2) if user controls the HW volume key for ringtone sound, the beep sound is supported
754 * 1) if user controls the slider, change volume & play sound
755 * 2) if user controls the HW volume key, do nothing(DO NOT change volume,DO NoT play sound)
757 if (0 != safeStrCmp(ad->viewtype, VOLUME_APP_NAME)) {
760 /*if (ad->view_type != SETTING_PROF_VIEW_VOL) return EINA_TRUE; */
761 ad->is_pressing = TRUE;
762 sound_manager_get_current_sound_type(&sound_type);
763 if (sound_type == SOUND_TYPE_MEDIA) {
764 SETTING_TRACE("sound_type == SOUND_TYPE_MEDIA")
765 int ret = sound_manager_get_volume(sound_type, &volume);
766 SETTING_TRACE("ret:%d", ret);
768 sound_manager_set_volume(sound_type, --volume);
769 if (ad->data_media_volume && ad->data_media_volume->eo_check) {
770 ad->data_media_volume->chk_status = volume;
771 elm_slider_value_set(ad->data_media_volume->eo_check, volume);
776 SETTING_TRACE("sound_type == SOUND_TYPE_RINGTONE");
778 vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound);
779 if (!sound) return EINA_TRUE;
780 int ret = sound_manager_get_volume(SOUND_TYPE_RINGTONE, &volume);
781 SETTING_TRACE("ret:%d, volume:%d", ret, volume);
783 sound_manager_set_volume(SOUND_TYPE_RINGTONE, --volume);
785 /* change to Vibration mode */
786 vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, FALSE);
787 vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, TRUE);
789 PLAY_FEEDBACK(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_VIBRATION_ON);
791 ad->data_call_volume->chk_status = volume;
792 setting_sound_update_slider_icon(ad->data_call_volume, SND_SLIDER_CALL);
794 if (ad->data_call_volume && ad->data_call_volume->eo_check) {
795 ad->data_call_volume->chk_status = volume;
796 elm_slider_value_set(ad->data_call_volume->eo_check, volume);
797 SETTING_TRACE("ad->data_call_volume->chk_status : %d", ad->data_call_volume->chk_status);
800 if (ad->mp_ringtone == NULL) {
801 setting_sound_close_other_mm_players_but_type(ad, SOUND_TYPE_RINGTONE);
803 setting_sound_play_sound_origin(&(ad->mp_ringtone), ad, NULL,
804 "/opt/usr/share/settings/Sys/Volume_control.ogg",
806 SOUND_TYPE_RINGTONE);
809 player_state_e state;
810 player_get_state(*(ad->mp_ringtone), &state);
811 SETTING_TRACE("ringtone player status : %d", state);
812 if (state == PLAYER_STATE_PAUSED) {
813 player_start(*(ad->mp_ringtone));
817 ad->updown_timer = ecore_timer_add(0.5, __volume_down_timer_cb, ad);
820 else if (!safeStrCmp(key, KEY_MENU)) {
821 SETTING_TRACE("KEY_MENU CLICK.");
822 } else if (!safeStrCmp(key, KEY_HOME)) { /*XF86Phone*/
823 SETTING_TRACE("KEY_HOME is pressed");
824 if (!safeStrCmp(ad->viewtype, "org.tizen.volume"))
825 ug_destroy_me(ad->ug);
833 void __setting_sound_ug_key_grab(SettingProfileUG *ad)
842 /* To prevent conflict with volume app */
843 vconf_set_int(VCONFKEY_STARTER_USE_VOLUME_KEY, 2);
846 Ecore_X_Window xwin = 0;
847 Ecore_X_Display *disp = NULL;
848 disp = ecore_x_display_get();
849 xwin = elm_win_xwindow_get(ad->win_get);
851 ret = utilx_grab_key(disp, xwin, KEY_VOLUMEUP, TOP_POSITION_GRAB);
853 SETTING_TRACE_DEBUG("KEY_VOLUMEUP grab failed");
855 ret = utilx_grab_key(disp, xwin, KEY_VOLUMEDOWN, TOP_POSITION_GRAB);
857 SETTING_TRACE_DEBUG("KEY_VOLUMEDOWN grab failed");
859 if (ad->keydown_handler) {
860 ecore_event_handler_del(ad->keydown_handler);
861 ad->keydown_handler = NULL;
863 if (ad->keyup_handler) {
864 ecore_event_handler_del(ad->keyup_handler);
865 ad->keyup_handler = NULL;
867 ad->keydown_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __volume_key_down_cb, ad);
868 if (!ad->keydown_handler)
869 SETTING_TRACE_DEBUG("ecore_event_handler_add() failed");
871 ad->keyup_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, __volume_key_up_cb, ad);
872 if (!ad->keyup_handler)
873 SETTING_TRACE_DEBUG("ecore_event_handler_add() failed");
879 void __setting_sound_ug_key_ungrab(SettingProfileUG *ad)
888 /* To prevent conflict with volume app */
889 vconf_set_int(VCONFKEY_STARTER_USE_VOLUME_KEY, 0);
891 Ecore_X_Window xwin = 0;
892 Ecore_X_Display *disp = NULL;
894 disp = ecore_x_display_get();
895 xwin = elm_win_xwindow_get(ad->win_get);
897 ret = utilx_ungrab_key(disp, xwin, KEY_VOLUMEUP);
899 SETTING_TRACE_DEBUG("KEY_VOLUMEUP ungrab failed");
901 ret = utilx_ungrab_key(disp, xwin, KEY_VOLUMEDOWN);
903 SETTING_TRACE_DEBUG("KEY_VOLUMEDOWN ungrab failed");
906 if (ad->updown_timer) {
907 ecore_timer_del(ad->updown_timer);
908 ad->updown_timer = NULL;
910 if (ad->keydown_handler) {
911 ecore_event_handler_del(ad->keydown_handler);
912 ad->keydown_handler = NULL;
914 if (ad->keyup_handler) {
915 ecore_event_handler_del(ad->keyup_handler);
916 ad->keyup_handler = NULL;
921 Evas_Object *setting_sound_init(void *data)
924 /*appcore_measure_start(); */
925 retv_if(data == NULL, NULL);
926 SettingProfileUG *ad = data;
928 bindtextdomain(SETTING_PACKAGE, SETTING_LOCALEDIR);
930 setting_create_Gendial_itc("slider.main", &(ad->itc_layout));
931 ad->itc_layout.func.content_get = __sound_slider_icon_get;
933 setting_create_Gendial_itc("1icon", &(ad->itc_layout_1icon));
934 ad->itc_layout_1icon.func.content_get = __sound_slider_icon_get;
936 /* register view node table */
937 setting_view_node_table_intialize();
938 setting_view_node_table_register(&setting_view_sound_main, NULL);
940 if (!safeStrCmp(ad->viewtype, VOLUME_APP_NAME))
941 elm_win_wm_rotation_preferred_rotation_set(ad->win_get, -1);
943 elm_win_wm_rotation_preferred_rotation_set(ad->win_get, 0);
945 /* creating a view. */
946 setting_view_node_set_cur_view(&setting_view_sound_main);
947 setting_view_create(&setting_view_sound_main, (void *)ad);
949 setting_sound_listen_vconf_change(ad);
954 void setting_sound_deinit(void *data)
957 ret_if(data == NULL);
958 SettingProfileUG *ad = data;
959 elm_win_wm_rotation_preferred_rotation_set(ad->win_get, -1);
961 setting_sound_unlisten_vconf_change(ad);
962 setting_sound_close_all_mm_players(ad);
964 if (ad->calling_popup) {
965 evas_object_del(ad->calling_popup);
966 ad->calling_popup = NULL;
969 if (ad->updown_timer) {
970 ecore_timer_del(ad->updown_timer);
971 ad->updown_timer = NULL;
973 if (ad->keydown_handler) {
974 ecore_event_handler_del(ad->keydown_handler);
975 ad->keydown_handler = NULL;
977 if (ad->keyup_handler) {
978 ecore_event_handler_del(ad->keyup_handler);
979 ad->keyup_handler = NULL;
983 /* it is the view manage strategy to invoke view's destory operation. */
984 setting_view_destroy(&setting_view_sound_main, ad);
989 /* ***************************************************
993 ***************************************************/
994 static void __calling_popup_cb(void *data, Evas_Object *obj, void *event_info)
996 ret_if(data == NULL);
997 SettingProfileUG *ad = (SettingProfileUG *) data;
999 if (ad->calling_popup) {
1000 evas_object_del(ad->calling_popup);
1001 ad->calling_popup = NULL;
1005 /* Show guide popup, when drag or tap slider if during call.
1006 Do not provide pre-listening. */
1007 void setting_sound_create_warning_popup_during_call(void *data)
1009 ret_if(data == NULL);
1010 SettingProfileUG *ad = (SettingProfileUG *) data;
1013 vconf_get_int(VCONFKEY_CALL_STATE, &call_state);
1014 if (call_state != VCONFKEY_CALL_OFF) {
1015 SETTING_TRACE("Call status is not OFF (%d)", call_state);
1016 if (!ad->calling_popup) {
1017 ad->calling_popup = setting_create_popup_with_btn(ad, ad->win_get,
1018 "IDS_ST_HEADER_UNABLE_TO_PLAY_SAMPLE_ABB",
1019 "IDS_ST_POP_SAMPLES_CANNOT_BE_PLAYED_DURING_CALLS",
1020 __calling_popup_cb, 0,
1021 1, "IDS_ST_BUTTON_OK");
1028 static void __mm_player_msg_cb(void *user_param)
1030 ret_if(user_param == NULL);
1031 SettingProfileUG *ad = (SettingProfileUG *)user_param;
1033 SETTING_TRACE("completed_cb is called.");
1034 setting_sound_close_all_mm_players(ad);
1037 static void __mm_player_interrupted_cb(player_interrupted_code_e code, void *user_data)
1039 ret_if(user_data == NULL);
1040 SettingProfileUG *ad = (SettingProfileUG *)user_data;
1042 SETTING_TRACE("interrupted code : %d", code);
1044 if (ad->mp_ringtone) {
1045 player_state_e state;
1046 player_get_state(*(ad->mp_ringtone), &state);
1047 SETTING_TRACE("ringtone player state : %d", state);
1048 } else if (ad->mp_noti) {
1049 player_state_e state;
1050 player_get_state(*(ad->mp_noti), &state);
1051 SETTING_TRACE("noti player state : %d", state);
1052 } else if (ad->mp_media) {
1053 player_state_e state;
1054 player_get_state(*(ad->mp_media), &state);
1055 SETTING_TRACE("media player state : %d", state);
1059 static Eina_Bool __play_timer_cb(void *data)
1061 SETTING_TRACE_BEGIN;
1062 retv_if(!data, EINA_FALSE);
1063 SettingProfileUG *ad = (SettingProfileUG *)data;
1065 if (ad->mp_prepare_async) {
1066 SETTING_TRACE("player (%x)", ad->mp_prepare_async);
1068 player_state_e state = -1;
1069 err = player_get_state(*(ad->mp_prepare_async), &state);
1070 SETTING_TRACE("state:%d", state);
1072 if (state != PLAYER_STATE_READY) {
1073 SETTING_TRACE_ERROR("state of player is invalid %d", err);
1074 player_unprepare(*(ad->mp_prepare_async));
1075 player_destroy(*(ad->mp_prepare_async));
1076 if (ad->mp_prepare_async == ad->mp_ringtone) {
1077 free(ad->mp_ringtone);
1078 ad->mp_ringtone = NULL;
1079 } else if (ad->mp_prepare_async == ad->mp_noti) {
1082 } else if (ad->mp_prepare_async == ad->mp_media) {
1084 ad->mp_media = NULL;
1086 ad->mp_prepare_async = NULL;
1090 player_set_completed_cb(*(ad->mp_prepare_async), __mm_player_msg_cb, ad);
1091 player_set_interrupted_cb(*(ad->mp_prepare_async), __mm_player_interrupted_cb, ad);
1093 err = player_start(*(ad->mp_prepare_async));
1094 if (err != PLAYER_ERROR_NONE) { /* if directly return error.. */
1095 SETTING_TRACE_ERROR("player_start [%d]", err);
1096 player_unset_completed_cb(*(ad->mp_prepare_async));
1097 player_unset_interrupted_cb(*(ad->mp_prepare_async));
1098 player_unprepare(*(ad->mp_prepare_async));
1099 player_destroy(*(ad->mp_prepare_async));
1100 if (ad->mp_prepare_async == ad->mp_ringtone) {
1101 free(ad->mp_ringtone);
1102 ad->mp_ringtone = NULL;
1103 } else if (ad->mp_prepare_async == ad->mp_noti) {
1106 } else if (ad->mp_prepare_async == ad->mp_media) {
1108 ad->mp_media = NULL;
1110 ad->mp_prepare_async = NULL;
1116 static void __mm_player_pipe_handler(void *data, void *buf, unsigned int len)
1118 SETTING_TRACE_BEGIN;
1121 /* Async cb : to improve slider's performance when creating player */
1122 static void __mm_player_prepared_cb(void *user_data)
1124 SETTING_TRACE_BEGIN;
1126 SettingProfileUG *ad = (SettingProfileUG *)user_data;
1128 /* Do not call mm API in mm cb : Add timer to avoid it */
1129 ecore_timer_add(0.0, (Ecore_Task_Cb)__play_timer_cb, ad);
1131 /* wake main thread up for timer to work well */
1133 pipe = ecore_pipe_add(__mm_player_pipe_handler, NULL);
1134 ecore_pipe_write_close(pipe);
1135 ecore_pipe_del(pipe);
1139 player_h *setting_sound_play_sound(void *data, void *cb,
1140 char *ringtone_file,
1142 sound_type_e sound_type)
1145 retv_if(data == NULL, NULL);
1146 SettingProfileUG *ad = (SettingProfileUG *) data;
1148 int is_existing = setting_sound_check_file_exist(ad, ringtone_file);
1149 if (is_existing == SETTING_RETURN_FAIL || NULL == ringtone_file) {
1150 switch (sound_type) {
1151 case SOUND_TYPE_RINGTONE:
1153 ad->song_playing = (char *)g_strdup(SETTING_DEFAULT_CALL_TONE_SDK);
1155 ad->song_playing = (char *)g_strdup(SETTING_DEFAULT_CALL_TONE);
1157 case SOUND_TYPE_MEDIA:
1159 ad->song_playing = (char *)g_strdup(SETTING_DEFAULT_CALL_TONE_SDK);
1161 ad->song_playing = (char *)g_strdup(SETTING_DEFAULT_MEDIA_TONE);
1163 case SOUND_TYPE_NOTIFICATION:
1164 ad->song_playing = (char *)g_strdup(SETTING_DEFAULT_MSG_TONE);
1168 ad->song_playing = (char *)g_strdup(SETTING_DEFAULT_CALL_TONE_SDK);
1170 ad->song_playing = (char *)g_strdup(SETTING_DEFAULT_CALL_TONE);
1175 if (safeStrCmp(ringtone_file, "Silent") == 0)
1178 ad->song_playing = (char *)g_strdup(ringtone_file);
1181 player_h *player = calloc(1, sizeof(player_h));
1183 SETTING_TRACE_ERROR("failed to calloc player_h");
1189 sound_manager_set_session_type(SOUND_SESSION_TYPE_MEDIA);
1190 /*sound_manager_set_media_session_option(SOUND_SESSION_OPTION_PAUSE_OTHERS_WHEN_START, SOUND_SESSION_OPTION_INTERRUPTIBLE_DURING_PLAY); */
1191 /*sound_manager_session_set_state_others(SOUND_STATE_PAUSE); */
1193 err = player_create(player);
1194 if (err != PLAYER_ERROR_NONE) {
1195 SETTING_TRACE_ERROR("creating the player handle failed[%d]", err);
1200 err = player_set_sound_type(*player, sound_type);
1201 if (err != PLAYER_ERROR_NONE) {
1202 SETTING_TRACE_ERROR("error to set sound_type[%d]", err);
1203 player_destroy(*player);
1208 SETTING_TRACE_DEBUG("player_set_sound_type [%d]", sound_type);
1210 err = player_set_uri(*player, ad->song_playing);
1211 if (err != PLAYER_ERROR_NONE) {
1212 SETTING_TRACE_ERROR("error to set attribute---profile_uri[%d]", err);
1213 player_destroy(*player);
1218 if (sound_type != SOUND_TYPE_MEDIA) {
1220 /*err = player_set_session_prelistening(*player); */
1221 /*player_prelistening_mode_e mode; */
1223 if (sound_type == SOUND_TYPE_NOTIFICATION) {
1224 mode = PLAYER_PRELISTENING_MODE_NOTIFICATION;
1226 mode = PLAYER_PRELISTENING_MODE_CALL;
1228 err = player_set_prelistening_mode(*player, mode);
1229 if (err != PLAYER_ERROR_NONE) {
1230 SETTING_TRACE_ERROR("error to player_set_session_prelistening[%d]", err);
1231 player_destroy(*player);
1238 err = player_set_safety_volume(*player);
1239 if (err != PLAYER_ERROR_NONE) {
1240 SETTING_TRACE_ERROR("error to player_set_volume[%d]", err);
1241 player_destroy(*player);
1247 #if SUPPORT_PLAYER_ASYNC
1248 err = player_prepare_async(*player, __mm_player_prepared_cb, ad);
1249 if (err != PLAYER_ERROR_NONE) {
1250 SETTING_TRACE_ERROR("realizing the player handle failed[%d]", err);
1251 ad->mp_prepare_async = NULL;
1252 player_destroy(*player);
1256 ad->mp_prepare_async = player;
1257 SETTING_TRACE("waiting..player (%x)", ad->mp_prepare_async);
1259 err = player_prepare(*player);
1260 if (err != PLAYER_ERROR_NONE) {
1261 SETTING_TRACE_ERROR("player_prepare() error %d", err);
1262 player_destroy(*player);
1267 player_state_e state = -1;
1268 err = player_get_state(*player, &state);
1269 SETTING_TRACE("state:%d", state);
1270 if (state != PLAYER_STATE_READY) {
1271 SETTING_TRACE_ERROR("state of player is invalid %d", err);
1272 player_unprepare(*player);
1273 player_destroy(*player);
1279 player_set_completed_cb(*player, __mm_player_msg_cb, ad);
1280 player_set_interrupted_cb(*player, __mm_player_interrupted_cb, ad);
1282 err = player_start(*player);
1283 if (err != PLAYER_ERROR_NONE) {
1284 /* if directly return error.. */
1285 SETTING_TRACE_ERROR("player_start [%d]", err);
1286 player_unset_completed_cb(*player);
1287 player_unset_interrupted_cb(*player);
1288 player_unprepare(*player);
1289 player_destroy(*player);
1298 void setting_sound_play_sound_origin(player_h **mp_handle, void *data,
1299 void *cb, char *ringtone_file,
1302 sound_type_e sound_type)
1304 SETTING_TRACE_BEGIN;
1306 ret_if(data == NULL);
1309 SETTING_TRACE_DEBUG("vol < EXP");
1311 if (setting_sound_stop_sound(data, *mp_handle) != SETTING_RETURN_SUCCESS) {
1320 int vconf_value = 0;
1321 vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS, &vconf_value);
1322 if (vconf_value == TRUE)
1325 SettingProfileUG *ad = (SettingProfileUG *) data;
1326 if (*mp_handle == NULL) {
1327 *mp_handle = setting_sound_play_sound(ad, cb, ringtone_file, vol, sound_type);
1328 SETTING_TRACE("mp_handle (%x)", *mp_handle);
1332 int setting_sound_stop_sound(void *data, player_h *player)
1334 SETTING_TRACE_BEGIN;
1335 retv_if(data == NULL || player == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1337 SETTING_TRACE("player (%x)", player);
1339 SettingProfileUG *ad = (SettingProfileUG *) data;
1340 if (ad->song_playing) {
1341 g_free(ad->song_playing);
1342 ad->song_playing = NULL;
1345 player_state_e state = -1;
1346 int ret = SETTING_RETURN_SUCCESS;
1347 int prev_behavior = 0; /* instead of do_while(0) and break */
1349 player_get_state(*player, &state);
1350 if (state == PLAYER_STATE_PLAYING) {
1351 if (player_stop(*player) != PLAYER_ERROR_NONE) {
1352 SETTING_TRACE("mm player stop failed");
1353 ret = SETTING_MMPLAYER_STOP_ERR;
1354 prev_behavior++; /* instead of do_while(0) and break */
1358 player_unset_completed_cb(*player);
1359 player_unset_interrupted_cb(*player);
1361 if ((prev_behavior == 0) && (player_unprepare(*player) != PLAYER_ERROR_NONE)) {
1362 SETTING_TRACE("mm player unrealize failed");
1363 ret = SETTING_MMPLAYER_UNREALIZE_ERR;
1364 prev_behavior++; /* instead of do_while(0) and break */
1367 if ((prev_behavior == 0) && (player_destroy(*player) != PLAYER_ERROR_NONE)) {
1368 SETTING_TRACE("mm player destroy failed");
1369 ret = SETTING_MMPLAYER_DESTROY_ERR;
1376 int __close_player(void *data, SoundType type)
1378 SETTING_TRACE_BEGIN;
1380 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1382 SettingProfileUG *ad = (SettingProfileUG *) data;
1383 player_h *tmp = NULL;
1386 case SND_SLIDER_CALL:
1387 retv_if(ad->mp_ringtone == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1388 SETTING_TRACE("ringtone player (%x)", ad->mp_ringtone);
1389 if (ad->mp_prepare_async == ad->mp_ringtone) {
1390 ad->mp_prepare_async = NULL;
1392 /*player_unprepare take so much time, so if __mm_player_msg_cb was invokeing(it will trigger invoking setting_sound_stop_sound), */
1393 /*in this time user click Back key to exit(setting_sound_deinit will trigger setting_sound_stop_sound() too) */
1394 /*if not set ad->mp_ringtone to NULL in advance, ad->mp_ringtone will be repeatly released */
1395 tmp = ad->mp_ringtone;
1396 ad->mp_ringtone = NULL;
1397 setting_sound_stop_sound(ad, tmp);
1399 case SND_SLIDER_NOTI:
1400 retv_if(ad->mp_noti == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1401 SETTING_TRACE("noti player (%x)", ad->mp_noti);
1402 if (ad->mp_prepare_async == ad->mp_noti) {
1403 ad->mp_prepare_async = NULL;
1407 setting_sound_stop_sound(ad, tmp);
1409 case SND_SLIDER_MEDIA:
1410 retv_if(ad->mp_media == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1411 SETTING_TRACE("media player (%x)", ad->mp_media);
1412 if (ad->mp_prepare_async == ad->mp_media) {
1413 ad->mp_prepare_async = NULL;
1416 ad->mp_media = NULL;
1417 setting_sound_stop_sound(ad, tmp);
1419 case SND_SLIDER_SYSTEM:
1421 return SETTING_RETURN_FAIL;
1424 return SETTING_RETURN_SUCCESS;
1428 setting_sound_close_other_mm_players_but_type(void *data, sound_type_e type)
1431 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1433 SettingProfileUG *ad = (SettingProfileUG *) data;
1438 case SOUND_TYPE_RINGTONE: /* close noti, media and system players */
1439 if (__close_player(ad, SND_SLIDER_NOTI) != SETTING_RETURN_SUCCESS)
1441 if (__close_player(ad, SND_SLIDER_MEDIA) != SETTING_RETURN_SUCCESS)
1444 case SOUND_TYPE_NOTIFICATION: /* close ringtone, media and system players */
1445 if (__close_player(ad, SND_SLIDER_CALL) != SETTING_RETURN_SUCCESS)
1447 if (__close_player(ad, SND_SLIDER_MEDIA) != SETTING_RETURN_SUCCESS)
1450 case SOUND_TYPE_MEDIA: /* close ringtone, noti and system players */
1451 if (__close_player(ad, SND_SLIDER_CALL) != SETTING_RETURN_SUCCESS)
1453 if (__close_player(ad, SND_SLIDER_NOTI) != SETTING_RETURN_SUCCESS)
1456 default: /* if unknown type, dont close any player */
1460 SETTING_TRACE_DEBUG("ret: %d", ret);
1463 return SETTING_RETURN_SUCCESS;
1465 return SETTING_RETURN_FAIL;
1469 int setting_sound_close_all_mm_players(void *data)
1472 retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1474 SettingProfileUG *ad = (SettingProfileUG *) data;
1478 if (__close_player(ad, SND_SLIDER_CALL) != SETTING_RETURN_SUCCESS)
1480 if (__close_player(ad, SND_SLIDER_NOTI) != SETTING_RETURN_SUCCESS)
1482 if (__close_player(ad, SND_SLIDER_MEDIA) != SETTING_RETURN_SUCCESS)
1486 return SETTING_RETURN_SUCCESS;
1488 return SETTING_RETURN_FAIL;