includelibmmfsounddir = $(includedir)/mmf
includelibmmfsound_HEADERS = include/mm_sound.h \
- include/mm_sound_private.h
+ include/mm_sound_private.h \
+ server/include/mm_sound_plugin.h \
+ server/include/mm_sound_plugin_hal.h
libmmfsound_la_SOURCES = mm_sound.c \
mm_sound_client.c
%{_libdir}/libmmfsound.so
%{_libdir}/libmmfsoundcommon.so
%{_includedir}/mmf/mm_sound_private.h
+%{_includedir}/mmf/mm_sound_plugin.h
+%{_includedir}/mmf/mm_sound_plugin_hal.h
%files sdk-devel
mm_sound_mgr_run.c \
mm_sound_plugin.c \
mm_sound_server.c \
- mm_sound_thread_pool.c
+ mm_sound_thread_pool.c \
+ mm_sound_hal.c
sound_server_CFLAGS = -I$(srcdir)/../include \
-I$(srcdir)/include \
-DMMF_LOG_OWNER=0x020 \
-DMMF_DEBUG_PREFIX=\"MMF-SOUND\" \
-D__DEBUG_MODE__ -DUSE_VCONF -D__USE_LOGMANAGER__ \
+ -rdynamic \
$(MMSESSION_CFLAGS) \
$(AVSYSTEM_CFLAGS) \
$(AUDIOSESSIONMGR_CFLAGS) \
--- /dev/null
+/*
+ * 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_HAL_H__
+#define __MM_SOUND_HAL_H__
+
+int MMSoundMgrHALInit(const char *targetdir);
+int MMSoundMgrHALFini(void);
+
+int audio_hal_pulse_sink_route(int device);
+
+int audio_hal_pulse_source_route(int device);
+
+int audio_hal_set_sound_path(int gain, int output, int input, int option);
+
+int audio_hal_init();
+
+int audio_hal_fini();
+
+
+#endif//__MM_SOUND_HAL_H__
MM_SOUND_PLUGIN_TYPE_NONE = 0,
MM_SOUND_PLUGIN_TYPE_CODEC,
MM_SOUND_PLUGIN_TYPE_RUN,
+ MM_SOUND_PLUGIN_TYPE_HAL,
MM_SOUND_PLUGIN_TYPE_LAST,
};
--- /dev/null
+/*
+ * 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_PLUGIN_HAL_H__
+#define __MM_SOUND_PLUGIN_HAL_H__
+
+#include "mm_sound_plugin.h"
+#include <mm_types.h>
+
+typedef struct {
+ int (*pulse_sink_route)(int device);
+ int (*pulse_source_route)(int device);
+ int (*set_sound_path)(int gain, int output, int input, int option);
+ int (*init)();
+ int (*fini)();
+} mmsound_hal_interface_t;
+
+/* Utility Functions */
+#define HAL_GET_INTERFACE_FUNC_NAME "MMSoundPlugHALGetInterface"
+#define MMSoundPlugHALCastGetInterface(func) ((int (*)(mmsound_hal_interface_t*))(func))
+
+#define AUDIO_HAL_STATE_SUCCESS 0x0
+#define AUDIO_HAL_ROUTE_SUCCESS_AND_GOTOEND 0x1
+#define AUDIO_HAL_STATE_ERROR_INTERNAL 0x2
+
+int MMSoundPlugHALGetInterface(mmsound_hal_interface_t *intf);
+
+#endif /* __MM_SOUND_PLUGIN_HAL_H__ */
+
--- /dev/null
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <mm_error.h>
+#include <mm_debug.h>
+#include <avsys-audio.h>
+
+#include "mm_sound_hal.h"
+
+#include "include/mm_sound_plugin_hal.h"
+#include "include/mm_sound_mgr_pulse.h"
+
+static MMSoundPluginType* g_hal_plugin = NULL;
+static mmsound_hal_interface_t g_plugin_interface;
+
+#define DEVICE_API_BLUETOOTH "bluez"
+#define DEVICE_API_ALSA "alsa"
+#ifdef USE_PULSE_WFD /* Not enabled yet */
+#define DEVICE_API_WFD "wfd"
+#endif
+
+#define DEVICE_BUS_BLUETOOTH "bluetooth"
+#define DEVICE_BUS_USB "usb"
+#define DEVICE_BUS_BUILTIN "builtin"
+
+int audio_hal_pulse_sink_route(int device)
+{
+ debug_fenter();
+ if (g_plugin_interface.pulse_sink_route) {
+ return g_plugin_interface.pulse_sink_route(device);
+ }
+
+ debug_log("g_plugin_interface.pulse_sink_route is null!");
+ if (device & MM_SOUND_DEVICE_OUT_BT_A2DP) {
+ debug_log("BT A2DP is active, Set default sink to BLUEZ");
+ MMSoundMgrPulseSetDefaultSink (DEVICE_API_BLUETOOTH, DEVICE_BUS_BLUETOOTH);
+ return AUDIO_HAL_ROUTE_SUCCESS_AND_GOTOEND;
+ } else if (device & MM_SOUND_DEVICE_OUT_WFD) {
+#ifdef USE_PULSE_WFD /* Not enabled yet */
+ debug_log("WFD is active, Set default sink to WFD");
+ MMSoundMgrPulseSetDefaultSink (DEVICE_API_WFD, DEVICE_BUS_BUILTIN);
+ return AUDIO_HAL_ROUTE_SUCCESS_AND_GOTOEND;
+#endif
+ } else if (device & MM_SOUND_DEVICE_OUT_USB_AUDIO) {
+ debug_log("USB Audio is active, Set default sink to USB Audio");
+ MMSoundMgrPulseSetDefaultSink (DEVICE_API_ALSA, DEVICE_BUS_USB);
+ return AUDIO_HAL_ROUTE_SUCCESS_AND_GOTOEND;
+ }
+ debug_log("Set default sink to ALSA with BUILTIN");
+ MMSoundMgrPulseSetDefaultSink (DEVICE_API_ALSA, DEVICE_BUS_BUILTIN);
+ debug_fleave();
+ return AUDIO_HAL_STATE_SUCCESS;
+}
+
+int audio_hal_pulse_source_route(int device)
+{
+ debug_fenter();
+ if (g_plugin_interface.pulse_source_route) {
+ return g_plugin_interface.pulse_source_route(device);
+ }
+ debug_log("g_plugin_interface.pulse_source_route is null!");
+ debug_fleave();
+ return AUDIO_HAL_STATE_SUCCESS;
+}
+
+EXPORT_API
+int audio_hal_set_sound_path(int gain, int output, int input, int option)
+{
+ int err = MM_ERROR_NONE;
+
+ debug_fenter();
+ if (g_plugin_interface.set_sound_path) {
+ err = g_plugin_interface.set_sound_path(gain, output, input, option);
+ }
+ else {
+ err = avsys_audio_set_path_ex(gain, output, input, option);
+ }
+ debug_fleave();
+ return err;
+}
+
+int audio_hal_init()
+{
+ debug_fenter();
+ if (g_plugin_interface.init) {
+ return g_plugin_interface.init();
+ }
+ debug_fleave();
+ return AUDIO_HAL_STATE_SUCCESS;
+}
+
+int audio_hal_fini()
+{
+ debug_fenter();
+ if (g_plugin_interface.fini) {
+ return g_plugin_interface.fini();
+ }
+ debug_fleave();
+ return AUDIO_HAL_STATE_SUCCESS;
+}
+
+int MMSoundMgrHALInit(const char *targetdir)
+{
+ int err = MM_ERROR_NONE;
+
+ debug_fenter();
+ if (g_hal_plugin) {
+ debug_error("Please Check Init\n");
+ return MM_ERROR_SOUND_INTERNAL;
+ }
+ err = MMSoundPluginScan(targetdir, MM_SOUND_PLUGIN_TYPE_HAL, &g_hal_plugin);
+ debug_log("MMSoundPluginScan return %d", err);
+
+ if (g_hal_plugin) {
+ void* func = NULL;
+
+ err = MMSoundPluginGetSymbol(g_hal_plugin, HAL_GET_INTERFACE_FUNC_NAME, &func);
+ if (err != MM_ERROR_NONE) {
+ debug_error("Get Symbol %s fail : %x\n", HAL_GET_INTERFACE_FUNC_NAME, err);
+ goto err_out_and_free;
+ }
+ err = MMSoundPlugHALCastGetInterface(func)(&g_plugin_interface);
+ if (err != AUDIO_HAL_STATE_SUCCESS) {
+ debug_error("Get interface fail : %x\n", err);
+ goto err_out_and_free;
+ }
+
+ debug_log("g_plugin_interface.pulse_sink_route=%p", g_plugin_interface.pulse_sink_route);
+ debug_log("g_plugin_interface.pulse_source_route=%p", g_plugin_interface.pulse_source_route);
+ debug_log("g_plugin_interface.set_sound_path=%p", g_plugin_interface.set_sound_path);
+ debug_log("g_plugin_interface.init=%p", g_plugin_interface.init);
+ debug_log("g_plugin_interface.fini=%p", g_plugin_interface.fini);
+
+ err = audio_hal_init();
+ if (err != AUDIO_HAL_STATE_SUCCESS) {
+ debug_error("audio_hal_init failed : %x\n", err);
+ goto err_out_and_free;
+ }
+ }
+
+ debug_fleave();
+ return AUDIO_HAL_STATE_SUCCESS;
+
+err_out_and_free:
+ free(g_hal_plugin);
+ g_hal_plugin = NULL;
+ debug_fleave();
+ return AUDIO_HAL_STATE_ERROR_INTERNAL;
+}
+
+int MMSoundMgrHALFini(void)
+{
+ int err = MM_ERROR_NONE;
+
+ debug_fenter();
+ err = audio_hal_fini();
+ if (err != AUDIO_HAL_STATE_SUCCESS) {
+ debug_error("audio_hal_fini failed");
+ return err;
+ }
+ debug_fleave();
+ return AUDIO_HAL_STATE_SUCCESS;
+}
return ret;
}
+EXPORT_API
void MMSoundMgrPulseSetDefaultSink (char* device_api_name, char* device_bus_name)
{
debug_enter("\n");
#include "include/mm_sound_mgr_headset.h"
#include "include/mm_sound_mgr_pulse.h"
#include "include/mm_sound_mgr_asm.h"
+#include "include/mm_sound_hal.h"
#define EARJACK_WITH_MIC 2
#define MAX_STRING_LEN 256
-#define DEVICE_API_BLUETOOTH "bluez"
-#define DEVICE_API_ALSA "alsa"
-#ifdef USE_PULSE_WFD /* Not enabled yet */
-#define DEVICE_API_WFD "wfd"
-#endif
-
-#define DEVICE_BUS_BLUETOOTH "bluetooth"
-#define DEVICE_BUS_USB "usb"
-#define DEVICE_BUS_BUILTIN "builtin"
-#ifdef SEPARATE_SPEAKER_AND_WIRED_ACCESSORY
-#define DEVICE_BUS_WIRED "wired"
-#endif
-
#define MM_SOUND_DEVICE_OUT_ANY 0x000FFF00
#define MM_SOUND_DEVICE_IN_ANY 0x000000FF
}
- if (AVSYS_FAIL(avsys_audio_set_path_ex( gain,
+ if (audio_hal_set_sound_path(gain,
AVSYS_AUDIO_PATH_EX_NONE, AVSYS_AUDIO_PATH_EX_NONE,
- AVSYS_AUDIO_PATH_OPTION_NONE ))) {
- debug_error ("avsys_audio_set_path_ex() failed [%x]\n", ret);
+ AVSYS_AUDIO_PATH_OPTION_NONE)) {
+ debug_error ("audio_hal_set_sound_path() failed\n");
ret = MM_ERROR_SOUND_INTERNAL;
goto ROUTE_COMM_EXIT;
}
out = AVSYS_AUDIO_PATH_EX_A2DP;
/* PATH SET */
- if (AVSYS_FAIL(avsys_audio_set_path_ex( AVSYS_AUDIO_GAIN_EX_FMRADIO,
+ if (audio_hal_set_sound_path(AVSYS_AUDIO_GAIN_EX_FMRADIO,
out, AVSYS_AUDIO_PATH_EX_FMINPUT,
- AVSYS_AUDIO_PATH_OPTION_NONE))) {
- debug_error ("avsys_audio_set_path_ex() failed\n");
+ AVSYS_AUDIO_PATH_OPTION_NONE)) {
+ debug_error ("audio_hal_set_sound_path() failed\n");
ret = MM_ERROR_SOUND_INTERNAL;
goto ROUTE_FMRADIO_EXIT;
}
-
} else { /* SESSION_END */
/* PATH RELEASE */
- if (AVSYS_FAIL(avsys_audio_set_path_ex( AVSYS_AUDIO_GAIN_EX_FMRADIO,
+ if (audio_hal_set_sound_path(AVSYS_AUDIO_GAIN_EX_FMRADIO,
AVSYS_AUDIO_PATH_EX_NONE, AVSYS_AUDIO_PATH_EX_NONE,
- AVSYS_AUDIO_PATH_OPTION_NONE ))) {
- debug_error ("avsys_audio_set_path_ex() failed\n");
+ AVSYS_AUDIO_PATH_OPTION_NONE)) {
+ debug_error ("audio_hal_set_sound_path() failed\n");
ret = MM_ERROR_SOUND_INTERNAL;
goto ROUTE_FMRADIO_EXIT;
}
}
/* Pulseaudio route */
- if (IS_ACTIVE(MM_SOUND_DEVICE_OUT_BT_A2DP)) {
- debug_log ("BT A2DP is active, Set default sink to BLUEZ");
- MMSoundMgrPulseSetDefaultSink (DEVICE_API_BLUETOOTH, DEVICE_BUS_BLUETOOTH);
+ if (audio_hal_pulse_sink_route(g_info.device_active)) {
goto CURRENT_ACTIVE_END;
- } else if (IS_ACTIVE(MM_SOUND_DEVICE_OUT_WFD)) {
-#ifdef USE_PULSE_WFD /* Not enabled yet */
- debug_log ("WFD is active, Set default sink to WFD");
- MMSoundMgrPulseSetDefaultSink (DEVICE_API_WFD, DEVICE_BUS_BUILTIN);
- goto CURRENT_ACTIVE_END;
-#endif
- } else if (IS_ACTIVE(MM_SOUND_DEVICE_OUT_USB_AUDIO)) {
- debug_log ("USB Audio is active, Set default sink to USB Audio");
- MMSoundMgrPulseSetDefaultSink (DEVICE_API_ALSA, DEVICE_BUS_USB);
+ }
+ if (audio_hal_pulse_source_route(g_info.device_active)) {
goto CURRENT_ACTIVE_END;
}
-#ifndef SEPARATE_SPEAKER_AND_WIRED_ACCESSORY
- /* ALSA route */
- debug_log ("Set default sink to ALSA with BUILTIN");
- MMSoundMgrPulseSetDefaultSink (DEVICE_API_ALSA, DEVICE_BUS_BUILTIN);
-#endif
-
/* prepare IN */
if (IS_ACTIVE(MM_SOUND_DEVICE_IN_MIC)) {
in = AVSYS_AUDIO_PATH_EX_MIC;
break;
}
-#ifdef SEPARATE_SPEAKER_AND_WIRED_ACCESSORY
- if (!IS_ACTIVE(MM_SOUND_DEVICE_OUT_BT_A2DP)) {
- debug_log ("BT A2DP is not active, Set default sink to ALSA_XX");
- if (out == AVSYS_AUDIO_PATH_EX_HEADSET) {
- debug_log ("Set default sink to ALSA_WIRED_ACCESSORY");
- MMSoundMgrPulseSetDefaultSink (DEVICE_API_ALSA, DEVICE_BUS_WIRED);
- } else if (out == AVSYS_AUDIO_PATH_EX_SPK) {
- debug_log ("Set default sink to ALSA_SPEAKER");
- MMSoundMgrPulseSetDefaultSink (DEVICE_API_ALSA, DEVICE_BUS_BUILTIN);
- }
- }
-#endif
-
- debug_log ("Trying to set avsys set path gain[%d], out[%d], in[%d], option[%d]\n", gain, out, in, option);
-
/* Set Path (GAIN, OUT, IN) */
- if (AVSYS_FAIL(avsys_audio_set_path_ex(gain, out, in, option))) {
- debug_error ("avsys_audio_set_path_ex failed\n");
+ if (audio_hal_set_sound_path(gain, out, in, option)) {
+ debug_error ("audio_hal_set_sound_path failed\n");
ret = MM_ERROR_SOUND_INTERNAL;
}
/* Sound path for ALSA */
debug_log ("Set path to DUAL.\n");
- if (AVSYS_FAIL(avsys_audio_set_path_ex(AVSYS_AUDIO_GAIN_EX_KEYTONE,
+ if (audio_hal_set_sound_path(AVSYS_AUDIO_GAIN_EX_KEYTONE,
AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_NONE,
- AVSYS_AUDIO_PATH_OPTION_DUAL_OUT))) {
- debug_error ("avsys_audio_set_path_ex failed\n");
+ AVSYS_AUDIO_PATH_OPTION_DUAL_OUT)) {
+ debug_error ("audio_hal_set_sound_path() failed\n");
ret = MM_ERROR_SOUND_INTERNAL;
}
/* Sound path for ALSA */
debug_log ("Set path to SPEAKER.\n");
- if(AVSYS_FAIL(avsys_audio_set_path_ex(AVSYS_AUDIO_GAIN_EX_KEYTONE,
+ if (audio_hal_set_sound_path(AVSYS_AUDIO_GAIN_EX_KEYTONE,
AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_NONE,
- AVSYS_AUDIO_PATH_OPTION_NONE))) {
- debug_error ("avsys_audio_set_path_ex failed\n");
+ AVSYS_AUDIO_PATH_OPTION_NONE)) {
+ debug_error ("audio_hal_set_sound_path failed\n");
ret = MM_ERROR_SOUND_INTERNAL;
}
"ERROR",
"SOUND",
"RUN",
+ "HAL",
};
if (type < MM_SOUND_PLUGIN_TYPE_LAST && type > -1)
debug_msg("%s is %s\n", file,
t == MM_SOUND_PLUGIN_TYPE_CODEC ? "CODEC":
- t == MM_SOUND_PLUGIN_TYPE_RUN ? "RUN" : "Unknown");
+ t == MM_SOUND_PLUGIN_TYPE_RUN ? "RUN" :
+ t == MM_SOUND_PLUGIN_TYPE_HAL ? "HAL": "Unknown");
switch(t)
{
case MM_SOUND_PLUGIN_TYPE_CODEC:
case MM_SOUND_PLUGIN_TYPE_RUN:
+ case MM_SOUND_PLUGIN_TYPE_HAL:
plugin->type = t;
plugin->module = pdll;
break;
MMSoundThreadPoolInit();
MMSoundMgrRunInit(serveropt.plugdir);
MMSoundMgrCodecInit(serveropt.plugdir);
+ MMSoundMgrHALInit(serveropt.plugdir);
if (!serveropt.testmode)
MMSoundMgrIpcInit();
MMSoundMgrCodecFini();
MMSoundMgrRunFini();
+ MMSoundMgrHALFini();
MMSoundThreadPoolFini();
MMSoundMgrWfdFini();
#include "../../include/mm_ipc.h"
#include "../../include/mm_sound_thread_pool.h"
#include "../../include/mm_sound_plugin_codec.h"
+#include "../../include/mm_sound_hal.h"
#include "../../../include/mm_sound_private.h"
/* if current out is not speaker, then force set path to speaker */
if (out != AVSYS_AUDIO_PATH_EX_SPK) {
debug_msg("[CODEC WAV] current out is not SPEAKER, set path to SPEAKER now!!!\n");
- avsys_audio_set_path_ex(AVSYS_AUDIO_GAIN_EX_AUDIOPLAYER, AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_NONE, AVSYS_AUDIO_PATH_OPTION_NONE);
+ audio_hal_set_sound_path(AVSYS_AUDIO_GAIN_EX_AUDIOPLAYER, AVSYS_AUDIO_PATH_EX_SPK, AVSYS_AUDIO_PATH_EX_NONE, AVSYS_AUDIO_PATH_OPTION_NONE);
}
break;
case MM_SOUND_HANDLE_ROUTE_USING_CURRENT:
if (gain_after != gain || out_after != out || in_after != in || option_after != option) {
debug_msg("[CODEC WAV] Restore path to previous one\n");
- ret = avsys_audio_set_path_ex(gain, out, in, option);
- if(AVSYS_FAIL(ret)) {
+ if (audio_hal_set_sound_path(gain, out, in, option)) {
debug_error("[CODEC WAV] Can not restore sound path\n");
}
}