static int path_add_setting(struct audio_route *ar, struct mixer_path *path, struct mixer_setting *setting) { int path_index; if (find_ctl_index_in_path(path, setting->ctl_index) != -1) { struct mixer_ctl *ctl = index_to_ctl(ar, setting->ctl_index); ALOGE("Control '%s' already exists in path '%s'", mixer_ctl_get_name(ctl), path->name); return -1; } path_index = alloc_path_setting(path); if (path_index < 0) return -1; path->setting[path_index].ctl_index = setting->ctl_index; path->setting[path_index].num_values = setting->num_values; path->setting[path_index].value = malloc(setting->num_values * sizeof(int)); /* copy all values */ memcpy(path->setting[path_index].value, setting->value, setting->num_values * sizeof(int)); return 0; }
static void path_print(struct audio_route *ar, struct mixer_path *path) { unsigned int i; unsigned int j; ALOGE("Path: %s, length: %d", path->name, path->length); for (i = 0; i < path->length; i++) { struct mixer_ctl *ctl = index_to_ctl(ar, path->setting[i].ctl_index); ALOGE(" id=%d: ctl=%s", i, mixer_ctl_get_name(ctl)); for (j = 0; j < path->setting[i].num_values; j++) ALOGE(" id=%d value=%d", j, path->setting[i].value[j]); } }
static int path_add_value(struct audio_route *ar, struct mixer_path *path, struct mixer_value *mixer_value) { unsigned int i; int path_index; unsigned int num_values; struct mixer_ctl *ctl; /* Check that mixer value index is within range */ ctl = index_to_ctl(ar, mixer_value->ctl_index); num_values = mixer_ctl_get_num_values(ctl); if (mixer_value->index >= (int)num_values) { ALOGE("mixer index %d is out of range for '%s'", mixer_value->index, mixer_ctl_get_name(ctl)); return -1; } path_index = find_ctl_index_in_path(path, mixer_value->ctl_index); if (path_index < 0) { /* New path */ path_index = alloc_path_setting(path); if (path_index < 0) return -1; /* initialise the new path setting */ path->setting[path_index].ctl_index = mixer_value->ctl_index; path->setting[path_index].num_values = num_values; path->setting[path_index].value = malloc(num_values * sizeof(int)); path->setting[path_index].value[0] = mixer_value->value; } if (mixer_value->index == -1) { /* set all values the same */ for (i = 0; i < num_values; i++) path->setting[path_index].value[i] = mixer_value->value; } else { /* set only one value */ path->setting[path_index].value[mixer_value->index] = mixer_value->value; } return 0; }
static int path_apply(struct audio_route *ar, struct mixer_path *path) { unsigned int i; unsigned int ctl_index; struct mixer_ctl *ctl; enum mixer_ctl_type type; for (i = 0; i < path->length; i++) { ctl_index = path->setting[i].ctl_index; ctl = index_to_ctl(ar, ctl_index); type = mixer_ctl_get_type(ctl); if (!is_supported_ctl_type(type)) continue; /* apply the new value(s) */ memcpy(ar->mixer_state[ctl_index].new_value, path->setting[i].value, path->setting[i].num_values * sizeof(int)); } return 0; }