Lines Matching refs:uc_mgr
47 static int get_value(snd_use_case_mgr_t *uc_mgr,
53 static int get_value1(snd_use_case_mgr_t *uc_mgr, char **value,
55 static int get_value3(snd_use_case_mgr_t *uc_mgr,
62 static int execute_sequence(snd_use_case_mgr_t *uc_mgr,
69 static int execute_component_seq(snd_use_case_mgr_t *uc_mgr,
77 find_device(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
592 static int execute_cfgsave(snd_use_case_mgr_t *uc_mgr, const char *filename)
594 snd_config_t *config = uc_mgr->local_config;
642 static int rewrite_device_value(snd_use_case_mgr_t *uc_mgr, const char *name, char **value)
656 if (!uc_mgr_has_local_config(uc_mgr))
668 snprintf(sval, l, "_ucm%04X.%s", uc_mgr->ucm_card_number, *value);
676 static int run_device_sequence(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
686 device = find_device(uc_mgr, verb, name, 0);
692 return execute_sequence(uc_mgr, verb,
696 &uc_mgr->value_list);
699 static int run_device_all_sequence(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb)
713 err = execute_sequence(uc_mgr, verb,
717 &uc_mgr->value_list);
726 * \param uc_mgr Use case manager
730 static int execute_sequence(snd_use_case_mgr_t *uc_mgr,
745 if (uc_mgr->sequence_hops > 100) {
749 uc_mgr->sequence_hops++;
757 if (rewrite_device_value(uc_mgr, "PlaybackCTL", &cdev))
765 if (cdev == NULL && uc_mgr->in_component_domain) {
769 if (uc_mgr->cdev == NULL) {
774 cdev = strndup(uc_mgr->cdev, PATH_MAX);
781 err = get_value3(uc_mgr, &playback_ctl, "PlaybackCTL",
789 err = get_value3(uc_mgr, &capture_ctl, "CaptureCTL",
819 err = uc_mgr_open_ctl(uc_mgr, &ctl_list, cdev, 1);
875 err = execute_component_seq(uc_mgr,
885 err = execute_cfgsave(uc_mgr, s->data.cfgsave);
891 err = run_device_sequence(uc_mgr, verb, s->data.device,
897 err = run_device_all_sequence(uc_mgr, verb);
907 uc_mgr->sequence_hops--;
913 uc_mgr->sequence_hops--;
927 static int execute_component_seq(snd_use_case_mgr_t *uc_mgr,
939 uc_mgr->in_component_domain = 1;
940 uc_mgr->cdev = cdev;
949 err = execute_sequence(uc_mgr, uc_mgr->active_verb, seq,
951 &uc_mgr->active_verb->value_list,
952 &uc_mgr->value_list);
955 uc_mgr->in_component_domain = 0;
956 uc_mgr->cdev = NULL;
961 static int add_auto_value(snd_use_case_mgr_t *uc_mgr, const char *key, char *value)
966 err = get_value1(uc_mgr, &value, &uc_mgr->value_list, key);
971 return uc_mgr_add_value(&uc_mgr->value_list, key, s);
979 static int add_auto_values(snd_use_case_mgr_t *uc_mgr)
986 ctl_list = uc_mgr_get_master_ctl(uc_mgr);
990 err = add_auto_value(uc_mgr, "PlaybackCTL", buf);
993 err = add_auto_value(uc_mgr, "CaptureCTL", buf);
1002 * \param uc_mgr Use case manager
1006 static int set_defaults(snd_use_case_mgr_t *uc_mgr, bool force)
1010 if (!force && uc_mgr->default_list_executed)
1012 err = execute_sequence(uc_mgr, NULL, &uc_mgr->default_list,
1013 &uc_mgr->value_list, NULL, NULL);
1018 uc_mgr->default_list_executed = 1;
1024 * \param uc_mgr Use case manager
1027 static int import_master_config(snd_use_case_mgr_t *uc_mgr)
1031 err = uc_mgr_import_master_config(uc_mgr);
1034 return add_auto_values(uc_mgr);
1039 * \param uc_mgr Use case Manager
1042 static int check_empty_configuration(snd_use_case_mgr_t *uc_mgr)
1047 err = get_value(uc_mgr, "Linked", &value, NULL, NULL, 1);
1055 if (!list_empty(&uc_mgr->verb_list))
1057 if (!list_empty(&uc_mgr->fixedboot_list))
1059 if (!list_empty(&uc_mgr->boot_list))
1201 * \param uc_mgr Use case manager
1205 static inline struct use_case_verb *find_verb(snd_use_case_mgr_t *uc_mgr,
1208 return find(&uc_mgr->verb_list,
1213 static int is_devlist_supported(snd_use_case_mgr_t *uc_mgr,
1236 list_for_each(pos1, &uc_mgr->active_devices) {
1246 static inline int is_modifier_supported(snd_use_case_mgr_t *uc_mgr,
1249 return is_devlist_supported(uc_mgr, &modifier->dev_list);
1252 static inline int is_device_supported(snd_use_case_mgr_t *uc_mgr,
1255 return is_devlist_supported(uc_mgr, &device->dev_list);
1265 find_device(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
1278 !is_device_supported(uc_mgr, device))
1293 find_modifier(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
1306 !is_modifier_supported(uc_mgr, modifier))
1314 long device_status(snd_use_case_mgr_t *uc_mgr,
1320 list_for_each(pos, &uc_mgr->active_devices) {
1328 long modifier_status(snd_use_case_mgr_t *uc_mgr,
1334 list_for_each(pos, &uc_mgr->active_modifiers) {
1344 * \param uc_mgr Use case manager
1349 static int set_verb(snd_use_case_mgr_t *uc_mgr,
1357 err = set_defaults(uc_mgr, false);
1364 err = execute_sequence(uc_mgr, verb, seq,
1366 &uc_mgr->value_list,
1369 uc_mgr->active_verb = verb;
1375 * \param uc_mgr Use case manager
1380 static int set_modifier(snd_use_case_mgr_t *uc_mgr,
1387 if (modifier_status(uc_mgr, modifier->name) == enable)
1395 err = execute_sequence(uc_mgr, uc_mgr->active_verb, seq,
1397 &uc_mgr->active_verb->value_list,
1398 &uc_mgr->value_list);
1400 list_add_tail(&modifier->active_list, &uc_mgr->active_modifiers);
1409 * \param uc_mgr Use case manager
1414 static int set_device(snd_use_case_mgr_t *uc_mgr,
1421 if (device_status(uc_mgr, device->name) == enable)
1429 err = execute_sequence(uc_mgr, uc_mgr->active_verb, seq,
1431 &uc_mgr->active_verb->value_list,
1432 &uc_mgr->value_list);
1434 list_add_tail(&device->active_list, &uc_mgr->active_devices);
1443 * \param uc_mgr Use case manager
1446 static int do_reset(snd_use_case_mgr_t *uc_mgr)
1450 err = set_defaults(uc_mgr, true);
1451 INIT_LIST_HEAD(&uc_mgr->active_modifiers);
1452 INIT_LIST_HEAD(&uc_mgr->active_devices);
1453 uc_mgr->active_verb = NULL;
1459 * \param uc_mgr Use case manager
1463 const char *parse_open_variables(snd_use_case_mgr_t *uc_mgr, const char *name)
1497 err = uc_mgr_set_variable(uc_mgr, vname, var);
1508 int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr,
1565 *uc_mgr = mgr;
1574 int snd_use_case_mgr_reload(snd_use_case_mgr_t *uc_mgr)
1578 pthread_mutex_lock(&uc_mgr->mutex);
1580 do_reset(uc_mgr);
1582 uc_mgr_free_verb(uc_mgr);
1584 uc_mgr->default_list_executed = 0;
1587 err = import_master_config(uc_mgr);
1590 pthread_mutex_unlock(&uc_mgr->mutex);
1594 pthread_mutex_unlock(&uc_mgr->mutex);
1598 int snd_use_case_mgr_close(snd_use_case_mgr_t *uc_mgr)
1600 uc_mgr_card_close(uc_mgr);
1601 uc_mgr_free(uc_mgr);
1609 static int dismantle_use_case(snd_use_case_mgr_t *uc_mgr)
1616 list_for_each_safe(pos, npos, &uc_mgr->active_modifiers) {
1619 err = set_modifier(uc_mgr, modifier, 0);
1623 INIT_LIST_HEAD(&uc_mgr->active_modifiers);
1625 list_for_each_safe(pos, npos, &uc_mgr->active_devices) {
1628 err = set_device(uc_mgr, device, 0);
1632 INIT_LIST_HEAD(&uc_mgr->active_devices);
1634 err = set_verb(uc_mgr, uc_mgr->active_verb, 0);
1636 uc_error("Unable to disable verb %s", uc_mgr->active_verb->name);
1639 uc_mgr->active_verb = NULL;
1641 err = set_defaults(uc_mgr, true);
1646 int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr)
1650 pthread_mutex_lock(&uc_mgr->mutex);
1651 err = do_reset(uc_mgr);
1652 pthread_mutex_unlock(&uc_mgr->mutex);
1661 static int get_verb_list(snd_use_case_mgr_t *uc_mgr, const char **list[])
1663 return get_list2(&uc_mgr->verb_list, list,
1674 static int get_device_list(snd_use_case_mgr_t *uc_mgr, const char **list[],
1680 verb = find_verb(uc_mgr, verbname);
1682 verb = uc_mgr->active_verb;
1697 static int get_modifier_list(snd_use_case_mgr_t *uc_mgr, const char **list[],
1702 verb = find_verb(uc_mgr, verbname);
1704 verb = uc_mgr->active_verb;
1720 static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
1735 verb = find_verb(uc_mgr, str + 1);
1738 verb = uc_mgr->active_verb;
1743 modifier = find_modifier(uc_mgr, verb, name, 0);
1754 device = find_device(uc_mgr, verb, name, 0);
1774 static int get_supported_device_list(snd_use_case_mgr_t *uc_mgr,
1777 return get_supcon_device_list(uc_mgr, list, name, DEVLIST_SUPPORTED);
1786 static int get_conflicting_device_list(snd_use_case_mgr_t *uc_mgr,
1789 return get_supcon_device_list(uc_mgr, list, name, DEVLIST_CONFLICTING);
1931 static int get_identifiers_list(snd_use_case_mgr_t *uc_mgr,
1948 verb = find_verb(uc_mgr, str + 1);
1951 verb = uc_mgr->active_verb;
1957 modifier = find_modifier(uc_mgr, verb, name, 0);
1961 device = find_device(uc_mgr, verb, name, 0);
1969 err = add_identifiers(&mylist, &uc_mgr->value_list);
1997 static int get_value_list(snd_use_case_mgr_t *uc_mgr,
2010 verb = find_verb(uc_mgr, verbname);
2012 verb = uc_mgr->active_verb;
2017 err = add_values(&mylist, identifier, &uc_mgr->value_list);
2051 static int get_enabled_device_list(snd_use_case_mgr_t *uc_mgr,
2054 if (uc_mgr->active_verb == NULL)
2056 return get_list(&uc_mgr->active_devices, list,
2067 static int get_enabled_modifier_list(snd_use_case_mgr_t *uc_mgr,
2070 if (uc_mgr->active_verb == NULL)
2072 return get_list(&uc_mgr->active_modifiers, list,
2077 int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
2084 if (uc_mgr == NULL || identifier == NULL)
2086 pthread_mutex_lock(&uc_mgr->mutex);
2088 err = get_verb_list(uc_mgr, list);
2090 err = get_enabled_device_list(uc_mgr, list);
2092 err = get_enabled_modifier_list(uc_mgr, list);
2105 err = get_device_list(uc_mgr, list, str);
2107 err = get_modifier_list(uc_mgr, list, str);
2109 err = get_identifiers_list(uc_mgr, list, str);
2111 err = get_supported_device_list(uc_mgr, list, str);
2113 err = get_conflicting_device_list(uc_mgr, list, str);
2117 err = get_value_list(uc_mgr, identifier, list, str);
2122 pthread_mutex_unlock(&uc_mgr->mutex);
2126 static int get_value1(snd_use_case_mgr_t *uc_mgr, char **value,
2139 if (uc_mgr->conf_format < 2) {
2145 err = uc_mgr_get_substituted_value(uc_mgr, value, val->data);
2148 return rewrite_device_value(uc_mgr, val->name, value);
2154 static int get_value3(snd_use_case_mgr_t *uc_mgr,
2163 err = get_value1(uc_mgr, value, value_list1, identifier);
2166 err = get_value1(uc_mgr, value, value_list2, identifier);
2169 err = get_value1(uc_mgr, value, value_list3, identifier);
2177 * \param uc_mgr Use case manager
2183 static int get_value(snd_use_case_mgr_t *uc_mgr,
2197 verb = find_verb(uc_mgr, verb_name);
2199 verb = uc_mgr->active_verb;
2203 mod = find_modifier(uc_mgr, verb,
2206 err = get_value1(uc_mgr, value,
2213 dev = find_device(uc_mgr, verb,
2216 err = get_value1(uc_mgr, value,
2227 err = get_value1(uc_mgr, value, &verb->value_list, identifier);
2236 err = get_value1(uc_mgr, value, &uc_mgr->value_list, identifier);
2245 * \param uc_mgr Use case manager
2249 static int get_alibcfg(snd_use_case_mgr_t *uc_mgr, char **str)
2258 err = snd_config_save(uc_mgr->local_config, out);
2270 * \param uc_mgr Use case manager
2274 static int get_alibpref(snd_use_case_mgr_t *uc_mgr, char **str)
2282 snprintf(s, l, "_ucm%04X.", uc_mgr->ucm_card_number);
2287 int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
2296 pthread_mutex_lock(&uc_mgr->mutex);
2298 *value = strdup(uc_mgr->card_name);
2305 if (uc_mgr->active_verb == NULL) {
2309 *value = strdup(uc_mgr->active_verb->name);
2317 if ((uc_mgr->card_name == NULL) ||
2318 (uc_mgr->conf_file_name == NULL) ||
2319 (uc_mgr->conf_file_name[0] == '\0')) {
2323 *value = strdup(uc_mgr->conf_file_name);
2331 err = get_alibcfg(uc_mgr, (char **)value);
2333 err = get_alibpref(uc_mgr, (char **)value);
2368 err = get_value(uc_mgr, ident, (char **)value, mod_dev, verb,
2376 pthread_mutex_unlock(&uc_mgr->mutex);
2383 #define geti(uc_mgr, status, ifind, str, value) ({ \
2386 val = (status)((uc_mgr), (str)); \
2388 if ((ifind)((uc_mgr), (uc_mgr)->active_verb, (str), 0)) { \
2399 int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
2406 pthread_mutex_lock(&uc_mgr->mutex);
2421 err = geti(uc_mgr, device_status, find_device, str, value);
2423 err = geti(uc_mgr, modifier_status, find_modifier, str, value);
2438 pthread_mutex_unlock(&uc_mgr->mutex);
2442 static int set_fixedboot_user(snd_use_case_mgr_t *uc_mgr,
2451 if (list_empty(&uc_mgr->fixedboot_list))
2453 err = execute_sequence(uc_mgr, NULL, &uc_mgr->fixedboot_list,
2454 &uc_mgr->value_list, NULL, NULL);
2462 static int set_boot_user(snd_use_case_mgr_t *uc_mgr,
2471 if (list_empty(&uc_mgr->boot_list))
2473 err = execute_sequence(uc_mgr, NULL, &uc_mgr->boot_list,
2474 &uc_mgr->value_list, NULL, NULL);
2482 static int set_defaults_user(snd_use_case_mgr_t *uc_mgr,
2489 return set_defaults(uc_mgr, false);
2492 static int handle_transition_verb(snd_use_case_mgr_t *uc_mgr,
2499 list_for_each(pos, &uc_mgr->active_verb->transition_list) {
2502 err = execute_sequence(uc_mgr, uc_mgr->active_verb,
2504 &uc_mgr->active_verb->value_list,
2505 &uc_mgr->value_list,
2515 static int set_verb_user(snd_use_case_mgr_t *uc_mgr,
2521 if (uc_mgr->active_verb &&
2522 strcmp(uc_mgr->active_verb->name, verb_name) == 0)
2525 verb = find_verb(uc_mgr, verb_name);
2531 if (uc_mgr->active_verb) {
2532 err = handle_transition_verb(uc_mgr, verb);
2534 err = dismantle_use_case(uc_mgr);
2538 uc_mgr->active_verb = verb;
2545 err = set_verb(uc_mgr, verb, 1);
2554 static int set_device_user(snd_use_case_mgr_t *uc_mgr,
2560 if (uc_mgr->active_verb == NULL)
2562 device = find_device(uc_mgr, uc_mgr->active_verb, device_name, 1);
2565 return set_device(uc_mgr, device, enable);
2568 static int set_modifier_user(snd_use_case_mgr_t *uc_mgr,
2574 if (uc_mgr->active_verb == NULL)
2577 modifier = find_modifier(uc_mgr, uc_mgr->active_verb, modifier_name, 1);
2580 return set_modifier(uc_mgr, modifier, enable);
2583 static int switch_device(snd_use_case_mgr_t *uc_mgr,
2592 if (uc_mgr->active_verb == NULL)
2594 if (device_status(uc_mgr, old_device) == 0) {
2598 if (device_status(uc_mgr, new_device) != 0) {
2602 xold = find_device(uc_mgr, uc_mgr->active_verb, old_device, 1);
2606 xnew = find_device(uc_mgr, uc_mgr->active_verb, new_device, 1);
2607 list_add_tail(&xold->active_list, &uc_mgr->active_devices);
2614 err = execute_sequence(uc_mgr, uc_mgr->active_verb,
2617 &uc_mgr->active_verb->value_list,
2618 &uc_mgr->value_list);
2621 list_add_tail(&xnew->active_list, &uc_mgr->active_devices);
2628 err = set_device(uc_mgr, xold, 0);
2631 err = set_device(uc_mgr, xnew, 1);
2638 static int switch_modifier(snd_use_case_mgr_t *uc_mgr,
2647 if (uc_mgr->active_verb == NULL)
2649 if (modifier_status(uc_mgr, old_modifier) == 0) {
2653 if (modifier_status(uc_mgr, new_modifier) != 0) {
2657 xold = find_modifier(uc_mgr, uc_mgr->active_verb, old_modifier, 1);
2660 xnew = find_modifier(uc_mgr, uc_mgr->active_verb, new_modifier, 1);
2667 err = execute_sequence(uc_mgr, uc_mgr->active_verb,
2670 &uc_mgr->active_verb->value_list,
2671 &uc_mgr->value_list);
2674 list_add_tail(&xnew->active_list, &uc_mgr->active_modifiers);
2681 err = set_modifier(uc_mgr, xold, 0);
2684 err = set_modifier(uc_mgr, xnew, 1);
2691 int snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
2698 pthread_mutex_lock(&uc_mgr->mutex);
2700 err = set_fixedboot_user(uc_mgr, value);
2702 err = set_boot_user(uc_mgr, value);
2704 err = set_defaults_user(uc_mgr, value);
2706 err = set_verb_user(uc_mgr, value);
2708 err = set_device_user(uc_mgr, value, 1);
2710 err = set_device_user(uc_mgr, value, 0);
2712 err = set_modifier_user(uc_mgr, value, 1);
2714 err = set_modifier_user(uc_mgr, value, 0);
2728 err = switch_device(uc_mgr, str, value);
2730 err = switch_modifier(uc_mgr, str, value);
2737 pthread_mutex_unlock(&uc_mgr->mutex);