Merge "Removed unused result variable from sound_codec_asm_callback" into tizen
[platform/core/multimedia/libmm-sound.git] / server / mm_sound_mgr_dock.c
1 /*
2  * libmm-sound
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Seungbae Shin <seungbae.shin@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 #include <stdlib.h>
23 #include <string.h>
24
25 #include <pthread.h>
26 #include <sys/shm.h>
27 #include <sys/msg.h>
28 #include <sys/mman.h>
29 #include <sys/stat.h>
30 #include <fcntl.h>
31 #include <stdbool.h>
32
33 #include <errno.h>
34
35 #include "include/mm_sound_mgr_common.h"
36 #include "../include/mm_sound_common.h"
37
38 #include <mm_error.h>
39 #include <mm_debug.h>
40
41 #include "include/mm_sound_mgr_dock.h"
42 #include "include/mm_sound_mgr_session.h"
43
44 /******************************* Dock Code **********************************/
45
46 #include <sys/types.h>
47 #include <stdbool.h>
48 #include <errno.h>
49 #include <assert.h>
50
51 #include "mm_ipc.h"
52 #include "mm_sound_common.h"
53 #include "mm_sound.h"
54
55 #include <vconf.h>
56 #include <vconf-keys.h>
57
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
62
63 #define DOCK_OFF false
64 #define DOCK_ON true
65
66 #define DOCK_NO_RESTORE false
67 #define DOCK_RESTORE true
68
69 int g_saved_dock_status;
70
71 static void __dock_sound_finished_cb (void *data)
72 {
73         debug_log ("dock sound play finished!!!\n");
74         *(bool*)data = true;
75 }
76 static void __play_dock_sound_sync(bool is_on, bool need_restore)
77 {
78         int handle;
79         bool is_play_finished = false;
80
81         if (g_saved_dock_status == -1) {
82                 debug_log ("skip dock sound because status is not valid [%d]\n", g_saved_dock_status);
83                 return;
84         }
85
86         debug_log ("start to play dock sound : is_on=[%d], need_restore=[%d]\n", is_on, need_restore);
87
88         if (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);
93                 }
94         } else {
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);
98         }
99
100         debug_log ("dock sound finished!!!\n");
101 }
102
103 /* DOCK status value from system server */
104 static void _dock_status_changed_cb(keynode_t* node, void* data)
105 {
106         int ret = 0;
107         int dock_enable = 0;
108         int dock_available = 0;
109
110         if (node == NULL) {
111                 debug_error ("node is null...\n");
112                 return;
113         }
114
115         debug_msg ("Handling [%s] Starts\n", vconf_keynode_get_name(node));
116
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);
120
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);
126
127                 /* If user preference is enabled, available it */
128                 if (dock_enable) {
129                         /* Play sound for dock status */
130                         __play_dock_sound_sync (DOCK_ON, DOCK_NO_RESTORE);
131
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);
136                                 goto EXIT;
137                         }
138                 } else {
139                         /* Play sound for dock status */
140                         __play_dock_sound_sync (DOCK_ON, DOCK_RESTORE);
141
142                         debug_msg ("Dock is not enabled by user, no need to set available device\n");
143                 }
144         } else {
145                 /* Play sound for dock status */
146                 __play_dock_sound_sync (DOCK_OFF, DOCK_RESTORE);
147
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);
152                         goto EXIT;
153                 }
154         }
155
156 EXIT:
157         g_saved_dock_status = dock_available;
158
159         debug_msg ("Handling [%s] Ends normally\n", vconf_keynode_get_name(node));
160 }
161
162 static int _register_dock_status ()
163 {
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);
167         return ret;
168 }
169
170 /* DOCK enable setting */
171 static void _dock_setting_enable_changed_cb(keynode_t* node, void* data)
172 {
173         int ret = 0;
174         int dock_enable = 0;
175         int dock_available = 0;
176
177         if (node == NULL) {
178                 debug_error ("node is null...return\n");
179                 return;
180         }
181
182         debug_msg ("Handling [%s] Starts\n", vconf_keynode_get_name(node));
183
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);
187
188         vconf_get_int(VCONFKEY_SYSMAN_CRADLE_STATUS, &dock_available);
189         debug_msg ("DOCK : [%s]=[%d]\n", VCONFKEY_SYSMAN_CRADLE_STATUS, dock_available);
190
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);
196                         return;
197                 }
198         } else {
199                 /* Do nothing */
200                 debug_msg ("Dock is enabled/disabled while not available, Nothing to do Now\n");
201         }
202
203         debug_msg ("Handling [%s] Ends normally\n", vconf_keynode_get_name(node));
204 }
205
206 static int _register_dock_enable_setting ()
207 {
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);
211         return ret;
212 }
213
214
215
216 int MMSoundMgrDockInit(void)
217 {
218         int ret = 0;
219         debug_enter("\n");
220
221         g_saved_dock_status = -1;
222
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);
225
226         if (_register_dock_status () != 0) {
227                 debug_error ("Registering dock status failed\n");
228                 return MM_ERROR_SOUND_INTERNAL;
229         }
230         if (_register_dock_enable_setting() != 0) {
231                 debug_error ("Registering dock enable setting failed\n");
232                 return MM_ERROR_SOUND_INTERNAL;
233         }
234
235         debug_leave("\n");
236         return MM_ERROR_NONE;
237 }
238
239 int MMSoundMgrDockFini(void)
240 {
241         debug_enter("\n");
242
243         debug_leave("\n");
244         return MM_ERROR_NONE;
245 }
246