+
/*
* libmm-sound
*
#include <stdio.h>
#include <string.h>
#include <pthread.h>
+#include <unistd.h>
+#include <errno.h>
-#include <mm_source.h>
#include <mm_error.h>
#include <mm_types.h>
#include <mm_debug.h>
#include <mm_ipc.h>
+#include <mm_session.h>
+
+#include <glib.h>
#include "include/mm_sound_mgr_common.h"
#include "include/mm_sound_mgr_codec.h"
+#include "include/mm_sound_mgr_ipc.h"
#include "include/mm_sound_plugin_codec.h"
#include "include/mm_sound_thread_pool.h"
-#include "include/mm_sound_mgr_asm.h"
-
+#include "../include/mm_sound_common.h"
+#include "../include/mm_sound_focus.h"
-
-#define _ENABLE_KEYTONE /* Temporal test code */
+#define SHUTDOWN_TIMEOUT_SEC 10
+#define STATUS_IDLE 0
+#define STATUS_SOUND 3
+#define SOUND_SLOT_START 0
+#define FOCUS_INTEGRATION
typedef struct {
- int (*callback)(int, void *, void *); /* msg_type(pid) client callback & client data info */
+ int (*callback)(int, void *, void *, int); /* msg_type(pid) client callback & client data info */
void *param;
int pid;
void *msgcallback;
int pluginid;
int status;
int session_type;
- int session_handle;
+ int session_options;
+#ifdef FOCUS_INTEGRATION
+ int focus_handle;
+ int focus_wcb_id;
+ unsigned int subs_id;
+ mm_sound_focus_type_e current_focus_type;
+#endif
+ bool stop_by_user;
+
+ bool enable_session;
} __mmsound_mgr_codec_handle_t;
static MMSoundPluginType *g_codec_plugins = NULL;
static __mmsound_mgr_codec_handle_t g_slots[MANAGER_HANDLE_MAX];
static mmsound_codec_interface_t g_plugins[MM_SOUND_SUPPORTED_CODEC_NUM];
static pthread_mutex_t g_slot_mutex;
+GSourceFunc g_shutdown_cb;
+guint g_timer_id = 0;
+
+#define SLOT_LOCK() do { pthread_mutex_lock(&g_slot_mutex); /* debug_msg("After Slot_mutex LOCK\n"); */ } while (0)
+#define SLOT_UNLOCK() do { pthread_mutex_unlock(&g_slot_mutex); /* debug_msg("After Slot_mutex UNLOCK\n"); */ } while (0)
-static int _MMSoundMgrCodecStopCallback(int param);
-static int _MMSoundMgrCodecFindKeytoneSlot(int *slotid);
-static int _MMSoundMgrCodecGetEmptySlot(int *slotid);
-static int _MMSoundMgrCodecFindLocaleSlot(int *slotid);
static int _MMSoundMgrCodecRegisterInterface(MMSoundPluginType *plugin);
+static int _MMSoundMgrCodecStopCallback(int param);
-#define STATUS_IDLE 0
-#define STATUS_KEYTONE 1
-#define STATUS_LOCALE 2
-#define STATUS_SOUND 3
-#define SOUND_SLOT_START 0
+#ifdef FOCUS_INTEGRATION
+static void _handle_focus_event(int slotid, mm_sound_focus_type_e focus_type, mm_sound_focus_state_e focus_state, bool is_watch)
+{
+ int result = MM_ERROR_NONE;
+ if (g_slots[slotid].session_options & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
+ debug_warning("session option is UNINTERRUPTIBLE, nothing to do with focus");
+ return;
+ }
-ASM_cb_result_t
-sound_codec_asm_callback(int handle, ASM_event_sources_t event_src, ASM_sound_commands_t command, unsigned int sound_status, void* cb_data)
+ if (focus_state == FOCUS_IS_RELEASED) {
+ if (!is_watch)
+ g_slots[slotid].current_focus_type = FOCUS_FOR_BOTH & (~focus_type);
+ debug_warning("focus is released -> stop playing");
+
+ result = MMSoundMgrCodecStop(slotid);
+ if (result != MM_ERROR_NONE)
+ debug_error("result error 0x%X", result);
+ }
+}
+
+static void _sound_codec_focus_callback(int id, mm_sound_focus_type_e focus_type, mm_sound_focus_state_e focus_state,
+ const char *reason_for_change, int option, const char *ext_info, void *user_data)
{
- int slotid = (int)cb_data;
- ASM_cb_result_t cb_res = ASM_CB_RES_NONE;
+ debug_warning("focus callback called -> focus_state(%d), reason_for_change(%s)",
+ focus_state, reason_for_change ? reason_for_change : "N/A");
- debug_log("Got audio session callback msg for session_handle %d\n", handle);
+ _handle_focus_event((int)user_data, focus_type, focus_state, false);
+}
- switch(command)
- {
- case ASM_COMMAND_STOP:
- case ASM_COMMAND_PAUSE:
- debug_log("Got msg from asm to Stop or Pause %d\n", command);
- MMSoundMgrCodecStop(slotid);
- cb_res = ASM_CB_RES_STOP;
- break;
- case ASM_COMMAND_RESUME:
- case ASM_COMMAND_PLAY:
- debug_log("Got msg from asm to Play or Resume %d\n", command);
- cb_res = ASM_CB_RES_NONE;;
- default:
- break;
- }
- return cb_res;
+static void _sound_codec_focus_watch_callback(int id, mm_sound_focus_type_e focus_type, mm_sound_focus_state_e focus_state,
+ const char *reason_for_change, const char *ext_info, void *user_data)
+{
+ debug_warning("focus watch callback called -> focus_state(%d), reason_for_change(%s)",
+ focus_state, reason_for_change ? reason_for_change : "N/A");
+
+ _handle_focus_event((int)user_data, focus_type, focus_state, true);
+}
+
+static void _sound_codec_device_connected_callback(MMSoundDevice_t device, bool is_connected, void *user_data)
+{
+ int slotid = (int)user_data;
+ int result = MM_ERROR_NONE;
+ mm_sound_device_type_e type;
+
+ debug_warning ("device_connected_callback called : handle[%p], connected[%d], slotid[%d]", device, is_connected, slotid);
+
+ if (mm_sound_get_device_type (device, &type) != MM_ERROR_NONE) {
+ debug_error("getting device type failed");
+ return;
+ }
+
+ switch (type) {
+ case MM_SOUND_DEVICE_TYPE_AUDIOJACK:
+ case MM_SOUND_DEVICE_TYPE_BLUETOOTH:
+ case MM_SOUND_DEVICE_TYPE_HDMI:
+ case MM_SOUND_DEVICE_TYPE_MIRRORING:
+ case MM_SOUND_DEVICE_TYPE_USB_AUDIO:
+ if (!is_connected) {
+ debug_warning("sound device unplugged");
+ result = MMSoundMgrCodecStop(slotid);
+ if (result != MM_ERROR_NONE)
+ debug_error("MMSoundMgrCodecStop error %d\n", result);
+
+ result = mm_sound_remove_device_connected_callback(g_slots[slotid].subs_id);
+ if (result != MM_ERROR_NONE)
+ debug_error("mm_sound_remove_device_connected_callback error %d\n", result);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+#endif
+
+/* FIXME : critical section for g_timer_id? */
+static void _mm_sound_mgr_codec_shutdown_timer_start()
+{
+ if (g_timer_id > 0) {
+ debug_error("Already active timer [%d] exists", g_timer_id);
+ return;
+ }
+
+ if (g_shutdown_cb) {
+ g_timer_id = g_timeout_add_seconds(SHUTDOWN_TIMEOUT_SEC, g_shutdown_cb, NULL);
+ debug_error("TIMER : new timer [%d]", g_timer_id);
+ } else {
+ debug_warning("No Timer started due to invalid shutdown callback");
+ }
}
+static void _mm_sound_mgr_codec_shutdown_timer_stop()
+{
+ if (g_timer_id > 0) {
+ debug_error("TIMER : remove timer id [%d]", g_timer_id);
+ g_source_remove(g_timer_id);
+ g_timer_id = 0;
+ } else {
+ debug_log("No Timer to stop...");
+ }
+}
-int MMSoundMgrCodecInit(const char *targetdir)
+static int _mm_sound_mgr_codec_slot_get_empty(int *slot)
+{
+ int slotid = 0;
+ int err = MM_ERROR_NONE;
+
+ SLOT_LOCK();
+
+ for (slotid = SOUND_SLOT_START; slotid < MANAGER_HANDLE_MAX ; slotid++) {
+ if (g_slots[slotid].status == STATUS_IDLE) {
+ g_slots[slotid].status = STATUS_SOUND;
+ break;
+ }
+ }
+
+ if (slotid < MANAGER_HANDLE_MAX) {
+ debug_msg("New handle allocated (codec slot ID : [%d])\n", slotid);
+ *slot = slotid;
+
+ _mm_sound_mgr_codec_shutdown_timer_stop();
+
+ } else {
+ debug_warning("Handle is full handle : [%d]\n", slotid);
+ *slot = -1;
+ /* Temporal code for reset */
+ while (slotid--) {
+ g_slots[slotid].status = STATUS_IDLE;
+ }
+ err = MM_ERROR_SOUND_INTERNAL;
+ }
+
+ SLOT_UNLOCK();
+
+ return err;
+}
+
+static gboolean _mm_sound_mgr_codec_slot_is_empty()
+{
+ int slotid = 0;
+
+ for (slotid = SOUND_SLOT_START; slotid < MANAGER_HANDLE_MAX ; slotid++) {
+ if (g_slots[slotid].status == STATUS_SOUND)
+ break;
+ }
+
+ return (slotid == MANAGER_HANDLE_MAX) ? TRUE : FALSE;
+}
+
+static void _mm_sound_mgr_codec_slot_clear(int slotid)
+{
+ memset(&g_slots[slotid], 0, sizeof(__mmsound_mgr_codec_handle_t));
+ g_slots[slotid].status = STATUS_IDLE;
+
+ debug_error("SlotID [%d] cleared", slotid);
+}
+
+int MMSoundMgrCodecInit(const char *targetdir, GSourceFunc _shutdown_cb)
{
int loop = 0;
- int count = 0;
+ int slotid = 0;
- debug_enter("\n");
+ debug_enter();
- memset (g_slots, 0, sizeof(g_slots));
+ memset(g_slots, 0, sizeof(g_slots));
- if(pthread_mutex_init(&g_slot_mutex, NULL)) {
- debug_error("pthread_mutex_init failed [%s][%d]\n", __func__, __LINE__);
+ if (pthread_mutex_init(&g_slot_mutex, NULL)) {
+ debug_error("pthread_mutex_init failed\n");
return MM_ERROR_SOUND_INTERNAL;
}
- for (count = 0; count < MANAGER_HANDLE_MAX; count++) {
- g_slots[count].status = STATUS_IDLE;
- g_slots[count].plughandle = -1;
- }
+ for (slotid = 0; slotid < MANAGER_HANDLE_MAX; slotid++)
+ _mm_sound_mgr_codec_slot_clear(slotid);
if (g_codec_plugins) {
debug_warning("Please Check Init twice\n");
}
MMSoundPluginScan(targetdir, MM_SOUND_PLUGIN_TYPE_CODEC, &g_codec_plugins);
-
- while (g_codec_plugins[loop].type != MM_SOUND_PLUGIN_TYPE_NONE) {
- _MMSoundMgrCodecRegisterInterface(&g_codec_plugins[loop++]);
+ if (g_codec_plugins) {
+ while (g_codec_plugins[loop].type != MM_SOUND_PLUGIN_TYPE_NONE) {
+ _MMSoundMgrCodecRegisterInterface(&g_codec_plugins[loop++]);
+ }
}
- debug_leave("\n");
+ if (_shutdown_cb)
+ g_shutdown_cb = _shutdown_cb;
+ else
+ debug_warning("shutdown callback is NULL");
+
+ debug_leave();
return MM_ERROR_NONE;
}
int MMSoundMgrCodecFini(void)
{
- debug_enter("\n");
+ debug_enter();
memset(g_plugins, 0, sizeof(mmsound_codec_interface_t) * MM_SOUND_SUPPORTED_CODEC_NUM);
MMSoundPluginRelease(g_codec_plugins);
g_codec_plugins = NULL;
pthread_mutex_destroy(&g_slot_mutex);
- debug_leave("\n");
+ debug_leave();
return MM_ERROR_NONE;
}
+static int _MMSoundMgrCodecFindCodecPluginID(enum MMSoundSupportedCodec codec_to_find)
+{
+ int plugin_id = 0;
+ int *codec_type;
+
+ for (plugin_id = 0; plugin_id < MM_SOUND_SUPPORTED_CODEC_NUM; plugin_id++) {
+ if (g_plugins[plugin_id].GetSupportTypes) {
+ codec_type = g_plugins[plugin_id].GetSupportTypes();
+ if (codec_type[0] == codec_to_find)
+ return plugin_id;
+ }
+ }
+
+ return -1;
+}
int MMSoundMgrCodecPlay(int *slotid, const mmsound_mgr_codec_param_t *param)
{
- int count = 0;
+ int plugin_id = 0;
mmsound_codec_info_t info;
mmsound_codec_param_t codec_param;
int err = MM_ERROR_NONE;
- int errorcode = 0;
- int need_asm_unregister = 0;
- debug_enter("\n");
-
- debug_msg("DTMF : [%d]\n",param->tone);
- debug_msg("Repeat : [%d]\n",param->repeat_count);
- debug_msg("Volume : [%f]\n",param->volume);
+#ifdef FOCUS_INTEGRATION
+ int need_focus_unregister = 0;
+#endif
- for (count = 0; g_plugins[count].GetSupportTypes; count++) {
- /* Find codec */
- if (g_plugins[count].Parse(param->source, &info) == MM_ERROR_NONE)
- break;
+#ifdef DEBUG_DETAIL
+ debug_enter();
+#endif
+ plugin_id = _MMSoundMgrCodecFindCodecPluginID(MM_SOUND_SUPPORTED_CODEC_WAVE);
+ if (plugin_id == -1) {
+ debug_error("Could not find proper codec plugin!!!");
+ err = MM_ERROR_SOUND_INTERNAL;
+ goto cleanup;
}
- debug_msg("Find plugin codec ::: [%d]\n", count); /*The count num means codec type WAV, MP3 */
-
- if (g_plugins[count].GetSupportTypes == NULL) { /* Codec not found */
- debug_error("unsupported file type %d\n", count);
- err = MM_ERROR_SOUND_UNSUPPORTED_MEDIA_TYPE;
+ err = g_plugins[plugin_id].Parse(param->pfilename, &info);
+ if (err != MM_ERROR_NONE) {
+ debug_error("Could not parse file [%s] by plugin[%d]\n", param->pfilename, plugin_id);
goto cleanup;
}
- /* KeyTone */
- if (param->keytone == 1) {
- /* Find keytone slot */
- err = _MMSoundMgrCodecFindKeytoneSlot(slotid);
- /* Not First connect */
- if (err == MM_ERROR_NONE) {
- if(g_slots[*slotid].status != STATUS_IDLE) {
- MMSoundMgrCodecStop(*slotid);
- }
- debug_msg("Key tone : Stop to Play !!!\n");
- }
- codec_param.keytone = param->keytone;
- } else if (param->keytone == 2) {
- /* Find keytone slot */
- err = _MMSoundMgrCodecFindLocaleSlot(slotid);
- /* Not First connect */
- if (err == MM_ERROR_NONE) {
- if(g_slots[*slotid].status != STATUS_IDLE) {
- MMSoundMgrCodecStop(*slotid);
- }
- debug_msg("Key tone : Stop to Play !!!\n");
- }
- codec_param.keytone = param->keytone;
- } else {
- debug_msg("Get New handle\n");
- codec_param.keytone = 0;
- }
+ debug_msg("DTMF[%d] Repeat[%d] Volume[%f] plugin_codec[%d]\n", param->tone, param->repeat_count, param->volume, plugin_id);
- err = _MMSoundMgrCodecGetEmptySlot(slotid);
- if (err != MM_ERROR_NONE) {
+#ifdef DEBUG_DETAIL
+ debug_msg("Get New handle\n");
+#endif
+
+ err = _mm_sound_mgr_codec_slot_get_empty(slotid);
+ if (err != MM_ERROR_NONE || *slotid < 0) {
debug_error("Empty g_slot is not found\n");
goto cleanup;
}
codec_param.volume_config = param->volume_config;
codec_param.repeat_count = param->repeat_count;
codec_param.volume = param->volume;
- codec_param.source = param->source;
- codec_param.priority = param->priority;
+ codec_param.pfilename = param->pfilename;
codec_param.stop_cb = _MMSoundMgrCodecStopCallback;
codec_param.param = *slotid;
codec_param.pid = (int)param->param;
- codec_param.handle_route = param->handle_route;
-
- pthread_mutex_lock(&g_slot_mutex);
- debug_msg("After Slot_mutex LOCK\n");
-
- /* In case of KEYTONE */
- if (param->keytone == 1)
- g_slots[*slotid].status = STATUS_KEYTONE;
-
- /* In case of LOCALE */
- if (param->keytone == 2) /* KeyTone */
- g_slots[*slotid].status = STATUS_LOCALE;
+ codec_param.stream_index = param->stream_index;
+ MMSOUND_STRNCPY(codec_param.stream_type, param->stream_type, MM_SOUND_STREAM_TYPE_LEN);
+ SLOT_LOCK();
+#ifdef FOCUS_INTEGRATION
/*
- * Register ASM here
+ * Register FOCUS here
*/
- if(param->session_type != ASM_EVENT_CALL && param->session_type != ASM_EVENT_VIDEOCALL) {
-#ifdef MURPHY
- if(!ASM_register_sound((int)param->param, ¶m->session_handle, param->session_type, ASM_STATE_PLAYING,
- sound_codec_asm_callback, (void*)*slotid, ASM_RESOURCE_NONE, &errorcode)) {
-#else
- if(!ASM_register_sound_ex((int)param->param, ¶m->session_handle, param->session_type, ASM_STATE_PLAYING,
- sound_codec_asm_callback, (void*)*slotid, ASM_RESOURCE_NONE, &errorcode, __asm_process_message)) {
-#endif
- debug_critical("ASM_register_sound() failed %d\n", errorcode);
- pthread_mutex_unlock(&g_slot_mutex);
+ if (param->session_type != MM_SESSION_TYPE_CALL &&
+ param->session_type != MM_SESSION_TYPE_VIDEOCALL &&
+ param->session_type != MM_SESSION_TYPE_VOIP &&
+ param->session_type != MM_SESSION_TYPE_VOICE_RECOGNITION &&
+ param->enable_session) {
+
+ unsigned int subs_id = 0;
+
+ err = mm_sound_add_device_connected_callback(MM_SOUND_DEVICE_STATE_ACTIVATED_FLAG,
+ (mm_sound_device_connected_cb)_sound_codec_device_connected_callback,
+ (void*) *slotid, &subs_id);
+ if (err) {
+ debug_error("mm_sound_add_device_connected_callback failed [0x%x]", err);
+ SLOT_UNLOCK();
return MM_ERROR_POLICY_INTERNAL;
}
+ g_slots[*slotid].subs_id = subs_id;
+
+ if ((param->session_options & MM_SESSION_OPTION_PAUSE_OTHERS) ||
+ param->session_type == MM_SESSION_TYPE_ALARM ||
+ param->session_type == MM_SESSION_TYPE_NOTIFY ||
+ param->session_type == MM_SESSION_TYPE_EMERGENCY) {
+ debug_warning("session option is PAUSE_OTHERS -> acquire focus");
+ err = mm_sound_focus_get_id((int *)(¶m->focus_handle));
+ err = mm_sound_register_focus_for_session(param->focus_handle, (int)param->param, "media", _sound_codec_focus_callback, (void*)*slotid);
+ if (err) {
+ debug_error("mm_sound_register_focus_for_session failed [0x%x]", err);
+ SLOT_UNLOCK();
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ err = mm_sound_acquire_focus(param->focus_handle, FOCUS_FOR_BOTH, NULL);
+ if (err) {
+ debug_error("mm_sound_acquire_focus failed [0x%x]", err);
+ err = mm_sound_unregister_focus(param->focus_handle);
+ SLOT_UNLOCK();
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ g_slots[*slotid].current_focus_type = FOCUS_FOR_BOTH;
+ } else if (param->session_options & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
+ /* do nothing */
+ debug_warning("session option is UNINTERRUPTIBLE, nothing to do with focus");
+ } else {
+ debug_warning("need to set focus watch callback");
+ err = mm_sound_set_focus_watch_callback_for_session((int)param->param, FOCUS_FOR_BOTH, _sound_codec_focus_watch_callback,
+ (void*)*slotid, (int *)(¶m->focus_wcb_id));
+ if (err) {
+ debug_error("mm_sound_set_focus_watch_callback_for_session failed [0x%x]", err);
+ SLOT_UNLOCK();
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ }
}
//
+#endif
/* Codec id WAV or MP3 */
- g_slots[*slotid].pluginid = count;
- g_slots[*slotid].callback = param->callback;
- g_slots[*slotid].msgcallback = param->msgcallback;
- g_slots[*slotid].msgdata = param->msgdata;
+ g_slots[*slotid].pluginid = plugin_id;
g_slots[*slotid].param = param->param; /* This arg is used callback data */
g_slots[*slotid].session_type = param->session_type;
- g_slots[*slotid].session_handle = param->session_handle;
-
- debug_msg("Using Slotid : [%d] Slot Status : [%d]\n", *slotid, g_slots[*slotid].status);
+ g_slots[*slotid].session_options = param->session_options;
+#ifdef FOCUS_INTEGRATION
+ g_slots[*slotid].focus_handle = param->focus_handle;
+ g_slots[*slotid].focus_wcb_id = param->focus_wcb_id;
+#endif
+ g_slots[*slotid].enable_session = true;
+ g_slots[*slotid].pid = (int)param->param;
+ debug_msg("Using Slotid : [%d] Slot Status : [%d]\n", *slotid, g_slots[*slotid].status);
err = g_plugins[g_slots[*slotid].pluginid].Create(&codec_param, &info, &(g_slots[*slotid].plughandle));
debug_msg("Created audio handle : [%d]\n", g_slots[*slotid].plughandle);
if (err != MM_ERROR_NONE) {
debug_error("Plugin create fail : 0x%08X\n", err);
g_slots[*slotid].status = STATUS_IDLE;
- pthread_mutex_unlock(&g_slot_mutex);
- debug_warning("After Slot_mutex UNLOCK\n");
- need_asm_unregister = 1;
+ SLOT_UNLOCK();
+#ifdef FOCUS_INTEGRATION
+ if (param->focus_handle) {
+ need_focus_unregister = 1;
+ }
+#endif
goto cleanup;
}
if (err != MM_ERROR_NONE) {
debug_error("Fail to play : 0x%08X\n", err);
g_plugins[g_slots[*slotid].pluginid].Destroy(g_slots[*slotid].plughandle);
- need_asm_unregister = 1;
+#ifdef FOCUS_INTEGRATION
+ if (param->focus_handle) {
+ need_focus_unregister = 1;
+ }
+#endif
}
- pthread_mutex_unlock(&g_slot_mutex);
- debug_msg("After Slot_mutex UNLOCK\n");
+ SLOT_UNLOCK();
cleanup:
- if(param->session_type != ASM_EVENT_CALL && param->session_type != ASM_EVENT_VIDEOCALL && need_asm_unregister == 1) {
-#ifdef MURPHY
- if(!ASM_unregister_sound(param->session_handle, param->session_type, &errorcode)) {
-#else
- if(!ASM_unregister_sound_ex(param->session_handle, param->session_type, &errorcode,__asm_process_message)) {
-#endif
- debug_error("Unregister sound failed 0x%X\n", errorcode);
- return MM_ERROR_POLICY_INTERNAL;
+ if (_mm_sound_mgr_codec_slot_is_empty())
+ _mm_sound_mgr_codec_shutdown_timer_start();
+
+#ifdef FOCUS_INTEGRATION
+ if (param->session_type != MM_SESSION_TYPE_CALL &&
+ param->session_type != MM_SESSION_TYPE_VIDEOCALL &&
+ param->session_type != MM_SESSION_TYPE_VOIP &&
+ param->session_type != MM_SESSION_TYPE_VOICE_RECOGNITION &&
+ param->enable_session &&
+ need_focus_unregister == 1) {
+
+ if ((param->session_options & MM_SESSION_OPTION_PAUSE_OTHERS) ||
+ param->session_type == MM_SESSION_TYPE_ALARM ||
+ param->session_type == MM_SESSION_TYPE_NOTIFY ||
+ param->session_type == MM_SESSION_TYPE_EMERGENCY) {
+ err = mm_sound_release_focus(param->focus_handle, FOCUS_FOR_BOTH, NULL);
+ if (mm_sound_unregister_focus(param->focus_handle) || err) {
+ debug_error("focus cleaning up failed[0x%x]", err);
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ } else if (~(param->session_options & MM_SESSION_OPTION_PAUSE_OTHERS)) {
+ err = mm_sound_unset_focus_watch_callback(param->focus_wcb_id);
+ if (err) {
+ debug_error("focus watch cleaning up failed[0x%x]", err);
+ return MM_ERROR_POLICY_INTERNAL;
+ }
}
}
+#endif
+
+
+#ifdef DEBUG_DETAIL
+ debug_leave();
+#endif
+
+ return err;
+}
+
+int MMSoundMgrCodecPlayWithStreamInfo(int *slotid, const mmsound_mgr_codec_param_t *param)
+{
+ int plugin_id = 0;
+ mmsound_codec_info_t info;
+ mmsound_codec_param_t codec_param;
+ int err = MM_ERROR_NONE;
+
+#ifdef DEBUG_DETAIL
+ debug_enter();
+#endif
+ plugin_id = _MMSoundMgrCodecFindCodecPluginID(MM_SOUND_SUPPORTED_CODEC_WAVE);
+ if (plugin_id == -1) {
+ debug_error("Could not find proper codec plugin!!!");
+ err = MM_ERROR_SOUND_INTERNAL;
+ goto cleanup;
+ }
+
+ err = g_plugins[plugin_id].Parse(param->pfilename, &info);
+ if (err != MM_ERROR_NONE) {
+ debug_error("Could not parse file [%s] by plugin[%d]\n", param->pfilename, plugin_id);
+ goto cleanup;
+ }
+
+ err = _mm_sound_mgr_codec_slot_get_empty(slotid);
+ if (err != MM_ERROR_NONE || *slotid < 0) {
+ debug_error("Empty g_slot is not found\n");
+ goto cleanup;
+ }
+
+ codec_param.volume_config = -1; //setting volume config to -1 since using stream info instead of volume type
+ codec_param.repeat_count = param->repeat_count;
+ codec_param.volume = param->volume;
+ codec_param.pfilename = param->pfilename;
+ codec_param.stop_cb = _MMSoundMgrCodecStopCallback;
+ codec_param.param = *slotid;
+ codec_param.pid = (int)param->param;
+ codec_param.stream_index = param->stream_index;
+ MMSOUND_STRNCPY(codec_param.stream_type, param->stream_type, MM_SOUND_STREAM_TYPE_LEN);
+ SLOT_LOCK();
+
+ /* Codec id WAV or MP3 */
+ g_slots[*slotid].pluginid = plugin_id;
+ g_slots[*slotid].param = param->param; /* This arg is used callback data */
+
+ debug_msg("Using Slotid : [%d] Slot Status : [%d]\n", *slotid, g_slots[*slotid].status);
+
+ err = g_plugins[g_slots[*slotid].pluginid].Create(&codec_param, &info, &(g_slots[*slotid].plughandle));
+ debug_msg("Created audio handle : [%p]\n", g_slots[*slotid].plughandle);
+ if (err != MM_ERROR_NONE) {
+ debug_error("Plugin create fail : 0x%08X\n", err);
+ g_slots[*slotid].status = STATUS_IDLE;
+ SLOT_UNLOCK();
+ goto cleanup;
+ }
+
+ err = g_plugins[g_slots[*slotid].pluginid].Play(g_slots[*slotid].plughandle);
+ if (err != MM_ERROR_NONE) {
+ debug_error("Fail to play : 0x%08X\n", err);
+ g_plugins[g_slots[*slotid].pluginid].Destroy(g_slots[*slotid].plughandle);
+ }
+
+ SLOT_UNLOCK();
+
+cleanup:
+ if (_mm_sound_mgr_codec_slot_is_empty())
+ _mm_sound_mgr_codec_shutdown_timer_start();
- debug_leave("\n");
+#ifdef DEBUG_DETAIL
+ debug_leave();
+#endif
return err;
+
}
#define DTMF_PLUGIN_COUNT 2
int MMSoundMgrCodecPlayDtmf(int *slotid, const mmsound_mgr_codec_param_t *param)
{
- int count = 0;
+ int plugin_id = 0;
int *codec_type;
mmsound_codec_info_t info;
mmsound_codec_param_t codec_param;
int err = MM_ERROR_NONE;
-
- debug_enter("\n");
-
- debug_msg("DTMF : [%d]\n",param->tone);
- debug_msg("Repeat : [%d]\n",param->repeat_count);
- debug_msg("Volume : [%f]\n",param->volume);
-
- for (count = 0; g_plugins[count].GetSupportTypes; count++) {
+#ifdef FOCUS_INTEGRATION
+ int need_focus_unregister = 0;
+#endif
+
+#ifdef DEBUG_DETAIL
+ debug_enter();
+#endif
+
+ for (plugin_id = 0; g_plugins[plugin_id].GetSupportTypes; plugin_id++) {
/* Find codec */
- codec_type = g_plugins[count].GetSupportTypes();
- if(codec_type && (MM_SOUND_SUPPORTED_CODEC_DTMF == codec_type[0]))
+ codec_type = g_plugins[plugin_id].GetSupportTypes();
+ if (codec_type && (MM_SOUND_SUPPORTED_CODEC_DTMF == codec_type[0]))
break;
}
-
- debug_msg("Find plugin codec ::: [%d]\n", count); /*The count num means codec type DTMF */
- if (g_plugins[count].GetSupportTypes == NULL) { /* Codec not found */
- debug_error("unsupported file type %d\n", count);
- printf("unsupported file type %d\n", count);
+ /*The count num means codec type DTMF */
+ debug_msg("DTMF[%d] Repeat[%d] Volume[%f] plugin_codec[%d]\n", param->tone, param->repeat_count, param->volume, plugin_id);
+
+ if (g_plugins[plugin_id].GetSupportTypes == NULL) { /* Codec not found */
+ debug_error("unsupported file type %d\n", plugin_id);
+ printf("unsupported file type %d\n", plugin_id);
err = MM_ERROR_SOUND_UNSUPPORTED_MEDIA_TYPE;
goto cleanup;
}
+#ifdef DEBUG_DETAIL
debug_msg("Get New handle\n");
- codec_param.keytone = 0;
+#endif
- err = _MMSoundMgrCodecGetEmptySlot(slotid);
- if(err != MM_ERROR_NONE)
- {
+ err = _mm_sound_mgr_codec_slot_get_empty(slotid);
+ if (err != MM_ERROR_NONE || *slotid < 0) {
debug_error("Empty g_slot is not found\n");
goto cleanup;
}
codec_param.tone = param->tone;
- codec_param.priority = 0;
codec_param.volume_config = param->volume_config;
codec_param.repeat_count = param->repeat_count;
codec_param.volume = param->volume;
codec_param.stop_cb = _MMSoundMgrCodecStopCallback;
codec_param.param = *slotid;
codec_param.pid = (int)param->param;
+ codec_param.stream_index = param->stream_index;
+ MMSOUND_STRNCPY(codec_param.stream_type, param->stream_type, MM_SOUND_STREAM_TYPE_LEN);
+ SLOT_LOCK();
- pthread_mutex_lock(&g_slot_mutex);
- debug_msg("After Slot_mutex LOCK\n");
-
+#ifdef FOCUS_INTEGRATION
//
/*
- * Register ASM here
+ * Register FOCUS here
*/
- int errorcode = 0;
- int need_asm_unregister = 0;
-
- if(param->session_type != ASM_EVENT_CALL && param->session_type != ASM_EVENT_VIDEOCALL) {
-#ifdef MURPHY
- if(!ASM_register_sound((int)param->param, ¶m->session_handle, param->session_type, ASM_STATE_PLAYING,
- sound_codec_asm_callback, (void*)*slotid, ASM_RESOURCE_NONE, &errorcode)) {
-#else
- if(!ASM_register_sound_ex((int)param->param, ¶m->session_handle, param->session_type, ASM_STATE_PLAYING,
- sound_codec_asm_callback, (void*)*slotid, ASM_RESOURCE_NONE, &errorcode, __asm_process_message)) {
-#endif
- debug_critical("ASM_register_sound() failed %d\n", errorcode);
- pthread_mutex_unlock(&g_slot_mutex);
+
+ if (param->session_type != MM_SESSION_TYPE_CALL &&
+ param->session_type != MM_SESSION_TYPE_VIDEOCALL &&
+ param->session_type != MM_SESSION_TYPE_VOIP &&
+ param->session_type != MM_SESSION_TYPE_VOICE_RECOGNITION &&
+ param->enable_session) {
+
+ unsigned int subs_id = 0;
+
+ err = mm_sound_add_device_connected_callback(MM_SOUND_DEVICE_STATE_ACTIVATED_FLAG,
+ (mm_sound_device_connected_cb)_sound_codec_device_connected_callback,
+ (void*) *slotid, &subs_id);
+ if (err) {
+ debug_error("mm_sound_add_device_connected_callback failed [0x%x]", err);
+ SLOT_UNLOCK();
return MM_ERROR_POLICY_INTERNAL;
}
+ g_slots[*slotid].subs_id = subs_id;
+
+ if ((param->session_options & MM_SESSION_OPTION_PAUSE_OTHERS) ||
+ param->session_type == MM_SESSION_TYPE_ALARM ||
+ param->session_type == MM_SESSION_TYPE_NOTIFY ||
+ param->session_type == MM_SESSION_TYPE_EMERGENCY) {
+ debug_warning("session option is PAUSE_OTHERS -> acquire focus");
+ err = mm_sound_focus_get_id((int *)(¶m->focus_handle));
+ err = mm_sound_register_focus_for_session(param->focus_handle, (int)param->param, "media", _sound_codec_focus_callback, (void*)*slotid);
+ if (err) {
+ debug_error("mm_sound_register_focus failed [0x%x]", err);
+ SLOT_UNLOCK();
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ err = mm_sound_acquire_focus(param->focus_handle, FOCUS_FOR_BOTH, NULL);
+ if (err) {
+ debug_error("mm_sound_acquire_focus failed [0x%x]", err);
+ err = mm_sound_unregister_focus(param->focus_handle);
+ SLOT_UNLOCK();
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ g_slots[*slotid].current_focus_type = FOCUS_FOR_BOTH;
+ } else if (param->session_options & MM_SESSION_OPTION_UNINTERRUPTIBLE) {
+ /* do nothing */
+ debug_warning("session option is UNINTERRUPTIBLE, nothing to do with focus");
+ } else {
+ debug_warning("need to set focus watch callback");
+ err = mm_sound_set_focus_watch_callback_for_session((int)param->param, FOCUS_FOR_BOTH, _sound_codec_focus_watch_callback,
+ (void*)*slotid, (int *)(¶m->focus_wcb_id));
+ if (err) {
+ debug_error("mm_sound_set_focus_watch_callback failed [0x%x]", err);
+ SLOT_UNLOCK();
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ }
}
+#endif
- g_slots[*slotid].pluginid = count;
- g_slots[*slotid].callback = param->callback;
+ g_slots[*slotid].pluginid = plugin_id;
g_slots[*slotid].param = param->param; /* This arg is used callback data */
g_slots[*slotid].session_type = param->session_type;
- g_slots[*slotid].session_handle = param->session_handle;
-
+ g_slots[*slotid].session_options = param->session_options;
+#ifdef FOCUS_INTEGRATION
+ g_slots[*slotid].focus_handle= param->focus_handle;
+ g_slots[*slotid].focus_wcb_id= param->focus_wcb_id;
+#endif
+ g_slots[*slotid].enable_session = param->enable_session;
+ g_slots[*slotid].pid = (int)param->param;
+
+#ifdef DEBUG_DETAIL
debug_msg("Using Slotid : [%d] Slot Status : [%d]\n", *slotid, g_slots[*slotid].status);
+#endif
err = g_plugins[g_slots[*slotid].pluginid].Create(&codec_param, &info, &(g_slots[*slotid].plughandle));
debug_msg("Created audio handle : [%d]\n", g_slots[*slotid].plughandle);
if (err != MM_ERROR_NONE) {
debug_error("Plugin create fail : 0x%08X\n", err);
g_slots[*slotid].status = STATUS_IDLE;
- pthread_mutex_unlock(&g_slot_mutex);
- debug_warning("After Slot_mutex UNLOCK\n");
- need_asm_unregister = 1;
+ SLOT_UNLOCK();
+#ifdef FOCUS_INTEGRATION
+ need_focus_unregister = 1;
+#endif
goto cleanup;
}
if (err != MM_ERROR_NONE) {
debug_error("Fail to play : 0x%08X\n", err);
g_plugins[g_slots[*slotid].pluginid].Destroy(g_slots[*slotid].plughandle);
- need_asm_unregister = 1;
+#ifdef FOCUS_INTEGRATION
+ need_focus_unregister = 1;
+#endif
}
-
- pthread_mutex_unlock(&g_slot_mutex);
+ SLOT_UNLOCK();
debug_msg("Using Slotid : [%d] Slot Status : [%d]\n", *slotid, g_slots[*slotid].status);
- debug_msg("After Slot_mutex UNLOCK\n");
-cleanup:
- debug_leave("\n");
+cleanup:
+#ifdef FOCUS_INTEGRATION
+ if (param->session_type != MM_SESSION_TYPE_CALL &&
+ param->session_type != MM_SESSION_TYPE_VIDEOCALL &&
+ param->session_type != MM_SESSION_TYPE_VOIP &&
+ param->session_type != MM_SESSION_TYPE_VOICE_RECOGNITION &&
+ param->enable_session &&
+ need_focus_unregister == 1) {
+
+ if ((param->session_options & MM_SESSION_OPTION_PAUSE_OTHERS) ||
+ param->session_type == MM_SESSION_TYPE_ALARM ||
+ param->session_type == MM_SESSION_TYPE_NOTIFY ||
+ param->session_type == MM_SESSION_TYPE_EMERGENCY) {
+ err = mm_sound_release_focus(param->focus_handle, FOCUS_FOR_BOTH, NULL);
+ if (mm_sound_unregister_focus(param->focus_handle) || err) {
+ debug_error("focus cleaning up failed[0x%x]", err);
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ } else if (~(param->session_options & MM_SESSION_OPTION_PAUSE_OTHERS)) {
+ err = mm_sound_unset_focus_watch_callback(param->focus_wcb_id);
+ if (err) {
+ debug_error("focus watch cleaning up failed[0x%x]", err);
+ return MM_ERROR_POLICY_INTERNAL;
+ }
+ }
+ }
+#endif
+
+#ifdef DEBUG_DETAIL
+ debug_leave();
+#endif
return err;
}
+int MMSoundMgrCodecPlayDtmfWithStreamInfo(int *slotid, const mmsound_mgr_codec_param_t *param)
+{
+ int plugin_id = 0;
+ int *codec_type;
+ mmsound_codec_info_t info;
+ mmsound_codec_param_t codec_param;
+ int err = MM_ERROR_NONE;
+
+#ifdef DEBUG_DETAIL
+ debug_enter();
+#endif
+
+ for (plugin_id = 0; g_plugins[plugin_id].GetSupportTypes; plugin_id++) {
+ /* Find codec */
+ codec_type = g_plugins[plugin_id].GetSupportTypes();
+ if (codec_type && (MM_SOUND_SUPPORTED_CODEC_DTMF == codec_type[0]))
+ break;
+ }
+
+ /*The count num means codec type DTMF */
+ debug_msg("DTMF[%d] Repeat[%d] Volume[%f] plugin_codec[%d]\n", param->tone, param->repeat_count, param->volume, plugin_id);
+
+ if (g_plugins[plugin_id].GetSupportTypes == NULL) { /* Codec not found */
+ debug_error("unsupported file type %d\n", plugin_id);
+ printf("unsupported file type %d\n", plugin_id);
+ err = MM_ERROR_SOUND_UNSUPPORTED_MEDIA_TYPE;
+ goto cleanup;
+ }
+
+#ifdef DEBUG_DETAIL
+ debug_msg("Get New handle\n");
+#endif
+
+ err = _mm_sound_mgr_codec_slot_get_empty(slotid);
+ if (err != MM_ERROR_NONE || *slotid < 0)
+ {
+ debug_error("Empty g_slot is not found\n");
+ goto cleanup;
+ }
+
+ codec_param.tone = param->tone;
+ codec_param.repeat_count = param->repeat_count;
+ codec_param.volume = param->volume;
+ codec_param.stop_cb = _MMSoundMgrCodecStopCallback;
+ codec_param.param = *slotid;
+ codec_param.pid = (int)param->param;
+ codec_param.volume_config = -1; //setting volume config to -1 since using stream info instead of volume type
+ codec_param.stream_index = param->stream_index;
+ MMSOUND_STRNCPY(codec_param.stream_type, param->stream_type, MM_SOUND_STREAM_TYPE_LEN);
+ SLOT_LOCK();
+
+ g_slots[*slotid].pluginid = plugin_id;
+ g_slots[*slotid].param = param->param; /* This arg is used callback data */
+ g_slots[*slotid].enable_session = param->enable_session;
+
+#ifdef DEBUG_DETAIL
+ debug_msg("Using Slotid : [%d] Slot Status : [%d]\n", *slotid, g_slots[*slotid].status);
+#endif
+
+ err = g_plugins[g_slots[*slotid].pluginid].Create(&codec_param, &info, &(g_slots[*slotid].plughandle));
+ debug_msg("Created audio handle : [%d]\n", g_slots[*slotid].plughandle);
+ if (err != MM_ERROR_NONE) {
+ debug_error("Plugin create fail : 0x%08X\n", err);
+ g_slots[*slotid].status = STATUS_IDLE;
+ SLOT_UNLOCK();
+ goto cleanup;
+ }
+
+ err = g_plugins[g_slots[*slotid].pluginid].Play(g_slots[*slotid].plughandle);
+ if (err != MM_ERROR_NONE) {
+ debug_error("Fail to play : 0x%08X\n", err);
+ g_plugins[g_slots[*slotid].pluginid].Destroy(g_slots[*slotid].plughandle);
+ }
+
+ SLOT_UNLOCK();
+ debug_msg("Using Slotid : [%d] Slot Status : [%d]\n", *slotid, g_slots[*slotid].status);
+
+cleanup:
+#ifdef DEBUG_DETAIL
+ debug_leave();
+#endif
+
+ return err;
+
+}
int MMSoundMgrCodecStop(const int slotid)
{
return MM_ERROR_INVALID_ARGUMENT;
}
- pthread_mutex_lock (&g_slot_mutex);
- debug_msg("After Slot_mutex LOCK\n");
+ SLOT_LOCK();
if (g_slots[slotid].status == STATUS_IDLE) {
err = MM_ERROR_SOUND_INVALID_STATE;
debug_warning("The playing slots is not found, Slot ID : [%d]\n", slotid);
goto cleanup;
}
+#ifdef DEBUG_DETAIL
debug_msg("Found slot, Slotid [%d] State [%d]\n", slotid, g_slots[slotid].status);
+#endif
+
+ g_slots[slotid].stop_by_user = true;
err = g_plugins[g_slots[slotid].pluginid].Stop(g_slots[slotid].plughandle);
if (err != MM_ERROR_NONE) {
debug_error("Fail to STOP Code : 0x%08X\n", err);
}
- debug_msg("Found slot, Slotid [%d] State [%d]\n", slotid, g_slots[slotid].status);
+
cleanup:
- pthread_mutex_unlock(&g_slot_mutex);
- debug_msg("After Slot_mutex UNLOCK\n");
+ SLOT_UNLOCK();
debug_leave("(err : 0x%08X)\n", err);
return err;
}
-
-static int _MMSoundMgrCodecStopCallback(int param)
+#ifdef FOCUS_INTEGRATION
+int MMSoundMgrCodecClearFocus(int pid)
{
int err = MM_ERROR_NONE;
-
- debug_enter("(Slot : %d)\n", param);
-
- pthread_mutex_lock(&g_slot_mutex);
- debug_msg("[CODEC MGR] Slot_mutex lock done\n");
-
-
- /*
- * Unregister ASM here
- */
-
- int errorcode = 0;
-
- if(g_slots[param].session_type != ASM_EVENT_CALL && g_slots[param].session_type != ASM_EVENT_VIDEOCALL) {
- debug_msg("[CODEC MGR] ASM unregister\n");
-#ifdef MURPHY
- if(!ASM_unregister_sound(g_slots[param].session_handle, g_slots[param].session_type, &errorcode)) {
-#else
- if(!ASM_unregister_sound_ex(g_slots[param].session_handle, g_slots[param].session_type, &errorcode, __asm_process_message)) {
-#endif
- debug_error("[CODEC MGR] Unregister sound failed 0x%X\n", errorcode);
+ int slotid;
+
+ debug_enter("(pid : [%d])\n", pid);
+
+ SLOT_LOCK();
+
+ for (slotid = 0 ; slotid < MANAGER_HANDLE_MAX ; slotid++) {
+ if (g_slots[slotid].pid == pid) {
+ if (g_slots[slotid].focus_handle || g_slots[slotid].focus_wcb_id) {
+ if (g_slots[slotid].session_type != MM_SESSION_TYPE_CALL &&
+ g_slots[slotid].session_type != MM_SESSION_TYPE_VIDEOCALL &&
+ g_slots[slotid].session_type != MM_SESSION_TYPE_VOIP &&
+ g_slots[slotid].session_type != MM_SESSION_TYPE_VOICE_RECOGNITION &&
+ g_slots[slotid].enable_session ) {
+ if ((g_slots[slotid].session_options & MM_SESSION_OPTION_PAUSE_OTHERS) ||
+ g_slots[slotid].session_type == MM_SESSION_TYPE_ALARM ||
+ g_slots[slotid].session_type == MM_SESSION_TYPE_NOTIFY ||
+ g_slots[slotid].session_type == MM_SESSION_TYPE_EMERGENCY) {
+ err = mm_sound_release_focus(g_slots[slotid].focus_handle, FOCUS_FOR_BOTH, NULL);
+ if (err) {
+ debug_error("mm_sound_release_focus failed [0x%x]", err);
+ }
+ if (mm_sound_unregister_focus(g_slots[slotid].focus_handle) || err) {
+ debug_error("Focus clean up failed [0x%x]", err);
+ err = MM_ERROR_POLICY_INTERNAL;
+ goto cleanup;
+ }
+ } else if (~(g_slots[slotid].session_options & MM_SESSION_OPTION_PAUSE_OTHERS)) {
+ err = mm_sound_unset_focus_watch_callback(g_slots[slotid].focus_wcb_id);
+ if (err) {
+ debug_error("mm_sound_unset_focus_watch_callback failed [0x%x]", err);
+ err = MM_ERROR_POLICY_INTERNAL;
+ goto cleanup;
+ }
+ }
+ }
+ if (mm_sound_remove_device_connected_callback(g_slots[slotid].subs_id) != MM_ERROR_NONE)
+ debug_error("mm_sound_remove_device_connected_callback() failed");
+ g_slots[slotid].focus_handle = 0;
+ g_slots[slotid].focus_wcb_id = 0;
+ g_slots[slotid].subs_id = 0;
+ }
}
}
-
-
- if (g_slots[param].msgcallback) {
- debug_msg("[CODEC MGR] msgcallback : %p\n", g_slots[param].msgcallback);
- debug_msg("[CODEC MGR] msg data : %p\n", g_slots[param].msgdata);
- debug_msg("[CODEC MGR] mgr codec callback : %p\n", g_slots[param].callback);
- g_slots[param].callback((int)g_slots[param].param, g_slots[param].msgcallback, g_slots[param].msgdata); /*param means client msg_type */
- }
- debug_msg("Client callback msg_type (instance) : [%d]\n", (int)g_slots[param].param);
- debug_msg("Handle allocated handle : [0x%08X]\n", g_slots[param].plughandle);
- err = g_plugins[g_slots[param].pluginid].Destroy(g_slots[param].plughandle);
- if (err < 0 ) {
- debug_critical("[CODEC MGR] Fail to destroy slot number : [%d] err [0x%x]\n", param, err);
- }
- memset(&g_slots[param], 0, sizeof(__mmsound_mgr_codec_handle_t));
- g_slots[param].status = STATUS_IDLE;
- pthread_mutex_unlock(&g_slot_mutex);
- debug_msg("[CODEC MGR] Slot_mutex done\n");
+cleanup:
+ SLOT_UNLOCK();
+ debug_leave("(err : 0x%08X)\n", err);
return err;
}
+#endif
-static int _MMSoundMgrCodecFindKeytoneSlot(int *slotid)
+static int _MMSoundMgrCodecStopCallback(int param)
{
- int count = 0;
int err = MM_ERROR_NONE;
- debug_enter("\n");
-
- pthread_mutex_lock(&g_slot_mutex);
- debug_warning("After Slot_mutex LOCK\n");
+ debug_enter("(Slot : %d)\n", param);
- for (count = SOUND_SLOT_START; count < MANAGER_HANDLE_MAX ; count++) {
- if (g_slots[count].status == STATUS_KEYTONE) {
- break;
- }
- }
- pthread_mutex_unlock(&g_slot_mutex);
- debug_warning("After Slot_mutex UNLOCK\n");
- if (count < MANAGER_HANDLE_MAX) {
- debug_msg("Found keytone handle allocated (Slot : [%d])\n", count);
- *slotid = count;
- err = MM_ERROR_NONE;
- } else {
- debug_warning("Handle is full handle [KEY TONE] : [%d]\n", count);
- err = MM_ERROR_SOUND_INTERNAL;
+ if (param < 0 || param >= MANAGER_HANDLE_MAX) {
+ debug_error ("Slot index param [%d] is invalid", param);
+ return MM_ERROR_INVALID_ARGUMENT;
}
- debug_leave("\n");
-
- return err;
-}
-
-static int _MMSoundMgrCodecFindLocaleSlot(int *slotid)
-{
- int count = 0;
- int err = MM_ERROR_NONE;
-
- debug_enter("\n");
-
- pthread_mutex_lock(&g_slot_mutex);
- debug_warning("After Slot_mutex LOCK\n");
+ if (g_slots[param].stop_by_user == false) {
+ SLOT_LOCK();
+ }
- for (count = SOUND_SLOT_START; count < MANAGER_HANDLE_MAX ; count++) {
- if (g_slots[count].status == STATUS_LOCALE) {
- break;
+#ifdef FOCUS_INTEGRATION
+ /*
+ * Unregister FOCUS here
+ */
+ debug_msg("[CODEC MGR] enable_session %d ",g_slots[param].enable_session);
+
+ if (g_slots[param].focus_handle || g_slots[param].focus_wcb_id) {
+ if (g_slots[param].session_type != MM_SESSION_TYPE_CALL &&
+ g_slots[param].session_type != MM_SESSION_TYPE_VIDEOCALL &&
+ g_slots[param].session_type != MM_SESSION_TYPE_VOIP &&
+ g_slots[param].session_type != MM_SESSION_TYPE_VOICE_RECOGNITION &&
+ g_slots[param].enable_session ) {
+ if ((g_slots[param].session_options & MM_SESSION_OPTION_PAUSE_OTHERS) ||
+ g_slots[param].session_type == MM_SESSION_TYPE_ALARM ||
+ g_slots[param].session_type == MM_SESSION_TYPE_NOTIFY ||
+ g_slots[param].session_type == MM_SESSION_TYPE_EMERGENCY) {
+ if (g_slots[param].current_focus_type != FOCUS_NONE) {
+ err = mm_sound_release_focus(g_slots[param].focus_handle, g_slots[param].current_focus_type, NULL);
+ if (err) {
+ debug_error("mm_sound_release_focus failed [0x%x]", err);
+ }
+ }
+ if (mm_sound_unregister_focus(g_slots[param].focus_handle) || err) {
+ debug_error("Focus clean up failed [0x%x]", err);
+ err = MM_ERROR_POLICY_INTERNAL;
+ goto finish;
+ }
+ } else if (~(g_slots[param].session_options & MM_SESSION_OPTION_PAUSE_OTHERS)) {
+ err = mm_sound_unset_focus_watch_callback(g_slots[param].focus_wcb_id);
+ if (err) {
+ debug_error("mm_sound_unset_focus_watch_callback failed [0x%x]", err);
+ err = MM_ERROR_POLICY_INTERNAL;
+ goto finish;
+ }
+ }
}
+ if (mm_sound_remove_device_connected_callback(g_slots[param].subs_id) != MM_ERROR_NONE)
+ debug_error("mm_sound_remove_device_connected_callback() failed");
}
- pthread_mutex_unlock(&g_slot_mutex);
+#endif
- debug_warning("After Slot_mutex UNLOCK\n");
- if (count < MANAGER_HANDLE_MAX) {
- debug_msg("Found locale handle allocated (Slot : [%d])\n", count);
- *slotid = count;
- err = MM_ERROR_NONE;
- } else {
- debug_warning("Handle is full handle [KEY TONE] \n");
- err = MM_ERROR_SOUND_INTERNAL;
+ if (g_slots[param].stop_by_user == false) {
+ __mm_sound_mgr_ipc_notify_play_file_end(param);
+ debug_msg("Client callback msg_type (instance) : [%d]\n", (int)g_slots[param].param);
}
- debug_leave("\n");
-
- return err;
-}
-
-static int _MMSoundMgrCodecGetEmptySlot(int *slot)
-{
- int count = 0;
- int err = MM_ERROR_NONE;
+ debug_msg("Handle allocated handle : [0x%08X]\n", g_slots[param].plughandle);
+ err = g_plugins[g_slots[param].pluginid].Destroy(g_slots[param].plughandle);
+ if (err < 0)
+ debug_critical("[CODEC MGR] Fail to destroy slot number : [%d] err [0x%x]\n", param, err);
- debug_enter("\n");
- debug_msg("Codec slot ID : [%d]\n", *slot);
- pthread_mutex_lock(&g_slot_mutex);
- debug_msg("After Slot_mutex LOCK\n");
+ _mm_sound_mgr_codec_slot_clear(param);
+ if (_mm_sound_mgr_codec_slot_is_empty())
+ _mm_sound_mgr_codec_shutdown_timer_start();
- for (count = SOUND_SLOT_START; count < MANAGER_HANDLE_MAX ; count++) {
- if (g_slots[count].status == STATUS_IDLE) {
- g_slots[count].status = STATUS_SOUND;
- break;
- }
+finish:
+ if (g_slots[param].stop_by_user == false) {
+ SLOT_UNLOCK();
}
- pthread_mutex_unlock(&g_slot_mutex);
- debug_msg("After Slot_mutex UNLOCK\n");
- if (count < MANAGER_HANDLE_MAX) {
- debug_msg("New handle allocated (codec slot ID : [%d])\n", count);
- *slot = count;
- err = MM_ERROR_NONE;
- } else {
- debug_warning("Handle is full handle : [%d]\n", count);
- *slot = -1;
- /* Temporal code for reset */
- while(count--) {
- g_slots[count].status = STATUS_IDLE;
- }
- err = MM_ERROR_SOUND_INTERNAL;
- }
-
- debug_leave("\n");
+ debug_fleave();
return err;
}
+
+
static int _MMSoundMgrCodecRegisterInterface(MMSoundPluginType *plugin)
{
int err = MM_ERROR_NONE;
- int count = 0;
+ int plugin_id = 0;
void *getinterface = NULL;
- debug_enter("\n");
+#ifdef DEBUG_DETAIL
+ debug_enter();
+#endif
/* find emptry slot */
- for (count = 0; count < MM_SOUND_SUPPORTED_CODEC_NUM; count++) {
- if (g_plugins[count].GetSupportTypes == NULL)
+ for (plugin_id = 0; plugin_id < MM_SOUND_SUPPORTED_CODEC_NUM; plugin_id++) {
+ if (g_plugins[plugin_id].GetSupportTypes == NULL)
break;
}
- if (count == MM_SOUND_SUPPORTED_CODEC_NUM) {
+ if (plugin_id == MM_SOUND_SUPPORTED_CODEC_NUM) {
debug_critical("The plugin support type is not valid\n");
return MM_ERROR_COMMON_OUT_OF_RANGE;
}
-
- debug_msg("Empty slot find : %d\n", count);
err = MMSoundPluginGetSymbol(plugin, CODEC_GET_INTERFACE_FUNC_NAME, &getinterface);
if (err != MM_ERROR_NONE) {
debug_error("Get Symbol CODEC_GET_INTERFACE_FUNC_NAME is fail : %x\n", err);
goto cleanup;
}
- debug_msg("Getinterface name : %s\n", (char*)getinterface );
+ debug_msg("interface[%p] empty_slot[%d]\n", getinterface, plugin_id);
- err = MMSoundPlugCodecCastGetInterface(getinterface)(&g_plugins[count]);
+ err = MMSoundPlugCodecCastGetInterface(getinterface)(&g_plugins[plugin_id]);
if (err != MM_ERROR_NONE) {
debug_error("Get interface fail : %x\n", err);
-cleanup:
+cleanup:
/* If error occur, clean interface */
- memset(&g_plugins[count], 0, sizeof(mmsound_codec_interface_t));
+ memset(&g_plugins[plugin_id], 0, sizeof(mmsound_codec_interface_t));
} else {
- if (g_plugins[count].SetThreadPool)
- g_plugins[count].SetThreadPool(MMSoundThreadPoolRun);
+ if (g_plugins[plugin_id].SetThreadPool)
+ g_plugins[plugin_id].SetThreadPool(MMSoundThreadPoolRun);
}
- debug_leave("\n");
+#ifdef DEBUG_DETAIL
+ debug_leave();
+#endif
return err;
}