diff options
author | Scott Mertz <scott@cyngn.com> | 2015-02-05 20:19:10 -0800 |
---|---|---|
committer | Scott Mertz <scott@cyngn.com> | 2015-02-09 11:25:33 -0800 |
commit | 2a6f71ba120591e725780d72ddd70b6d1c240bf2 (patch) | |
tree | 1cba3106c727c4f90e75a69632b5c88cc034d92c | |
parent | ef36f6599e83172dd9e5faa00738ccc7ede38b77 (diff) | |
download | android_system_media-stable/cm-12.0-YNG1I.tar.gz android_system_media-stable/cm-12.0-YNG1I.tar.bz2 android_system_media-stable/cm-12.0-YNG1I.zip |
audio_route: Support BYTE type controlsstable/cm-12.0-YNG4Nstable/cm-12.0-YNG3Cstable/cm-12.0-YNG1TAstable/cm-12.0-YNG1Tstable/cm-12.0-YNG1Icm-12.0
- Offers limited support to set byte controls like you
would any control with an id, or even without.
Change-Id: I0ce97f3c8e8155c5330655072e504d1ee68177db
-rw-r--r-- | audio_route/audio_route.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/audio_route/audio_route.c b/audio_route/audio_route.c index c14cbf98..e5036923 100644 --- a/audio_route/audio_route.c +++ b/audio_route/audio_route.c @@ -83,6 +83,7 @@ static bool is_supported_ctl_type(enum mixer_ctl_type type) case MIXER_CTL_TYPE_BOOL: case MIXER_CTL_TYPE_INT: case MIXER_CTL_TYPE_ENUM: + case MIXER_CTL_TYPE_BYTE: return true; default: return false; @@ -186,6 +187,40 @@ static int find_ctl_index_in_path(struct mixer_path *path, return -1; } +static int get_byte_array(struct mixer_ctl *ctl, + int *value, unsigned int num_values) +{ + unsigned int i; + char *data = (char *)malloc(num_values); + + if (!data) + return -1; + + mixer_ctl_get_array(ctl, data, num_values); + for(i = 0; i < num_values; i++) + value[i] = data[i]; + + free(data); + return 0; +} + +static int set_byte_array(struct mixer_ctl *ctl, + int *value, unsigned int num_values) +{ + unsigned int i; + char *data = (char *)malloc(num_values); + + if (!data) + return -1; + + for (i = 0; i < num_values; i++) + data[i] = value[i]; + + mixer_ctl_set_array(ctl, data, num_values); + free(data); + return 0; +} + static int alloc_path_setting(struct mixer_path *path) { struct mixer_setting *new_path_setting; @@ -412,6 +447,13 @@ static void start_tag(void *data, const XML_Char *tag_name, case MIXER_CTL_TYPE_INT: value = (int) strtol((char *)attr_value, NULL, 0); break; + case MIXER_CTL_TYPE_BYTE: + value = (int) strtol((char *)attr_value, NULL, 0); + if (value < 0 || value > 255) { + ALOGE("Control '%s' only supports byte values", attr_name); + goto done; + } + break; case MIXER_CTL_TYPE_ENUM: value = mixer_enum_string_to_value(ctl, (char *)attr_value); break; @@ -506,6 +548,8 @@ static int alloc_mixer_state(struct audio_route *ar) if (type == MIXER_CTL_TYPE_ENUM) ar->mixer_state[i].old_value[0] = mixer_ctl_get_value(ctl, 0); + else if (type == MIXER_CTL_TYPE_BYTE) + get_byte_array(ctl, ar->mixer_state[i].old_value, num_values); else mixer_ctl_get_array(ctl, ar->mixer_state[i].old_value, num_values); memcpy(ar->mixer_state[i].new_value, ar->mixer_state[i].old_value, @@ -563,6 +607,8 @@ int audio_route_update_mixer(struct audio_route *ar) if (changed) { if (type == MIXER_CTL_TYPE_ENUM) mixer_ctl_set_value(ctl, 0, ar->mixer_state[i].new_value[0]); + else if (type == MIXER_CTL_TYPE_BYTE) + set_byte_array(ctl, ar->mixer_state[i].new_value, num_values); else mixer_ctl_set_array(ctl, ar->mixer_state[i].new_value, num_values); memcpy(ar->mixer_state[i].old_value, ar->mixer_state[i].new_value, @@ -690,6 +736,8 @@ static int audio_route_update_path(struct audio_route *ar, const char *name, boo if (ms->old_value[j] != ms->new_value[j]) { if (type == MIXER_CTL_TYPE_ENUM) mixer_ctl_set_value(ms->ctl, 0, ms->new_value[0]); + else if (type == MIXER_CTL_TYPE_BYTE) + set_byte_array(ms->ctl, ms->new_value, ms->num_values); else mixer_ctl_set_array(ms->ctl, ms->new_value, ms->num_values); memcpy(ms->old_value, ms->new_value, ms->num_values * sizeof(int)); |