Lines Matching +full:carry +full:- +full:less
1 // SPDX-License-Identifier: GPL-2.0
6 // Copyright (c) 2021-2 Arm Limited
29 #include "alsa-local.h"
70 card = -1;
83 err = snd_ctl_open_lconf(&card_data->handle, name, 0, config);
97 err = snd_ctl_card_info_malloc(&card_data->info);
102 err = snd_ctl_card_info(card_data->handle, card_data->info);
104 card_data->card_name = snd_ctl_card_info_get_id(card_data->info);
105 if (!card_data->card_name)
111 if (!card_data->card_name)
112 card_data->card_name = "Unknown";
114 ksft_print_msg("Card %d/%s - %s (%s)\n", card,
115 card_data->card_name, card_name, card_longname);
118 snd_ctl_elem_list_malloc(&card_data->ctls);
119 snd_ctl_elem_list(card_data->handle, card_data->ctls);
120 card_data->num_ctls = snd_ctl_elem_list_get_count(card_data->ctls);
123 snd_ctl_elem_list_alloc_space(card_data->ctls, card_data->num_ctls);
124 snd_ctl_elem_list(card_data->handle, card_data->ctls);
126 card_data->card = num_cards++;
127 card_data->next = card_list;
130 num_controls += card_data->num_ctls;
132 for (ctl = 0; ctl < card_data->num_ctls; ctl++) {
138 ctl_data->card = card_data;
139 ctl_data->elem = ctl;
140 ctl_data->name = snd_ctl_elem_list_get_name(card_data->ctls,
143 err = snd_ctl_elem_id_malloc(&ctl_data->id);
147 err = snd_ctl_elem_info_malloc(&ctl_data->info);
151 err = snd_ctl_elem_value_malloc(&ctl_data->def_val);
155 snd_ctl_elem_list_get_id(card_data->ctls, ctl,
156 ctl_data->id);
157 snd_ctl_elem_info_set_id(ctl_data->info, ctl_data->id);
158 err = snd_ctl_elem_info(card_data->handle,
159 ctl_data->info);
163 ctl_data->name);
166 snd_ctl_elem_value_set_id(ctl_data->def_val,
167 ctl_data->id);
169 ctl_data->next = ctl_list;
174 err = snd_ctl_subscribe_events(card_data->handle, true);
180 err = snd_ctl_poll_descriptors_count(card_data->handle);
186 err = snd_ctl_poll_descriptors(card_data->handle,
187 &card_data->pollfd, 1);
218 err = poll(&(ctl->card->pollfd), 1, timeout);
221 ctl->name, strerror(errno), errno);
222 return -1;
228 err = snd_ctl_poll_descriptors_revents(ctl->card->handle,
229 &(ctl->card->pollfd),
233 ctl->name, err);
238 ctl->name);
239 return -1;
247 err = snd_ctl_read(ctl->card->handle, event);
250 ctl->name, err);
257 /* The ID returned from the event is 1 less than numid */
260 if (ev_id != snd_ctl_elem_info_get_numid(ctl->info)) {
268 ctl->name);
269 return -1;
283 switch (snd_ctl_elem_info_get_type(ctl->info)) {
286 ctl->name, index);
297 ctl->name, index, int_val);
305 if (int_val < snd_ctl_elem_info_get_min(ctl->info)) {
306 ksft_print_msg("%s.%d value %ld less than minimum %ld\n",
307 ctl->name, index, int_val,
308 snd_ctl_elem_info_get_min(ctl->info));
312 if (int_val > snd_ctl_elem_info_get_max(ctl->info)) {
314 ctl->name, index, int_val,
315 snd_ctl_elem_info_get_max(ctl->info));
320 if (snd_ctl_elem_info_get_step(ctl->info) &&
321 (int_val - snd_ctl_elem_info_get_min(ctl->info) %
322 snd_ctl_elem_info_get_step(ctl->info))) {
324 ctl->name, index, int_val,
325 snd_ctl_elem_info_get_step(ctl->info),
326 snd_ctl_elem_info_get_min(ctl->info));
334 if (int64_val < snd_ctl_elem_info_get_min64(ctl->info)) {
335 ksft_print_msg("%s.%d value %lld less than minimum %lld\n",
336 ctl->name, index, int64_val,
337 snd_ctl_elem_info_get_min64(ctl->info));
341 if (int64_val > snd_ctl_elem_info_get_max64(ctl->info)) {
343 ctl->name, index, int64_val,
344 snd_ctl_elem_info_get_max(ctl->info));
349 if (snd_ctl_elem_info_get_step64(ctl->info) &&
350 (int64_val - snd_ctl_elem_info_get_min64(ctl->info)) %
351 snd_ctl_elem_info_get_step64(ctl->info)) {
353 ctl->name, index, int64_val,
354 snd_ctl_elem_info_get_step64(ctl->info),
355 snd_ctl_elem_info_get_min64(ctl->info));
365 ctl->name, index, int_val);
369 if (int_val >= snd_ctl_elem_info_get_items(ctl->info)) {
371 ctl->name, index, int_val,
372 snd_ctl_elem_info_get_items(ctl->info));
394 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++)
410 if (snd_ctl_elem_info_is_inactive(ctl->info)) {
411 ksft_print_msg("%s is inactive\n", ctl->name);
413 ctl->card->card_name, ctl->elem);
418 if (!snd_ctl_elem_info_is_readable(ctl->info)) {
419 ksft_print_msg("%s is not readable\n", ctl->name);
421 ctl->card->card_name, ctl->elem);
425 err = snd_ctl_elem_read(ctl->card->handle, ctl->def_val);
432 if (!ctl_value_valid(ctl, ctl->def_val))
433 err = -EINVAL;
437 ctl->card->card_name, ctl->elem);
447 return strcmp(haystack + haystack_len - needle_len, needle) == 0;
454 ksft_print_msg("%s.%d %s\n", ctl->card->card_name, ctl->elem,
455 ctl->name);
458 if (strend(ctl->name, " Switch")) {
459 if (snd_ctl_elem_info_get_type(ctl->info) != SND_CTL_ELEM_TYPE_BOOLEAN) {
461 ctl->card->card, ctl->elem, ctl->name);
467 if (snd_ctl_elem_info_get_type(ctl->info) == SND_CTL_ELEM_TYPE_BOOLEAN &&
468 snd_ctl_elem_info_is_writable(ctl->info)) {
469 if (!strend(ctl->name, " Switch")) {
471 ctl->card->card, ctl->elem, ctl->name);
477 ctl->card->card_name, ctl->elem);
486 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
487 switch (snd_ctl_elem_info_get_type(ctl->info)) {
517 ctl->name, i, orig_int, read_int,
518 snd_ctl_elem_info_is_volatile(ctl->info));
535 switch (snd_ctl_elem_info_get_type(ctl->info)) {
572 bool is_volatile = snd_ctl_elem_info_is_volatile(ctl->info);
574 ctl->name, index, expected_int, read_int, is_volatile);
613 if (snd_ctl_elem_info_is_readable(ctl->info)) {
614 snd_ctl_elem_value_set_id(initial_val, ctl->id);
616 err = snd_ctl_elem_read(ctl->card->handle, initial_val);
626 * and carry on to validate the expected value.
628 err = snd_ctl_elem_write(ctl->card->handle, w_val);
636 if (!snd_ctl_elem_info_is_readable(ctl->info))
639 snd_ctl_elem_value_set_id(read_val, ctl->id);
641 err = snd_ctl_elem_read(ctl->card->handle, read_val);
653 if (snd_ctl_elem_info_is_volatile(ctl->info)) {
656 ctl->name);
657 return -EINVAL;
674 ctl->name);
676 ctl->event_missing++;
681 ctl->name);
683 ctl->event_spurious++;
689 * carry on and try to provide a more useful diagnostic than
696 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++)
702 ctl->name);
704 return -1;
716 if (snd_ctl_elem_info_is_inactive(ctl->info)) {
717 ksft_print_msg("%s is inactive\n", ctl->name);
719 ctl->card->card_name, ctl->elem);
723 if (!snd_ctl_elem_info_is_writable(ctl->info)) {
724 ksft_print_msg("%s is not writeable\n", ctl->name);
726 ctl->card->card_name, ctl->elem);
731 if (!snd_ctl_elem_info_is_readable(ctl->info)) {
732 ksft_print_msg("%s couldn't read default\n", ctl->name);
734 ctl->card->card_name, ctl->elem);
738 err = write_and_verify(ctl, ctl->def_val, NULL);
741 ctl->card->card_name, ctl->elem);
751 snd_ctl_elem_value_set_id(val, ctl->id);
753 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
774 snd_ctl_elem_value_set_id(val, ctl->id);
776 step = snd_ctl_elem_info_get_step(ctl->info);
780 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
781 for (j = snd_ctl_elem_info_get_min(ctl->info);
782 j <= snd_ctl_elem_info_get_max(ctl->info); j += step) {
803 snd_ctl_elem_value_set_id(val, ctl->id);
805 step = snd_ctl_elem_info_get_step64(ctl->info);
809 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
810 for (j = snd_ctl_elem_info_get_min64(ctl->info);
811 j <= snd_ctl_elem_info_get_max64(ctl->info); j += step) {
830 snd_ctl_elem_value_set_id(val, ctl->id);
832 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
833 for (j = 0; j < snd_ctl_elem_info_get_items(ctl->info); j++) {
849 if (snd_ctl_elem_info_is_inactive(ctl->info)) {
850 ksft_print_msg("%s is inactive\n", ctl->name);
852 ctl->card->card_name, ctl->elem);
856 if (!snd_ctl_elem_info_is_writable(ctl->info)) {
857 ksft_print_msg("%s is not writeable\n", ctl->name);
859 ctl->card->card_name, ctl->elem);
863 switch (snd_ctl_elem_info_get_type(ctl->info)) {
883 ctl->card->card_name, ctl->elem);
888 write_and_verify(ctl, ctl->def_val, NULL);
891 ctl->card->card_name, ctl->elem);
900 err = snd_ctl_elem_write(ctl->card->handle, val);
905 err = snd_ctl_elem_read(ctl->card->handle, val);
908 ctl->name, snd_strerror(err));
922 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
923 snd_ctl_elem_value_copy(val, ctl->def_val);
940 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
941 if (snd_ctl_elem_info_get_min(ctl->info) != LONG_MIN) {
943 snd_ctl_elem_value_copy(val, ctl->def_val);
945 snd_ctl_elem_info_get_min(ctl->info) - 1);
951 snd_ctl_elem_value_copy(val, ctl->def_val);
958 if (snd_ctl_elem_info_get_max(ctl->info) != LONG_MAX) {
960 snd_ctl_elem_value_copy(val, ctl->def_val);
962 snd_ctl_elem_info_get_max(ctl->info) + 1);
968 snd_ctl_elem_value_copy(val, ctl->def_val);
986 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
987 if (snd_ctl_elem_info_get_min64(ctl->info) != LLONG_MIN) {
989 snd_ctl_elem_value_copy(val, ctl->def_val);
991 snd_ctl_elem_info_get_min64(ctl->info) - 1);
997 snd_ctl_elem_value_copy(val, ctl->def_val);
1004 if (snd_ctl_elem_info_get_max64(ctl->info) != LLONG_MAX) {
1006 snd_ctl_elem_value_copy(val, ctl->def_val);
1008 snd_ctl_elem_info_get_max64(ctl->info) + 1);
1014 snd_ctl_elem_value_copy(val, ctl->def_val);
1032 snd_ctl_elem_value_set_id(val, ctl->id);
1034 for (i = 0; i < snd_ctl_elem_info_get_count(ctl->info); i++) {
1036 snd_ctl_elem_value_copy(val, ctl->def_val);
1038 snd_ctl_elem_info_get_items(ctl->info));
1044 snd_ctl_elem_value_copy(val, ctl->def_val);
1061 if (snd_ctl_elem_info_is_inactive(ctl->info)) {
1062 ksft_print_msg("%s is inactive\n", ctl->name);
1064 ctl->card->card_name, ctl->elem);
1068 if (!snd_ctl_elem_info_is_writable(ctl->info)) {
1069 ksft_print_msg("%s is not writeable\n", ctl->name);
1071 ctl->card->card_name, ctl->elem);
1075 switch (snd_ctl_elem_info_get_type(ctl->info)) {
1095 ctl->card->card_name, ctl->elem);
1100 write_and_verify(ctl, ctl->def_val, NULL);
1103 ctl->card->card_name, ctl->elem);
1108 ksft_test_result(!ctl->event_missing, "event_missing.%s.%d\n",
1109 ctl->card->card_name, ctl->elem);
1114 ksft_test_result(!ctl->event_spurious, "event_spurious.%s.%d\n",
1115 ctl->card->card_name, ctl->elem);
1128 for (ctl = ctl_list; ctl != NULL; ctl = ctl->next) {