4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Seungbae Shin <seungbae.shin@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.
35 #include "include/mm_sound_mgr_common.h"
36 #include "../include/mm_sound_common.h"
41 #include "include/mm_sound_mgr_dock.h"
42 #include "include/mm_sound_mgr_session.h"
44 /******************************* Dock Code **********************************/
46 #include <sys/types.h>
52 #include "mm_sound_common.h"
56 #include <vconf-keys.h>
58 #define SOUND_DOCK_ON "/usr/share/sounds/sound-server/dock.wav"
59 #define SOUND_DOCK_OFF "/usr/share/sounds/sound-server/undock.wav"
60 #define SOUND_DOCK_ON_DELAY 1000000
61 #define SOUND_DOCK_OFF_DELAY 10000
63 #define DOCK_OFF false
66 #define DOCK_NO_RESTORE false
67 #define DOCK_RESTORE true
69 int g_saved_dock_status;
71 static void __dock_sound_finished_cb (void *data)
73 debug_log ("dock sound play finished!!!\n");
76 static void __play_dock_sound_sync(bool is_on, bool need_restore)
79 bool is_play_finished = false;
81 if (g_saved_dock_status == -1) {
82 debug_log ("skip dock sound because status is not valid [%d]\n", g_saved_dock_status);
86 debug_log ("start to play dock sound : is_on=[%d], need_restore=[%d]\n", is_on, need_restore);
89 mm_sound_play_loud_solo_sound((is_on? SOUND_DOCK_ON:SOUND_DOCK_OFF), VOLUME_TYPE_FIXED, __dock_sound_finished_cb, &is_play_finished, &handle);
90 debug_log ("waiting for dock sound finish\n");
91 while (!is_play_finished) {
92 usleep (SOUND_DOCK_OFF_DELAY);
95 mm_sound_play_loud_solo_sound_no_restore((is_on? SOUND_DOCK_ON:SOUND_DOCK_OFF), VOLUME_TYPE_FIXED, __dock_sound_finished_cb, &is_play_finished, &handle);
96 debug_log ("waiting for dock sound finish\n");
97 usleep (SOUND_DOCK_ON_DELAY);
100 debug_log ("dock sound finished!!!\n");
103 /* DOCK status value from system server */
104 static void _dock_status_changed_cb(keynode_t* node, void* data)
108 int dock_available = 0;
111 debug_error ("node is null...\n");
115 debug_msg ("Handling [%s] Starts\n", vconf_keynode_get_name(node));
117 /* Get actual vconf value */
118 vconf_get_int(VCONFKEY_SYSMAN_CRADLE_STATUS, &dock_available);
119 debug_msg ("DOCK : [%s]=[%d]\n", VCONFKEY_SYSMAN_CRADLE_STATUS, dock_available);
121 /* Set available/non-available based on vconf status value */
122 if (dock_available) {
123 /* Check user preference first */
124 vconf_get_bool(VCONFKEY_DOCK_EXT_SPEAKER, &dock_enable);
125 debug_msg ("DOCK : [%s]=[%d]\n", VCONFKEY_DOCK_EXT_SPEAKER, dock_enable);
127 /* If user preference is enabled, available it */
129 /* Play sound for dock status */
130 __play_dock_sound_sync (DOCK_ON, DOCK_NO_RESTORE);
132 /* Update device available status (available) */
133 ret = MMSoundMgrSessionSetDeviceAvailable (DEVICE_DOCK, dock_available, 0, NULL);
134 if (ret != MM_ERROR_NONE) {
135 debug_error ("MMSoundMgrSessionSetDeviceAvailable() failed...ret=%x\n", ret);
139 /* Play sound for dock status */
140 __play_dock_sound_sync (DOCK_ON, DOCK_RESTORE);
142 debug_msg ("Dock is not enabled by user, no need to set available device\n");
145 /* Play sound for dock status */
146 __play_dock_sound_sync (DOCK_OFF, DOCK_RESTORE);
148 /* Update device available status (non-available) */
149 ret = MMSoundMgrSessionSetDeviceAvailable (DEVICE_DOCK, dock_available, 0, NULL);
150 if (ret != MM_ERROR_NONE) {
151 debug_error ("MMSoundMgrSessionSetDeviceAvailable() failed...ret=%x\n", ret);
157 g_saved_dock_status = dock_available;
159 debug_msg ("Handling [%s] Ends normally\n", vconf_keynode_get_name(node));
162 static int _register_dock_status ()
164 /* set callback for vconf key change */
165 int ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_CRADLE_STATUS, _dock_status_changed_cb, NULL);
166 debug_msg ("vconf [%s] set ret = [%d]\n", VCONFKEY_SYSMAN_CRADLE_STATUS, ret);
170 /* DOCK enable setting */
171 static void _dock_setting_enable_changed_cb(keynode_t* node, void* data)
175 int dock_available = 0;
178 debug_error ("node is null...return\n");
182 debug_msg ("Handling [%s] Starts\n", vconf_keynode_get_name(node));
184 /* Get actual vconf value */
185 vconf_get_bool(VCONFKEY_DOCK_EXT_SPEAKER, &dock_enable);
186 debug_msg ("DOCK : [%s]=[%d]\n", VCONFKEY_DOCK_EXT_SPEAKER, dock_enable);
188 vconf_get_int(VCONFKEY_SYSMAN_CRADLE_STATUS, &dock_available);
189 debug_msg ("DOCK : [%s]=[%d]\n", VCONFKEY_SYSMAN_CRADLE_STATUS, dock_available);
191 /* Take care if dock is available now */
192 if (dock_available) {
193 ret = MMSoundMgrSessionSetDeviceAvailable (DEVICE_DOCK, dock_enable, 0, NULL);
194 if (ret != MM_ERROR_NONE) {
195 debug_error ("MMSoundMgrSessionSetDeviceAvailable() failed...ret=%x\n", ret);
200 debug_msg ("Dock is enabled/disabled while not available, Nothing to do Now\n");
203 debug_msg ("Handling [%s] Ends normally\n", vconf_keynode_get_name(node));
206 static int _register_dock_enable_setting ()
208 /* set callback for vconf key change */
209 int ret = vconf_notify_key_changed(VCONFKEY_DOCK_EXT_SPEAKER, _dock_setting_enable_changed_cb, NULL);
210 debug_msg ("vconf [%s] set ret = [%d]\n", VCONFKEY_DOCK_EXT_SPEAKER, ret);
216 int MMSoundMgrDockInit(void)
221 g_saved_dock_status = -1;
223 ret = vconf_get_int(VCONFKEY_SYSMAN_CRADLE_STATUS, &g_saved_dock_status);
224 debug_msg ("Initial status is [%d], ret=[%d]\n", g_saved_dock_status, ret);
226 if (_register_dock_status () != 0) {
227 debug_error ("Registering dock status failed\n");
228 return MM_ERROR_SOUND_INTERNAL;
230 if (_register_dock_enable_setting() != 0) {
231 debug_error ("Registering dock enable setting failed\n");
232 return MM_ERROR_SOUND_INTERNAL;
236 return MM_ERROR_NONE;
239 int MMSoundMgrDockFini(void)
244 return MM_ERROR_NONE;