{
uint32_t device = 0;
- if (!strncmp(device_str,"builtin-speaker", MAX_NAME_LEN)) {
+ if (!strncmp(device_str, "builtin-speaker", MAX_NAME_LEN)) {
device = AUDIO_DEVICE_OUT_SPEAKER;
- } else if (!strncmp(device_str,"builtin-receiver", MAX_NAME_LEN)) {
+ } else if (!strncmp(device_str, "builtin-receiver", MAX_NAME_LEN)) {
device = AUDIO_DEVICE_OUT_RECEIVER;
- } else if ((!strncmp(device_str,"audio-jack", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_OUT)) {
+ } else if ((!strncmp(device_str, "audio-jack", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_OUT)) {
device = AUDIO_DEVICE_OUT_JACK;
- } else if ((!strncmp(device_str,"bt", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_OUT)) {
+ } else if ((!strncmp(device_str, "bt", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_OUT)) {
device = AUDIO_DEVICE_OUT_BT_SCO;
- } else if (!strncmp(device_str,"hdmi", MAX_NAME_LEN)) {
+ } else if (!strncmp(device_str, "hdmi", MAX_NAME_LEN)) {
device = AUDIO_DEVICE_OUT_HDMI;
- } else if ((!strncmp(device_str,"builtin-mic", MAX_NAME_LEN))) {
+ } else if ((!strncmp(device_str, "builtin-mic", MAX_NAME_LEN))) {
device = AUDIO_DEVICE_IN_MAIN_MIC;
/* To Do : SUB_MIC */
- } else if ((!strncmp(device_str,"audio-jack", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_IN)) {
+ } else if ((!strncmp(device_str, "audio-jack", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_IN)) {
device = AUDIO_DEVICE_IN_JACK;
- } else if ((!strncmp(device_str,"bt", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_IN)) {
+ } else if ((!strncmp(device_str, "bt", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_IN)) {
device = AUDIO_DEVICE_IN_BT_SCO;
} else {
device = AUDIO_DEVICE_NONE;
{
audio_return_t audio_ret = AUDIO_RET_OK;
const char *verb = NULL;
- const char *active_devices[MAX_DEVICES] = {NULL,};
verb = AUDIO_USE_CASE_VERB_HIFI;
AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
}
/* FIXME. If necessary, set VERB_VOIP */
ah->device.mode = VERB_NORMAL;
- if (active_devices == NULL) {
- AUDIO_LOG_ERROR("Failed to set device: active device is NULL");
- return AUDIO_ERR_PARAMETER;
- }
/* TO DO: Set modifiers */
return audio_ret;
ah = (audio_hal_t *)audio_handle;
mode = SND_PCM_NONBLOCK | SND_PCM_NO_AUTO_RESAMPLE | SND_PCM_NO_AUTO_CHANNELS | SND_PCM_NO_AUTO_FORMAT;
- if(direction == AUDIO_DIRECTION_OUT)
+ if (direction == AUDIO_DIRECTION_OUT)
device_name = PLAYBACK_PCM_DEVICE;
else if (direction == AUDIO_DIRECTION_IN)
device_name = CAPTURE_PCM_DEVICE;
}
/* Set sw params */
- if ((err = snd_pcm_sw_params_current(pcm_handle, swparams) < 0)) {
+ if ((err = snd_pcm_sw_params_current(pcm_handle, swparams)) < 0) {
AUDIO_LOG_ERROR("Unable to determine current swparams : %d", err);
return AUDIO_ERR_PARAMETER;
}
#define SND_USE_CASE_SET snd_use_case_set
#endif
+#define UCM_PREFIX_CURRENT ">>> UCM current"
+#define UCM_PREFIX_REQUESTED "> UCM requested"
+#define UCM_PREFIX_CHANGED "<<< UCM changed"
+
audio_return_t _audio_ucm_init(audio_hal_t *ah)
{
AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
void _audio_ucm_get_device_name(audio_hal_t *ah, const char *use_case, audio_direction_t direction, const char **value)
{
- char identifier[70] = {0};
+ char identifier[70] = { 0, };
AUDIO_RETURN_IF_FAIL(ah);
AUDIO_RETURN_IF_FAIL(ah->ucm.uc_mgr);
- if (direction == AUDIO_DIRECTION_IN) {
- sprintf(identifier, "CapturePCM//%s", use_case);
- } else {
- sprintf(identifier, "PlaybackPCM//%s", use_case);
- }
+ snprintf(identifier, sizeof(identifier), "%sPCM//%s",
+ (direction == AUDIO_DIRECTION_IN) ? "Capture" : "Playback", use_case);
+
snd_use_case_get(ah->ucm.uc_mgr, identifier, value);
}
if (strncmp(verb, AUDIO_USE_CASE_VERB_VOICECALL, strlen(AUDIO_USE_CASE_VERB_VOICECALL)) &&
strncmp(verb, AUDIO_USE_CASE_VERB_LOOPBACK, strlen(AUDIO_USE_CASE_VERB_LOOPBACK))) {
__add_ucm_device_info(ah, verb, AUDIO_DIRECTION_IN, device_info_list, &device_info_count);
- if(strncmp(verb, AUDIO_USE_CASE_VERB_FMRADIO, strlen(AUDIO_USE_CASE_VERB_FMRADIO))) {
+ if (strncmp(verb, AUDIO_USE_CASE_VERB_FMRADIO, strlen(AUDIO_USE_CASE_VERB_FMRADIO))) {
__add_ucm_device_info(ah, verb, AUDIO_DIRECTION_OUT, device_info_list, &device_info_count);
}
}
return device_info_count;
}
-static void __dump_use_case(const char *verb, const char *devices[], int dev_count, const char *modifiers[], int mod_count, char *dump)
+#define DUMP_LEN 512
+
+static void __dump_use_case(const char* prefix, const char *verb, const char *devices[], int dev_count, const char *modifiers[], int mod_count)
{
- int i, len;
+ int i;
+ dump_data_t* dump = NULL;
+
+ if (!(dump = dump_new(DUMP_LEN))) {
+ AUDIO_LOG_ERROR("Failed to create dump string...");
+ return;
+ }
- len = sprintf(dump, "Verb [ %s ] Devices [ ", verb ? verb : AUDIO_USE_CASE_VERB_INACTIVE);
- if (len > 0)
- dump += len;
+ /* Verb */
+ dump_add_str(dump, "Verb [ %s ] Devices [ ", verb ? verb : AUDIO_USE_CASE_VERB_INACTIVE);
- for (i = 0; i < dev_count; i++) {
- if (i != dev_count - 1) {
- len = sprintf(dump, "%s, ", devices[i]);
- } else {
- len = sprintf(dump, "%s", devices[i]);
+ /* Devices */
+ if (devices) {
+ for (i = 0; i < dev_count; i++) {
+ dump_add_str(dump, (i != dev_count - 1) ? "%s, " : "%s", devices[i]);
}
- if (len > 0)
- dump += len;
}
+ dump_add_str(dump, " ] Modifier [ ");
- len = sprintf(dump, " ] Modifier [ ");
- if (len > 0)
- dump += len;
-
- for (i = 0; i < mod_count; i++) {
- if (i != mod_count - 1) {
- len = sprintf(dump, "%s, ", modifiers[i]);
- } else {
- len = sprintf(dump, "%s", modifiers[i]);
+ /* Modifiers */
+ if (modifiers) {
+ for (i = 0; i < mod_count; i++) {
+ dump_add_str(dump, (i != mod_count - 1) ? "%s, " : "%s", modifiers[i]);
}
- if (len > 0)
- dump += len;
}
+ dump_add_str(dump, " ]");
- len = sprintf(dump, " ]");
- if (len > 0)
- dump += len;
+ AUDIO_LOG_INFO("TEST %s : %s", prefix, dump_get_str(dump));
- *dump = '\0';
+ dump_free(dump);
}
#ifdef ALSA_UCM_DEBUG_TIME
int dis_dev_count = 0, ena_dev_count = 0;
int dis_mod_count = 0, ena_mod_count = 0;
int i = 0, j = 0;
- char dump_str[512];
AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
AUDIO_RETURN_VAL_IF_FAIL(ah->ucm.uc_mgr, AUDIO_ERR_PARAMETER);
snd_use_case_get(ah->ucm.uc_mgr, "_verb", &old_verb);
old_dev_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enadevs", &old_dev_list);
old_mod_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enamods", &old_mod_list);
- __dump_use_case(old_verb, old_dev_list, old_dev_count, old_mod_list, old_mod_count, &dump_str[0]);
- AUDIO_LOG_INFO(">>> UCM current %s", dump_str);
+ __dump_use_case(UCM_PREFIX_CURRENT, old_verb, old_dev_list, old_dev_count, old_mod_list, old_mod_count);
if (devices) {
for (dev_count = 0; devices[dev_count]; dev_count++);
for (mod_count = 0; modifiers[mod_count]; mod_count++);
}
- __dump_use_case(verb, devices, dev_count, modifiers, mod_count, &dump_str[0]);
- AUDIO_LOG_INFO("> UCM requested %s", dump_str);
+ __dump_use_case(UCM_PREFIX_REQUESTED, verb, devices, dev_count, modifiers, mod_count);
if (old_verb && streq(verb, old_verb)) {
AUDIO_LOG_DEBUG("current verb and new verb is same. No need to change verb, disable devices explicitely");
/* enable devices */
for (i = 0; i < dev_count; i++) {
AUDIO_LOG_DEBUG("Enable device : %s", devices[i]);
- if(snd_use_case_set(ah->ucm.uc_mgr, "_enadev", devices[i]) < 0)
+ if (snd_use_case_set(ah->ucm.uc_mgr, "_enadev", devices[i]) < 0)
AUDIO_LOG_ERROR("Enable %s device failed", devices[i]);
}
/* enable modifiers */
for (i = 0; i < mod_count; i++) {
AUDIO_LOG_DEBUG("Enable modifier : %s", modifiers[i]);
- if(snd_use_case_set(ah->ucm.uc_mgr, "_enamod", modifiers[i]) < 0)
+ if (snd_use_case_set(ah->ucm.uc_mgr, "_enamod", modifiers[i]) < 0)
AUDIO_LOG_ERROR("Enable %s modifier failed", modifiers[i]);
}
}
snd_use_case_get(ah->ucm.uc_mgr, "_verb", &new_verb);
new_dev_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enadevs", &new_dev_list);
new_mod_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enamods", &new_mod_list);
- __dump_use_case(new_verb, new_dev_list, new_dev_count, new_mod_list, new_mod_count, &dump_str[0]);
- AUDIO_LOG_INFO("<<< UCM changed %s", dump_str);
+ __dump_use_case(UCM_PREFIX_CHANGED, new_verb, new_dev_list, new_dev_count, new_mod_list, new_mod_count);
if (new_verb)
free((void *)new_verb);
const char **dis_dev_list = NULL, **ena_dev_list = NULL;
int dis_dev_count = 0, ena_dev_count = 0;
int i = 0, j = 0;
- char dump_str[512];
AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
AUDIO_RETURN_VAL_IF_FAIL(ah->ucm.uc_mgr, AUDIO_ERR_PARAMETER);
snd_use_case_get(ah->ucm.uc_mgr, "_verb", &old_verb);
old_dev_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enadevs", &old_dev_list);
- __dump_use_case(old_verb, old_dev_list, old_dev_count, NULL, 0, &dump_str[0]);
- AUDIO_LOG_INFO(">>> UCM current %s", dump_str);
+ __dump_use_case(UCM_PREFIX_CURRENT, old_verb, old_dev_list, old_dev_count, NULL, 0);
if (devices) {
for (dev_count = 0; devices[dev_count]; dev_count++);
}
- __dump_use_case(verb, devices, dev_count, NULL, 0, &dump_str[0]);
- AUDIO_LOG_INFO("> UCM requested %s", dump_str);
+ __dump_use_case(UCM_PREFIX_REQUESTED, verb, devices, dev_count, NULL, 0);
if (old_verb && streq(verb, old_verb)) {
AUDIO_LOG_DEBUG("current verb and new verb is same. No need to change verb, disable devices explicitely");
/* enable devices */
for (i = 0; i < dev_count; i++) {
AUDIO_LOG_DEBUG("Enable device : %s", devices[i]);
- if(snd_use_case_set(ah->ucm.uc_mgr, "_enadev", devices[i]) < 0)
+ if (snd_use_case_set(ah->ucm.uc_mgr, "_enadev", devices[i]) < 0)
AUDIO_LOG_ERROR("Enable %s device failed", devices[i]);
}
}
snd_use_case_get(ah->ucm.uc_mgr, "_verb", &new_verb);
new_dev_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enadevs", &new_dev_list);
- __dump_use_case(new_verb, new_dev_list, new_dev_count, NULL, 0, &dump_str[0]);
- AUDIO_LOG_INFO("<<< UCM changed %s", dump_str);
+ __dump_use_case(UCM_PREFIX_CHANGED, new_verb, new_dev_list, new_dev_count, NULL, 0);
if (new_verb)
free((void *)new_verb);
const char **dis_mod_list = NULL, **ena_mod_list = NULL;
int dis_mod_count = 0, ena_mod_count = 0;
int i = 0, j = 0;
- char dump_str[512];
AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
AUDIO_RETURN_VAL_IF_FAIL(ah->ucm.uc_mgr, AUDIO_ERR_PARAMETER);
snd_use_case_get(ah->ucm.uc_mgr, "_verb", &old_verb);
old_mod_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enamods", &old_mod_list);
- __dump_use_case(old_verb, NULL, 0, old_mod_list, old_mod_count, &dump_str[0]);
- AUDIO_LOG_INFO(">>> UCM current %s", dump_str);
+ __dump_use_case(UCM_PREFIX_CURRENT, old_verb, NULL, 0, old_mod_list, old_mod_count);
if (modifiers) {
for (mod_count = 0; modifiers[mod_count]; mod_count++);
}
- __dump_use_case(verb, NULL, 0, modifiers, mod_count, &dump_str[0]);
- AUDIO_LOG_INFO("> UCM requested %s", dump_str);
+ __dump_use_case(UCM_PREFIX_REQUESTED, verb, NULL, 0, modifiers, mod_count);
if (old_verb && streq(verb, old_verb)) {
AUDIO_LOG_DEBUG("current verb and new verb is same. No need to change verb, disable devices explicitely");
/* enable modifiers */
for (i = 0; i < mod_count; i++) {
AUDIO_LOG_DEBUG("Enable modifier : %s", modifiers[i]);
- if(snd_use_case_set(ah->ucm.uc_mgr, "_enamod", modifiers[i]) < 0)
+ if (snd_use_case_set(ah->ucm.uc_mgr, "_enamod", modifiers[i]) < 0)
AUDIO_LOG_ERROR("Enable %s modifier failed", modifiers[i]);
}
}
snd_use_case_get(ah->ucm.uc_mgr, "_verb", &new_verb);
new_mod_count = snd_use_case_get_list(ah->ucm.uc_mgr, "_enamods", &new_mod_list);
- __dump_use_case(new_verb, NULL, 0, new_mod_list, new_mod_count, &dump_str[0]);
- AUDIO_LOG_INFO("<<< UCM changed %s", dump_str);
+ __dump_use_case(UCM_PREFIX_CHANGED, new_verb, NULL, 0, new_mod_list, new_mod_count);
if (new_verb)
free((void *)new_verb);
ret = snd_ctl_open(&handle, ALSA_DEFAULT_CARD, 0);
if (ret < 0) {
- AUDIO_LOG_ERROR ("snd_ctl_open error, %s\n", snd_strerror(ret));
+ AUDIO_LOG_ERROR("snd_ctl_open error, %s\n", snd_strerror(ret));
pthread_mutex_unlock(&(ah->mixer.mutex));
return AUDIO_ERR_IOCTL;
}
snd_ctl_elem_id_set_name(id, ctl_name);
snd_ctl_elem_info_set_id(info, id);
- if(snd_ctl_elem_info(handle, info) < 0 ) {
- AUDIO_LOG_ERROR ("Cannot find control element: %s\n", ctl_name);
+ if (snd_ctl_elem_info(handle, info) < 0) {
+ AUDIO_LOG_ERROR("Cannot find control element: %s\n", ctl_name);
goto close;
}
snd_ctl_elem_info_get_id(info, id);
snd_ctl_elem_value_set_id(control, id);
- if(snd_ctl_elem_read(handle, control) < 0) {
- AUDIO_LOG_ERROR ("snd_ctl_elem_read failed \n");
+ if (snd_ctl_elem_read(handle, control) < 0) {
+ AUDIO_LOG_ERROR("snd_ctl_elem_read failed \n");
goto close;
}
*val = snd_ctl_elem_value_get_enumerated(control, i);
break;
default:
- AUDIO_LOG_WARN ("unsupported control element type\n");
+ AUDIO_LOG_WARN("unsupported control element type\n");
goto close;
}
return AUDIO_RET_OK;
close:
- AUDIO_LOG_ERROR ("Error\n");
+ AUDIO_LOG_ERROR("Error\n");
snd_ctl_close(handle);
pthread_mutex_unlock(&(ah->mixer.mutex));
return AUDIO_ERR_UNDEFINED;
snd_ctl_elem_id_set_name(id, ctl_name);
snd_ctl_elem_info_set_id(info, id);
- if(snd_ctl_elem_info(handle, info) < 0 ) {
+ if (snd_ctl_elem_info(handle, info) < 0) {
AUDIO_LOG_ERROR("Cannot find control element: %s", ctl_name);
goto close;
}
break;
case SND_CTL_ELEM_TYPE_INTEGER:
for (i = 0; i < count; i++)
- snd_ctl_elem_value_set_integer(control, i,val);
+ snd_ctl_elem_value_set_integer(control, i, val);
break;
case SND_CTL_ELEM_TYPE_ENUMERATED:
for (i = 0; i < count; i++)
- snd_ctl_elem_value_set_enumerated(control, i,val);
+ snd_ctl_elem_value_set_enumerated(control, i, val);
break;
default:
snd_pcm_hw_params_alloca(&hwparams);
/* Fill it in with default values. */
- if(snd_pcm_hw_params_any(pcm, hwparams) < 0) {
+ if (snd_pcm_hw_params_any(pcm, hwparams) < 0) {
AUDIO_LOG_ERROR("snd_pcm_hw_params_any() : failed! - %s\n", snd_strerror(err));
goto error;
}
snd_pcm_sw_params_alloca(&swparams);
- if ((err = snd_pcm_sw_params_current(pcm, swparams) < 0)) {
+ if ((err = snd_pcm_sw_params_current(pcm, swparams)) < 0) {
AUDIO_LOG_WARN("Unable to determine current swparams: %s\n", snd_strerror(err));
goto error;
}
error:
return err;
}
+
+/* ------ dump helper -------- */
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
+dump_data_t* dump_new(int length)
+{
+ dump_data_t* dump = NULL;
+
+ if ((dump = malloc(sizeof(dump_data_t)))) {
+ memset(dump, 0, sizeof(dump_data_t));
+ if ((dump->strbuf = malloc(length))) {
+ dump->p = &dump->strbuf[0];
+ dump->left = length;
+ } else {
+ free(dump);
+ dump = NULL;
+ }
+ }
+
+ return dump;
+}
+
+void dump_add_str(dump_data_t *dump, const char *fmt, ...)
+{
+ int len;
+ va_list ap;
+
+ if (!dump)
+ return;
+
+ va_start(ap, fmt);
+ len = vsnprintf(dump->p, dump->left, fmt, ap);
+ va_end(ap);
+
+ dump->p += MAX(0, len);
+ dump->left -= MAX(0, len);
+}
+
+char* dump_get_str(dump_data_t *dump)
+{
+ return (dump) ? dump->strbuf : NULL;
+}
+
+void dump_free(dump_data_t *dump)
+{
+ if (dump) {
+ if (dump->strbuf)
+ free(dump->strbuf);
+ free(dump);
+ }
+}
+/* ------ dump helper -------- */
"file/private/sound/volume/voice", /* AUDIO_VOLUME_TYPE_VOICE */
};
-static const char *__get_volume_type_string_by_idx (uint32_t vol_type_idx)
+static const char *__get_volume_type_string_by_idx(uint32_t vol_type_idx)
{
switch (vol_type_idx) {
case AUDIO_VOLUME_TYPE_SYSTEM: return "system";
}
}
-static uint32_t __get_volume_idx_by_string_type (const char *vol_type)
+static uint32_t __get_volume_idx_by_string_type(const char *vol_type)
{
if (!strncmp(vol_type, "system", strlen(vol_type)) || !strncmp(vol_type, "0", strlen(vol_type)))
return AUDIO_VOLUME_TYPE_SYSTEM;
return AUDIO_VOLUME_TYPE_MEDIA;
}
-static const char *__get_gain_type_string_by_idx (uint32_t gain_type_idx)
+static const char *__get_gain_type_string_by_idx(uint32_t gain_type_idx)
{
switch (gain_type_idx) {
case AUDIO_GAIN_TYPE_DEFAULT: return "default";
}
}
-static void __dump_tb (audio_hal_t *ah)
+static void __dump_tb(audio_hal_t *ah)
{
audio_volume_value_table_t *volume_value_table = ah->volume.volume_value_table;
uint32_t vol_type_idx, vol_level_idx, gain_type_idx;
}
-static audio_return_t __load_volume_value_table_from_ini (audio_hal_t *ah)
+static audio_return_t __load_volume_value_table_from_ini(audio_hal_t *ah)
{
dictionary * dict = NULL;
uint32_t vol_type_idx, vol_level_idx, gain_type_idx;
while (token) {
/* convert dB volume to linear volume */
double vol_value = 0.0f;
- if(strncmp(token, "0", strlen(token)))
+ if (strncmp(token, "0", strlen(token)))
vol_value = pow(10.0, (atof(token) - 100) / 20.0);
volume_value_table->volume[vol_type_idx][volume_value_table->volume_level_max[vol_type_idx]++] = vol_value;
token = strtok_r(NULL, delimiter, &ptr);
return AUDIO_RET_OK;
}
-audio_return_t _audio_volume_init (audio_hal_t *ah)
+audio_return_t _audio_volume_init(audio_hal_t *ah)
{
int i;
int val = 0;
for (i = 0; i < AUDIO_VOLUME_TYPE_MAX; i++) {
/* Get volume value string from VCONF */
- if(vconf_get_int(g_volume_vconf[i], &val) < 0) {
+ if (vconf_get_int(g_volume_vconf[i], &val) < 0) {
AUDIO_LOG_ERROR("vconf_get_int(%s) failed", g_volume_vconf[i]);
continue;
}
}
audio_ret = __load_volume_value_table_from_ini(ah);
- if(audio_ret != AUDIO_RET_OK) {
+ if (audio_ret != AUDIO_RET_OK) {
AUDIO_LOG_ERROR("gain table load error");
return AUDIO_ERR_UNDEFINED;
}
return audio_ret;
}
-audio_return_t _audio_volume_deinit (audio_hal_t *ah)
+audio_return_t _audio_volume_deinit(audio_hal_t *ah)
{
AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);