summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/Makefile.am1
-rw-r--r--server/include/mm_sound_mgr_dock.h32
-rw-r--r--server/mm_sound_mgr_dock.c97
-rw-r--r--server/mm_sound_mgr_session.c105
-rw-r--r--server/mm_sound_server.c3
5 files changed, 236 insertions, 2 deletions
diff --git a/server/Makefile.am b/server/Makefile.am
index 9a02966..8509f7e 100644
--- a/server/Makefile.am
+++ b/server/Makefile.am
@@ -7,6 +7,7 @@ sound_server_SOURCES = mm_sound_mgr_codec.c \
mm_sound_mgr_asm.c \
mm_sound_mgr_device.c \
mm_sound_mgr_headset.c \
+ mm_sound_mgr_dock.c \
mm_sound_mgr_session.c \
mm_sound_mgr_run.c \
mm_sound_plugin.c \
diff --git a/server/include/mm_sound_mgr_dock.h b/server/include/mm_sound_mgr_dock.h
new file mode 100644
index 0000000..387fdfd
--- /dev/null
+++ b/server/include/mm_sound_mgr_dock.h
@@ -0,0 +1,32 @@
+/*
+ * libmm-sound
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Seungbae Shin <seungbae.shin@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __MM_SOUND_MGR_DOCK_H__
+#define __MM_SOUND_MGR_DOCK_H__
+
+#include "../../include/mm_ipc.h"
+
+int MMSoundMgrDockInit(void);
+int MMSoundMgrDockFini(void);
+
+
+#endif /* __MM_SOUND_MGR_DOCK_H__ */
+
diff --git a/server/mm_sound_mgr_dock.c b/server/mm_sound_mgr_dock.c
new file mode 100644
index 0000000..275e04a
--- /dev/null
+++ b/server/mm_sound_mgr_dock.c
@@ -0,0 +1,97 @@
+/*
+ * libmm-sound
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Seungbae Shin <seungbae.shin@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <pthread.h>
+#include <sys/shm.h>
+#include <sys/msg.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdbool.h>
+
+#include <errno.h>
+
+#include "include/mm_sound_mgr_common.h"
+#include "../include/mm_sound_common.h"
+
+#include <mm_error.h>
+#include <mm_debug.h>
+
+#include "include/mm_sound_mgr_dock.h"
+#include "include/mm_sound_mgr_session.h"
+
+/******************************* Dock Code **********************************/
+
+#include <sys/types.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "mm_ipc.h"
+#include "mm_sound_common.h"
+#include "mm_sound.h"
+
+#include <vconf.h>
+#include <vconf-keys.h>
+
+static void dock_changed_cb(keynode_t* node, void* data)
+{
+ int dock_available = 0;
+
+ /* Get actual vconf value */
+ vconf_get_int(VCONFKEY_SYSMAN_CRADLE_STATUS, &dock_available);
+
+ debug_msg ("[%s] changed callback called, key value is [%d]\n", vconf_keynode_get_name(node), dock_available);
+
+ /* Set device available based on vconf key value */
+ MMSoundMgrSessionSetDeviceAvailable (DEVICE_DOCK, dock_available, 0, NULL);
+}
+
+int _register_dock_status ()
+{
+ /* set callback for vconf key change */
+ int ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_CRADLE_STATUS, dock_changed_cb, NULL);
+ debug_msg ("vconf [%s] set ret = %d\n", VCONFKEY_SYSMAN_CRADLE_STATUS, ret);
+ return ret;
+}
+
+
+int MMSoundMgrDockInit(void)
+{
+ debug_enter("\n");
+
+ _register_dock_status ();
+
+ debug_leave("\n");
+ return MM_ERROR_NONE;
+}
+
+int MMSoundMgrDockFini(void)
+{
+ debug_enter("\n");
+
+ debug_leave("\n");
+ return MM_ERROR_NONE;
+}
+
diff --git a/server/mm_sound_mgr_session.c b/server/mm_sound_mgr_session.c
index bdcfa07..cf5351e 100644
--- a/server/mm_sound_mgr_session.c
+++ b/server/mm_sound_mgr_session.c
@@ -34,6 +34,7 @@
#include "include/mm_sound_mgr_common.h"
#include "../include/mm_sound_common.h"
+#include "../include/mm_sound.h"
#include <mm_error.h>
#include <mm_debug.h>
@@ -102,6 +103,8 @@ static int __set_sound_path_to_dual ();
#define _mm_sound_mgr_device_active_device_callback(a,b) MM_ERROR_NONE
#endif
+#define SOUND_DOCK_ON "/usr/share/svi/sound/operation/new_chat.wav"
+#define SOUND_DOCK_OFF "/usr/share/svi/sound/operation/sent_chat.wav"
typedef struct _session_info_struct
{
@@ -122,7 +125,7 @@ typedef struct _session_info_struct
SESSION_INFO_STRUCT g_info;
-#define PLAYBACK_NUM 5
+#define PLAYBACK_NUM 6
#define CAPTURE_NUM 3
typedef enum
@@ -136,7 +139,7 @@ static void dump_info ()
{
int i = 0;
- char *playback_device_str[] = { "SPEAKER ", "RECEIVER ", "HEADSET ", "BTSCO ", "BTA2DP " };
+ char *playback_device_str[] = { "SPEAKER ", "RECEIVER ", "HEADSET ", "BTSCO ", "BTA2DP ", "DOCK " };
char *capture_device_str[] = { "MAINMIC ", "HEADSET ", "BTMIC " };
static char tmp_str[128];
@@ -508,6 +511,8 @@ static int __set_sound_path_for_current_active ()
out = AVSYS_AUDIO_PATH_EX_BTHEADSET;
} else if (IS_ACTIVE(MM_SOUND_DEVICE_OUT_BT_A2DP)) {
out = AVSYS_AUDIO_PATH_EX_A2DP;
+ } else if (IS_ACTIVE(MM_SOUND_DEVICE_OUT_DOCK)) {
+ out = AVSYS_AUDIO_PATH_EX_DOCK;
}
/* GAIN */
@@ -599,6 +604,9 @@ static void _select_playback_active_device ()
if (IS_AVAILABLE(MM_SOUND_DEVICE_OUT_BT_A2DP)) {
debug_log ("BT A2DP available, set as active!!\n");
SET_ACTIVE(MM_SOUND_DEVICE_OUT_BT_A2DP);
+ } else if (IS_AVAILABLE(MM_SOUND_DEVICE_OUT_DOCK)) {
+ debug_log ("DOCK available, set as active!!\n");
+ SET_ACTIVE(MM_SOUND_DEVICE_OUT_DOCK);
} else if (IS_AVAILABLE(MM_SOUND_DEVICE_OUT_WIRED_ACCESSORY)) {
debug_log ("WIRED available, set as active!!\n");
SET_ACTIVE(MM_SOUND_DEVICE_OUT_WIRED_ACCESSORY);
@@ -826,6 +834,75 @@ static void handle_headset_off ()
dump_info ();
}
+void _sound_finished_cb (void *data)
+{
+ debug_log ("sound play finished!!!\n");
+ *(bool*)data = true;
+}
+
+static void _play_dock_sound_sync(int is_on)
+{
+ int handle;
+ bool is_play_finished = false;
+
+ debug_log ("start to play dock sound [%d]\n", is_on);
+ mm_sound_play_loud_solo_sound((is_on? SOUND_DOCK_ON : SOUND_DOCK_OFF), VOLUME_TYPE_FIXED, _sound_finished_cb, &is_play_finished, &handle);
+ /* FIXME : need to enhance waiting method */
+ debug_log ("waiting for dock sound finish\n");
+ while (!is_play_finished) {
+ usleep (10000); // 10 ms
+ }
+ debug_log ("dock sound finished!!!\n");
+}
+
+static void handle_dock_on ()
+{
+ /* ToDo : alarm/notification session ???? */
+ if (IS_COMMUNICATION_SESSION()) {
+ debug_log ("Current session is VOICECALL, no auto-activation!!!\n");
+ return;
+ }
+
+ debug_log ("Activate DOCK device\n");
+ SET_PLAYBACK_ONLY_ACTIVE(MM_SOUND_DEVICE_OUT_DOCK);
+
+ /* Enforced audio */
+ _play_dock_sound_sync(true);
+
+ /* Do set path and notify result */
+ _set_path_with_notification(DO_NOTI);
+
+ dump_info ();
+}
+
+static void handle_dock_off ()
+{
+ if (!IS_ACTIVE(MM_SOUND_DEVICE_OUT_DOCK)) {
+ debug_msg("MM_SOUND_DEVICE_OUT_WIRED_ACCESSORY was not active. nothing to do here.");
+ return;
+ }
+
+ /* if DOCK was active, then do asm pause */
+ debug_msg("Do pause here");
+ _asm_pause_process (g_info.asm_handle);
+
+ /* Enforced audio */
+ _play_dock_sound_sync(false);
+
+ /* set DOCK device to none */
+ debug_msg("Deactivate DOCK device\n");
+ UNSET_ACTIVE(MM_SOUND_DEVICE_OUT_DOCK);
+
+ /* activate current available device based on priority */
+ _select_playback_active_device();
+
+ /* Do set path and notify result */
+ _set_path_with_notification(DO_NOTI);
+
+ dump_info ();
+}
+
+
/* ------------------------- EXTERNAL FUNCTIONS ------------------------------------*/
/* DEVICE : Called by mgr_pulse for updating current default_sink_name */
int MMSoundMgrSessionSetDefaultSink (char *default_sink_name)
@@ -955,6 +1032,30 @@ int MMSoundMgrSessionSetDeviceAvailable (device_type_t device, int available, in
break;
case DEVICE_DOCK:
+ if (available) {
+ if (!IS_AVAILABLE(MM_SOUND_DEVICE_OUT_DOCK)) {
+ SET_AVAILABLE(MM_SOUND_DEVICE_OUT_DOCK);
+ _mm_sound_mgr_device_available_device_callback(
+ MM_SOUND_DEVICE_IN_NONE,
+ MM_SOUND_DEVICE_OUT_DOCK,
+ AVAILABLE);
+ handle_dock_on();
+ } else {
+ debug_log ("Already device [%d] is available...\n", device);
+ }
+ } else {
+ if (IS_AVAILABLE(MM_SOUND_DEVICE_OUT_DOCK)) {
+ UNSET_AVAILABLE(MM_SOUND_DEVICE_OUT_DOCK);
+ _mm_sound_mgr_device_available_device_callback(
+ MM_SOUND_DEVICE_IN_NONE,
+ MM_SOUND_DEVICE_OUT_DOCK,
+ NOT_AVAILABLE);
+
+ handle_dock_off();
+ } else {
+ debug_log ("Already device [%d] is unavailable...\n", device);
+ }
+ }
break;
}
diff --git a/server/mm_sound_server.c b/server/mm_sound_server.c
index d569227..6ec5025 100644
--- a/server/mm_sound_server.c
+++ b/server/mm_sound_server.c
@@ -40,6 +40,7 @@
#include "include/mm_sound_mgr_asm.h"
#include "include/mm_sound_mgr_session.h"
#include "include/mm_sound_mgr_headset.h"
+#include "include/mm_sound_mgr_dock.h"
#include "include/mm_sound_recovery.h"
#include "include/mm_sound_utils.h"
#include "include/mm_sound_common.h"
@@ -212,6 +213,7 @@ int main(int argc, char **argv)
wait_for_asm_ready();
_mm_sound_mgr_device_init();
MMSoundMgrHeadsetInit();
+ MMSoundMgrDockInit();
MMSoundMgrSessionInit();
}
@@ -235,6 +237,7 @@ int main(int argc, char **argv)
MMSoundMgrRunFini();
MMSoundThreadPoolFini();
+ MMSoundMgrDockFini();
MMSoundMgrHeadsetFini();
MMSoundMgrSessionFini();
_mm_sound_mgr_device_fini();