Lines Matching refs:ar
95 struct audio_route *ar; member
134 static inline struct mixer_ctl *index_to_ctl(struct audio_route *ar, in index_to_ctl() argument
137 return ar->mixer_state[ctl_index].ctl; in index_to_ctl()
141 static void path_print(struct audio_route *ar, struct mixer_path *path)
148 struct mixer_ctl *ctl = index_to_ctl(ar, path->setting[i].ctl_index);
165 static void path_free(struct audio_route *ar) in path_free() argument
169 for (i = 0; i < ar->num_mixer_paths; i++) { in path_free()
170 free(ar->mixer_path[i].name); in path_free()
171 if (ar->mixer_path[i].setting) { in path_free()
173 for (j = 0; j < ar->mixer_path[i].length; j++) { in path_free()
174 free(ar->mixer_path[i].setting[j].value.ptr); in path_free()
176 free(ar->mixer_path[i].setting); in path_free()
177 ar->mixer_path[i].size = 0; in path_free()
178 ar->mixer_path[i].length = 0; in path_free()
179 ar->mixer_path[i].setting = NULL; in path_free()
182 free(ar->mixer_path); in path_free()
183 ar->mixer_path = NULL; in path_free()
184 ar->mixer_path_size = 0; in path_free()
185 ar->num_mixer_paths = 0; in path_free()
188 static struct mixer_path *path_get_by_name(struct audio_route *ar, in path_get_by_name() argument
193 for (i = 0; i < ar->num_mixer_paths; i++) in path_get_by_name()
194 if (strcmp(ar->mixer_path[i].name, name) == 0) in path_get_by_name()
195 return &ar->mixer_path[i]; in path_get_by_name()
200 static struct mixer_path *path_create(struct audio_route *ar, const char *name) in path_create() argument
204 if (path_get_by_name(ar, name)) { in path_create()
210 if (ar->mixer_path_size <= ar->num_mixer_paths) { in path_create()
211 if (ar->mixer_path_size == 0) in path_create()
212 ar->mixer_path_size = INITIAL_MIXER_PATH_SIZE; in path_create()
214 ar->mixer_path_size *= 2; in path_create()
216 new_mixer_path = realloc(ar->mixer_path, ar->mixer_path_size * in path_create()
222 ar->mixer_path = new_mixer_path; in path_create()
227 ar->mixer_path[ar->num_mixer_paths].name = strdup(name); in path_create()
228 ar->mixer_path[ar->num_mixer_paths].size = 0; in path_create()
229 ar->mixer_path[ar->num_mixer_paths].length = 0; in path_create()
230 ar->mixer_path[ar->num_mixer_paths].setting = NULL; in path_create()
233 return &ar->mixer_path[ar->num_mixer_paths++]; in path_create()
276 static int path_add_setting(struct audio_route *ar, struct mixer_path *path, in path_add_setting() argument
282 struct mixer_ctl *ctl = index_to_ctl(ar, setting->ctl_index); in path_add_setting()
312 static int path_add_value(struct audio_route *ar, struct mixer_path *path, in path_add_value() argument
321 ctl = index_to_ctl(ar, mixer_value->ctl_index); in path_add_value()
385 static int path_add_path(struct audio_route *ar, struct mixer_path *path, in path_add_path() argument
391 if (path_add_setting(ar, path, &sub_path->setting[i]) < 0) in path_add_path()
397 static int path_apply(struct audio_route *ar, struct mixer_path *path) in path_apply() argument
407 ctl = index_to_ctl(ar, ctl_index); in path_apply()
412 memcpy(ar->mixer_state[ctl_index].new_value.ptr, path->setting[i].value.ptr, in path_apply()
419 static int path_reset(struct audio_route *ar, struct mixer_path *path) in path_reset() argument
429 ctl = index_to_ctl(ar, ctl_index); in path_reset()
435 memcpy(ar->mixer_state[ctl_index].new_value.ptr, in path_reset()
436 ar->mixer_state[ctl_index].reset_value.ptr, in path_reset()
437 ar->mixer_state[ctl_index].num_values * value_sz); in path_reset()
475 struct audio_route *ar = state->ar; in start_tag() local
502 state->path = path_create(ar, (char *)attr_name); in start_tag()
507 struct mixer_path *sub_path = path_get_by_name(ar, attr_name); in start_tag()
511 path_add_path(ar, state->path, sub_path); in start_tag()
517 ctl = mixer_get_ctl_by_name(ar->mixer, attr_name); in start_tag()
577 for (ctl_index = 0; ctl_index < ar->num_mixer_ctls; ctl_index++) { in start_tag()
578 if (ar->mixer_state[ctl_index].ctl == ctl) in start_tag()
591 if (id < ar->mixer_state[ctl_index].num_values) in start_tag()
593 ar->mixer_state[ctl_index].new_value.bytes[id] = value_array[0]; in start_tag()
595 ar->mixer_state[ctl_index].new_value.integer[id] = value_array[0]; in start_tag()
597 ar->mixer_state[ctl_index].new_value.enumerated[id] = value; in start_tag()
599 ar->mixer_state[ctl_index].new_value.integer[id] = value; in start_tag()
605 for (i = 0; i < ar->mixer_state[ctl_index].num_values; i++) in start_tag()
607 ar->mixer_state[ctl_index].new_value.bytes[i] = value_array[i]; in start_tag()
609 ar->mixer_state[ctl_index].new_value.integer[i] = value_array[i]; in start_tag()
611 ar->mixer_state[ctl_index].new_value.enumerated[i] = value; in start_tag()
613 ar->mixer_state[ctl_index].new_value.integer[i] = value; in start_tag()
631 path_add_value(ar, state->path, &mixer_value); in start_tag()
648 static int alloc_mixer_state(struct audio_route *ar) in alloc_mixer_state() argument
655 ar->num_mixer_ctls = mixer_get_num_ctls(ar->mixer); in alloc_mixer_state()
656 ar->mixer_state = calloc(ar->num_mixer_ctls, sizeof(struct mixer_state)); in alloc_mixer_state()
657 if (!ar->mixer_state) in alloc_mixer_state()
660 for (i = 0; i < ar->num_mixer_ctls; i++) { in alloc_mixer_state()
661 ctl = mixer_get_ctl(ar->mixer, i); in alloc_mixer_state()
664 ar->mixer_state[i].ctl = ctl; in alloc_mixer_state()
665 ar->mixer_state[i].num_values = num_values; in alloc_mixer_state()
666 ar->mixer_state[i].active_count = 0; in alloc_mixer_state()
675 ar->mixer_state[i].old_value.ptr = calloc(num_values, value_sz); in alloc_mixer_state()
676 ar->mixer_state[i].new_value.ptr = calloc(num_values, value_sz); in alloc_mixer_state()
677 ar->mixer_state[i].reset_value.ptr = calloc(num_values, value_sz); in alloc_mixer_state()
680 ar->mixer_state[i].old_value.enumerated[0] = mixer_ctl_get_value(ctl, 0); in alloc_mixer_state()
682 mixer_ctl_get_array(ctl, ar->mixer_state[i].old_value.ptr, num_values); in alloc_mixer_state()
684 memcpy(ar->mixer_state[i].new_value.ptr, ar->mixer_state[i].old_value.ptr, in alloc_mixer_state()
691 static void free_mixer_state(struct audio_route *ar) in free_mixer_state() argument
696 for (i = 0; i < ar->num_mixer_ctls; i++) { in free_mixer_state()
697 type = mixer_ctl_get_type(ar->mixer_state[i].ctl); in free_mixer_state()
701 free(ar->mixer_state[i].old_value.ptr); in free_mixer_state()
702 free(ar->mixer_state[i].new_value.ptr); in free_mixer_state()
703 free(ar->mixer_state[i].reset_value.ptr); in free_mixer_state()
706 free(ar->mixer_state); in free_mixer_state()
707 ar->mixer_state = NULL; in free_mixer_state()
711 int audio_route_update_mixer(struct audio_route *ar) in audio_route_update_mixer() argument
717 for (i = 0; i < ar->num_mixer_ctls; i++) { in audio_route_update_mixer()
718 unsigned int num_values = ar->mixer_state[i].num_values; in audio_route_update_mixer()
721 ctl = ar->mixer_state[i].ctl; in audio_route_update_mixer()
732 … if (ar->mixer_state[i].old_value.bytes[j] != ar->mixer_state[i].new_value.bytes[j]) { in audio_route_update_mixer()
739 if (ar->mixer_state[i].old_value.enumerated[j] in audio_route_update_mixer()
740 != ar->mixer_state[i].new_value.enumerated[j]) { in audio_route_update_mixer()
747 … if (ar->mixer_state[i].old_value.integer[j] != ar->mixer_state[i].new_value.integer[j]) { in audio_route_update_mixer()
755 mixer_ctl_set_value(ctl, 0, ar->mixer_state[i].new_value.enumerated[0]); in audio_route_update_mixer()
757 mixer_ctl_set_array(ctl, ar->mixer_state[i].new_value.ptr, num_values); in audio_route_update_mixer()
760 memcpy(ar->mixer_state[i].old_value.ptr, ar->mixer_state[i].new_value.ptr, in audio_route_update_mixer()
769 static void save_mixer_state(struct audio_route *ar) in save_mixer_state() argument
774 for (i = 0; i < ar->num_mixer_ctls; i++) { in save_mixer_state()
775 type = mixer_ctl_get_type(ar->mixer_state[i].ctl); in save_mixer_state()
780 memcpy(ar->mixer_state[i].reset_value.ptr, ar->mixer_state[i].new_value.ptr, in save_mixer_state()
781 ar->mixer_state[i].num_values * value_sz); in save_mixer_state()
786 void audio_route_reset(struct audio_route *ar) in audio_route_reset() argument
792 for (i = 0; i < ar->num_mixer_ctls; i++) { in audio_route_reset()
793 type = mixer_ctl_get_type(ar->mixer_state[i].ctl); in audio_route_reset()
798 memcpy(ar->mixer_state[i].new_value.ptr, ar->mixer_state[i].reset_value.ptr, in audio_route_reset()
799 ar->mixer_state[i].num_values * value_sz); in audio_route_reset()
804 int audio_route_apply_path(struct audio_route *ar, const char *name) in audio_route_apply_path() argument
808 if (!ar) { in audio_route_apply_path()
813 path = path_get_by_name(ar, name); in audio_route_apply_path()
819 path_apply(ar, path); in audio_route_apply_path()
825 int audio_route_reset_path(struct audio_route *ar, const char *name) in audio_route_reset_path() argument
829 if (!ar) { in audio_route_reset_path()
834 path = path_get_by_name(ar, name); in audio_route_reset_path()
840 path_reset(ar, path); in audio_route_reset_path()
849 static int audio_route_update_path(struct audio_route *ar, const char *name, int direction) in audio_route_update_path() argument
856 if (!ar) { in audio_route_update_path()
861 path = path_get_by_name(ar, name); in audio_route_update_path()
873 struct mixer_state * ms = &ar->mixer_state[ctl_index]; in audio_route_update_path()
939 int audio_route_apply_and_update_path(struct audio_route *ar, const char *name) in audio_route_apply_and_update_path() argument
941 if (audio_route_apply_path(ar, name) < 0) { in audio_route_apply_and_update_path()
944 return audio_route_update_path(ar, name, DIRECTION_FORWARD); in audio_route_apply_and_update_path()
947 int audio_route_reset_and_update_path(struct audio_route *ar, const char *name) in audio_route_reset_and_update_path() argument
949 if (audio_route_reset_path(ar, name) < 0) { in audio_route_reset_and_update_path()
952 return audio_route_update_path(ar, name, DIRECTION_REVERSE); in audio_route_reset_and_update_path()
955 int audio_route_force_reset_and_update_path(struct audio_route *ar, const char *name) in audio_route_force_reset_and_update_path() argument
957 if (audio_route_reset_path(ar, name) < 0) { in audio_route_force_reset_and_update_path()
961 return audio_route_update_path(ar, name, DIRECTION_REVERSE_RESET); in audio_route_force_reset_and_update_path()
971 struct audio_route *ar; in audio_route_init() local
973 ar = calloc(1, sizeof(struct audio_route)); in audio_route_init()
974 if (!ar) in audio_route_init()
977 ar->mixer = mixer_open(card); in audio_route_init()
978 if (!ar->mixer) { in audio_route_init()
983 ar->mixer_path = NULL; in audio_route_init()
984 ar->mixer_path_size = 0; in audio_route_init()
985 ar->num_mixer_paths = 0; in audio_route_init()
988 if (alloc_mixer_state(ar) < 0) in audio_route_init()
1009 state.ar = ar; in audio_route_init()
1034 audio_route_update_mixer(ar); in audio_route_init()
1035 save_mixer_state(ar); in audio_route_init()
1039 return ar; in audio_route_init()
1042 path_free(ar); in audio_route_init()
1047 free_mixer_state(ar); in audio_route_init()
1049 mixer_close(ar->mixer); in audio_route_init()
1051 free(ar); in audio_route_init()
1052 ar = NULL; in audio_route_init()
1057 void audio_route_free(struct audio_route *ar) in audio_route_free() argument
1059 free_mixer_state(ar); in audio_route_free()
1060 mixer_close(ar->mixer); in audio_route_free()
1061 path_free(ar); in audio_route_free()
1062 free(ar); in audio_route_free()