summaryrefslogtreecommitdiff
path: root/avsys-audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'avsys-audio.c')
-rw-r--r--avsys-audio.c207
1 files changed, 154 insertions, 53 deletions
diff --git a/avsys-audio.c b/avsys-audio.c
index 8ce7538..029d93a 100644
--- a/avsys-audio.c
+++ b/avsys-audio.c
@@ -68,9 +68,21 @@ void __fini_module(void);
} \
} while (0)
+#define AVSYS_STREAM_LOCK() do { \
+ pthread_mutex_lock(&gmutex);\
+ avsys_info(AVAUDIO, "(+) LOCKED\n"); \
+} while (0)
+
+#define AVSYS_STREAM_UNLOCK() do { \
+ pthread_mutex_unlock(&gmutex);\
+ avsys_info(AVAUDIO, "(-) UNLOCKED\n"); \
+} while (0)
+
/**
* Internal global variable
*/
+static pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;
+
/****************************************************************************
*
@@ -91,7 +103,7 @@ int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *s
return AVSYS_STATE_ERR_NULL_POINTER;
}
- if (param->channels > 2 || param->channels < 1) {
+ if (param->channels > AVSYS_CHANNEL_MAX || param->channels < AVSYS_CHANNEL_MIN) {
return AVSYS_STATE_ERR_INVALID_CHANNEL;
}
@@ -103,6 +115,8 @@ int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *s
return AVSYS_STATE_ERR_INVALID_FORMAT;
}
+ AVSYS_STREAM_LOCK();
+
err = avsys_audio_handle_rejuvenation();
if (AVSYS_FAIL(err)) {
avsys_error(AVAUDIO, "Unused handle cleanup before handle allocation failed in %s\n", __func__);
@@ -147,18 +161,18 @@ int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *s
}
/* update volume by type */
- err = avsys_audio_handle_update_volume(p, p->gain_setting.vol_type);
+ err = avsys_audio_handle_update_volume(p, p->gain_setting.volume_config);
if (AVSYS_FAIL(err)) {
goto error;
}
- err = avsys_audio_handle_update_priority(handle, param->priority, param->bluetooth, AVSYS_AUDIO_SET_PRIORITY);
+ err = avsys_audio_handle_update_priority(handle, param->priority, param->handle_route, AVSYS_AUDIO_SET_PRIORITY);
if (AVSYS_FAIL(err)) {
goto error;
}
}
/* open device */
- err = avsys_audio_pasimple_open_device(p->mode, p->format, p->channels, p->samplerate, p, param->bluetooth);
+ err = avsys_audio_pasimple_open_device(p->mode, p->format, p->channels, p->samplerate, p, param->handle_route);
if (AVSYS_FAIL(err)) {
goto error;
}
@@ -187,7 +201,7 @@ int avsys_audio_open(avsys_audio_param_t *param, avsys_handle_t *phandle, int *s
if (AVSYS_FAIL(err)) {
goto error;
}
-
+ AVSYS_STREAM_UNLOCK();
return AVSYS_STATE_SUCCESS;
error:
@@ -201,10 +215,10 @@ error:
}
}
- avsys_error(AVAUDIO, "failed to open : RESION %x\n", err);
+ avsys_error(AVAUDIO, "failed to open : REASON %x\n", err);
*phandle = (avsys_handle_t)-1;
-
+ AVSYS_STREAM_UNLOCK();
return err;
}
@@ -216,9 +230,14 @@ int avsys_audio_close(avsys_handle_t handle)
bool cp_audio = false;
bool bt_path = false;
+ AVSYS_STREAM_LOCK();
avsys_info(AVAUDIO, "%s, handle=[%d]\n", __func__, (int)handle);
- AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
+ err = avsys_audio_handle_get_ptr((int)handle, &p, HANDLE_PTR_MODE_NORMAL);
+ if (AVSYS_FAIL(err)) {
+ AVSYS_STREAM_UNLOCK();
+ return err;
+ }
if (AVSYS_FAIL(avsys_audio_handle_update_priority((int)handle, p->priority, AVSYS_AUDIO_HANDLE_ROUTE_FOLLOWING_POLICY, AVSYS_AUDIO_UNSET_PRIORITY))) {
avsys_error(AVAUDIO, "unset priority of handle %d error: %x\n", handle, err);
@@ -238,10 +257,51 @@ int avsys_audio_close(avsys_handle_t handle)
avsys_audio_path_set_single_ascn("cp_to_bt");
}
- AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
+ if (AVSYS_FAIL(avsys_audio_handle_release_ptr((int)handle, HANDLE_PTR_MODE_NORMAL))) {
+ avsys_error(AVAUDIO, "audio handle release failed\n");
+ AVSYS_STREAM_UNLOCK();
+ return AVSYS_STATE_ERR_INTERNAL;
+ }
avsys_audio_handle_free((int)handle);
+ AVSYS_STREAM_UNLOCK();
+
+ return err;
+}
+
+EXPORT_API
+int avsys_audio_update_volume_config(avsys_handle_t handle, int volume_config)
+{
+ avsys_audio_handle_t *p = NULL;
+ int err = AVSYS_STATE_ERR_UNKNOWN;
+
+ AVSYS_STREAM_LOCK();
+ avsys_info(AVAUDIO, "%s, handle=[%d]\n", __func__, (int)handle);
+
+ err = avsys_audio_handle_get_ptr((int)handle, &p, HANDLE_PTR_MODE_NORMAL);
+ if (AVSYS_FAIL(err)) {
+ AVSYS_STREAM_UNLOCK();
+ return err;
+ }
+
+ if (p->mode == AVSYS_AUDIO_MODE_OUTPUT || p->mode == AVSYS_AUDIO_MODE_OUTPUT_CLOCK
+ || p->mode == AVSYS_AUDIO_MODE_OUTPUT_LOW_LATENCY || p->mode == AVSYS_AUDIO_MODE_OUTPUT_AP_CALL
+ || p->mode == AVSYS_AUDIO_MODE_OUTPUT_VIDEO) {
+ p->gain_setting.volume_config = volume_config;
+ /* update volume by type */
+ err = avsys_audio_handle_update_volume(p, p->gain_setting.volume_config);
+ if (AVSYS_FAIL(err)) {
+ AVSYS_STREAM_UNLOCK();
+ return err;
+ }
+ err = avsys_audio_pasimple_set_volume(p, p->working_vol.level[AVSYS_AUDIO_CHANNEL_LEFT]);
+ if (AVSYS_FAIL(err)) {
+ avsys_error(AVAUDIO, "can not set volume in %s\n", __func__);
+ }
+ }
+
+ AVSYS_STREAM_UNLOCK();
return err;
}
@@ -486,9 +546,9 @@ int avsys_audio_set_mute_fadedown(avsys_handle_t handle)
/* Tuning part */
EXPORT_API
-int avsys_audio_set_volume_table(int gain_type, int dev_type, int step, int lv, int rv)
+int avsys_audio_set_volume_table(int volume_type, int dev_type, int step, int lv, int rv)
{
- int ret = avsys_audio_logical_volume_set_to_table(gain_type, dev_type, step, lv, rv);
+ int ret = avsys_audio_logical_volume_set_to_table(volume_type, dev_type, step, lv, rv);
avsys_audio_handle_t *ptr = NULL;
int handle = -1;
@@ -508,22 +568,47 @@ int avsys_audio_set_volume_table(int gain_type, int dev_type, int step, int lv,
}
EXPORT_API
-int avsys_audio_get_volume_table(int gain_type, int dev_type, int step, int *lv, int *rv)
+int avsys_audio_get_volume_table(int volume_type, int dev_type, int step, int *lv, int *rv)
{
- return avsys_audio_logical_volume_get_from_table(gain_type, dev_type, step, lv, rv);
+ return avsys_audio_logical_volume_get_from_table(volume_type, dev_type, step, lv, rv);
}
EXPORT_API
int avsys_audio_get_volume_max_ex(int volume_type, int *max_step)
{
- int volume_table = 0;
if (max_step == NULL) {
return AVSYS_STATE_ERR_NULL_POINTER;
}
- volume_table = volume_type;
+ return avsys_audio_logical_volume_get_max(volume_type, AVSYS_AUDIO_LVOL_DEV_TYPE_SPK, max_step);
+}
+
+EXPORT_API
+int avsys_audio_set_volume_gain_table(int volume_gain_idx, int dev_type, float lv, float rv)
+{
+ int ret = avsys_audio_logical_volume_set_gain_to_table(volume_gain_idx, dev_type, lv, rv);
+ avsys_audio_handle_t *ptr = NULL;
+ int handle = -1;
+
+ if (AVSYS_FAIL(ret)) {
+ return ret;
+ }
+
+ while(++handle < AVSYS_AUDIO_HANDLE_MAX) {
+ ptr = NULL;
- return avsys_audio_logical_volume_get_max(volume_table, AVSYS_AUDIO_LVOL_DEV_TYPE_SPK, max_step);
+ if (AVSYS_SUCCESS(avsys_audio_handle_get_ptr(handle, &ptr, HANDLE_PTR_MODE_NORMAL))) {
+ avsys_audio_logical_volume_convert(&ptr->setting_vol, &ptr->working_vol, &ptr->gain_setting);
+ avsys_audio_handle_release_ptr(handle, HANDLE_PTR_MODE_NORMAL);
+ }
+ }
+ return AVSYS_STATE_SUCCESS;
+}
+
+EXPORT_API
+int avsys_audio_get_volume_gain_table(int volume_gain_idx, int dev_type, float *lv, float *rv)
+{
+ return avsys_audio_logical_volume_get_gain_from_table(volume_gain_idx, dev_type, lv, rv);
}
EXPORT_API
@@ -631,6 +716,9 @@ int avsys_audio_get_global_mute(int *pmute)
static int __avsys_audio_set_info(avsys_audio_handle_t *p, avsys_audio_param_t *param)
{
+ int vol_conf_type = AVSYS_AUDIO_VOLUME_CONFIG_TYPE(param->vol_type);
+ int vol_conf_gain = AVSYS_AUDIO_VOLUME_CONFIG_GAIN(param->vol_type);
+
avsys_info(AVAUDIO, "%s\n", __func__);
avsys_info(AVAUDIO, "=============================================\n");
@@ -640,8 +728,9 @@ static int __avsys_audio_set_info(avsys_audio_handle_t *p, avsys_audio_param_t *
avsys_info(AVAUDIO, " format = %d (0: 8bits, 1:16bits, 2:32bits)\n", param->format);
avsys_info(AVAUDIO, " channel = %d\n", param->channels);
avsys_info(AVAUDIO, " samplerate = %d\n", param->samplerate);
- avsys_info(AVAUDIO, " route = %d (0: default, 1: handset)\n", param->bluetooth);
- avsys_info(AVAUDIO, " Vol type = %d\n", param->vol_type);
+ avsys_info(AVAUDIO, " route = %d (0: default, 1: handset)\n", param->handle_route);
+ avsys_info(AVAUDIO, " volume type= %d\n", vol_conf_type);
+ avsys_info(AVAUDIO, " volume gain= %d\n", vol_conf_gain);
avsys_info(AVAUDIO, "=============================================\n");
p->mode = param->mode;
@@ -650,11 +739,11 @@ static int __avsys_audio_set_info(avsys_audio_handle_t *p, avsys_audio_param_t *
p->format = param->format;
p->priority = param->priority;
- if ((param->vol_type < 0) || (param->vol_type >= AVSYS_AUDIO_VOLUME_TYPE_MAX)) {
- avsys_error(AVAUDIO, "[%s] Invalid volume type %d. use default system type\n", __func__, param->vol_type);
- p->gain_setting.vol_type = AVSYS_AUDIO_VOLUME_TYPE_SYSTEM;
+ if ((vol_conf_type < 0) || (vol_conf_type >= AVSYS_AUDIO_VOLUME_TYPE_MAX)) {
+ avsys_error(AVAUDIO, "[%s] Invalid volume type %d. use default system type\n", __func__, vol_conf_type);
+ p->gain_setting.volume_config = AVSYS_AUDIO_VOLUME_TYPE_SYSTEM;
} else {
- p->gain_setting.vol_type = param->vol_type;
+ p->gain_setting.volume_config = param->vol_type;
}
/* trivial volume value */
@@ -692,6 +781,12 @@ int avsys_audio_earjack_manager_deinit(int waitfd)
}
EXPORT_API
+int avsys_audio_earjack_manager_get_type(void)
+{
+ return avsys_audio_path_earjack_get_type();
+}
+
+EXPORT_API
int avsys_audio_earjack_manager_unlock(void)
{
return avsys_audio_path_earjack_unlock();
@@ -700,15 +795,15 @@ int avsys_audio_earjack_manager_unlock(void)
EXPORT_API
int avsys_audio_set_route_policy(avsys_audio_route_policy_t route)
{
- return avsys_audio_path_set_route_policy(route);
+ /* Deprecated */
+ return 0;
}
EXPORT_API
int avsys_audio_get_route_policy(avsys_audio_route_policy_t *route)
{
- if (route == NULL)
- return AVSYS_STATE_ERR_NULL_POINTER;
- return avsys_audio_path_get_route_policy(route);
+ /* Deprecated */
+ return 0;
}
EXPORT_API
@@ -724,17 +819,17 @@ static inline int __avsys_audio_validate_volume(const int type, const int value)
if (value < 0)
return -1;
switch (type) {
- case AVSYS_AUDIO_VOLUME_TYPE_ALARM:
case AVSYS_AUDIO_VOLUME_TYPE_CALL:
+ case AVSYS_AUDIO_VOLUME_TYPE_VOIP:
if (value >= LVOLUME_MAX_BASIC) {
return -1;
}
break;
+ case AVSYS_AUDIO_VOLUME_TYPE_ALARM:
case AVSYS_AUDIO_VOLUME_TYPE_RINGTONE:
case AVSYS_AUDIO_VOLUME_TYPE_NOTIFICATION:
case AVSYS_AUDIO_VOLUME_TYPE_SYSTEM:
case AVSYS_AUDIO_VOLUME_TYPE_MEDIA:
- case AVSYS_AUDIO_VOLUME_TYPE_MEDIA_HL:
case AVSYS_AUDIO_VOLUME_TYPE_EXT_SYSTEM_JAVA:
if (value >= LVOLUME_MAX_MULTIMEDIA) {
return -1;
@@ -778,6 +873,7 @@ EXPORT_API
int avsys_audio_hibernation_reset(int *vol)
{
int err = AVSYS_STATE_SUCCESS;
+
err = avsys_audio_path_ex_reset(1);
if (AVSYS_FAIL(err)) {
avsys_error(AVAUDIO, "avsys_audio_path_ex_reset(forced) failed 0x%x\n", err);
@@ -789,6 +885,7 @@ int avsys_audio_hibernation_reset(int *vol)
avsys_error(AVAUDIO, "avsys_audio_handle_reset() failed 0x%x\n", err);
return err;
}
+
return err;
}
@@ -856,38 +953,42 @@ int avsys_audio_get_period_buffer_time(avsys_handle_t handle, unsigned int *peri
}
EXPORT_API
-int avsys_audio_get_playing_device_info(avsys_audio_playing_devcie_t *dev)
+int avsys_audio_cork (avsys_handle_t handle, int cork)
{
int err = AVSYS_STATE_SUCCESS;
- int sink_info = 0;
- bool alsa_loud = false;
+ avsys_audio_handle_t *p = NULL;
- if (!dev)
- return AVSYS_STATE_ERR_INVALID_PARAMETER;
+ AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
- err = avsys_audio_pa_ctrl_get_default_sink(&sink_info);
- if (AVSYS_FAIL(err))
- return err;
+ err = avsys_audio_pasimple_cork(p, cork);
+ if(AVSYS_FAIL(err)) {
+ avsys_error(AVAUDIO, "avsys_audio_pasimple_cork() failed, 0x%X\n",err);
+ }
- switch (sink_info) {
- case AVSYS_AUDIO_PA_CTL_SINK_UNKNOWN:
- avsys_error_r(AVAUDIO, "Unexpected sink information\n");
- err = AVSYS_STATE_ERR_UNAVAILABLE_DEVICE;
- break;
- case AVSYS_AUDIO_PA_CTL_SINK_ALSA:
- err = avsys_audio_path_check_loud(&alsa_loud);
- if (AVSYS_FAIL(err))
- break;
- if (alsa_loud == true)
- *dev = AVSYS_AUDIO_ROUTE_DEVICE_HANDSET;
- else
- *dev = AVSYS_AUDIO_ROUTE_DEVICE_EARPHONE;
- break;
- case AVSYS_AUDIO_PA_CTL_SINK_BLUEZ:
- *dev = AVSYS_AUDIO_ROUTE_DEVICE_BLUETOOTH;
- break;
+ AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
+
+ return err;
+}
+
+EXPORT_API
+int avsys_audio_is_corked (avsys_handle_t handle, int *is_corked)
+{
+ int err = AVSYS_STATE_SUCCESS;
+ avsys_audio_handle_t *p = NULL;
+
+ if (is_corked == NULL) {
+ return AVSYS_STATE_ERR_NULL_POINTER;
+ }
+
+ AVSYS_GET_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
+
+ err = avsys_audio_pasimple_is_corked(p, is_corked);
+ if(AVSYS_FAIL(err)) {
+ avsys_error(AVAUDIO, "avsys_audio_pasimple_cork() failed, 0x%X\n",err);
}
+ AVSYS_RELEASE_HANDLE_PTR(HANDLE_PTR_MODE_NORMAL);
+
return err;
}