const char *verb_name,
int exact);
static int get_value1(snd_use_case_mgr_t *uc_mgr, char **value,
- struct list_head *value_list, const char *identifier);
+ struct list_head *value_list, const char *identifier);
static int get_value3(snd_use_case_mgr_t *uc_mgr,
- char **value,
+ char **value,
const char *identifier,
struct list_head *value_list1,
struct list_head *value_list2,
static int list_count(struct list_head *list)
{
- struct list_head *pos;
- int count = 0;
-
- list_for_each(pos, list) {
- count += 1;
- }
- return count;
+ struct list_head *pos;
+ int count = 0;
+
+ list_for_each(pos, list) {
+ count += 1;
+ }
+ return count;
}
static int alloc_str_list(struct list_head *list, int mult, char **result[])
{
- char **res;
- int cnt;
-
- cnt = list_count(list) * mult;
- if (cnt == 0) {
+ char **res;
+ int cnt;
+
+ cnt = list_count(list) * mult;
+ if (cnt == 0) {
*result = NULL;
- return cnt;
+ return cnt;
}
- res = calloc(mult, cnt * sizeof(char *));
- if (res == NULL)
- return -ENOMEM;
- *result = res;
- return cnt;
+ res = calloc(mult, cnt * sizeof(char *));
+ if (res == NULL)
+ return -ENOMEM;
+ *result = res;
+ return cnt;
}
/**
*/
int snd_use_case_free_list(const char *list[], int items)
{
- int i;
+ int i;
if (list == NULL)
return 0;
- for (i = 0; i < items; i++)
+ for (i = 0; i < items; i++)
free((void *)list[i]);
- free(list);
+ free(list);
return 0;
}
* \return count of items on success, otherwise a negative error code
*/
static int get_list0(struct list_head *list,
- const char **result[],
- unsigned long offset,
- unsigned long s1offset)
+ const char **result[],
+ unsigned long offset,
+ unsigned long s1offset)
{
- char **res;
- int cnt;
+ char **res;
+ int cnt;
struct list_head *pos;
char *ptr, *str1;
cnt = alloc_str_list(list, 1, &res);
if (cnt <= 0) {
*result = NULL;
- return cnt;
+ return cnt;
}
*result = (const char **)res;
list_for_each(pos, list) {
ptr = list_entry_offset(pos, char, offset);
str1 = *((char **)(ptr + s1offset));
if (str1 != NULL) {
- *res = strdup(str1);
- if (*res == NULL)
- goto __fail;
- } else {
- *res = NULL;
- }
- res++;
+ *res = strdup(str1);
+ if (*res == NULL)
+ goto __fail;
+ } else {
+ *res = NULL;
+ }
+ res++;
}
return cnt;
__fail:
- snd_use_case_free_list(*result, cnt);
- return -ENOMEM;
+ snd_use_case_free_list(*result, cnt);
+ return -ENOMEM;
}
#define get_list(list, result, type, member, s1) \
get_list0(list, result, \
- (unsigned long)(&((type *)0)->member), \
+ (unsigned long)(&((type *)0)->member), \
(unsigned long)(&((type *)0)->s1))
/**
* \return count of items on success, otherwise a negative error code
*/
static int get_list20(struct list_head *list,
- const char **result[],
- unsigned long offset,
- unsigned long s1offset,
- unsigned long s2offset)
+ const char **result[],
+ unsigned long offset,
+ unsigned long s1offset,
+ unsigned long s2offset)
{
- char **res;
- int cnt;
+ char **res;
+ int cnt;
struct list_head *pos;
char *ptr, *str1, *str2;
cnt = alloc_str_list(list, 2, &res);
if (cnt <= 0) {
*result = NULL;
- return cnt;
+ return cnt;
}
- *result = (const char **)res;
+ *result = (const char **)res;
list_for_each(pos, list) {
ptr = list_entry_offset(pos, char, offset);
str1 = *((char **)(ptr + s1offset));
if (str1 != NULL) {
- *res = strdup(str1);
- if (*res == NULL)
- goto __fail;
- } else {
- *res = NULL;
- }
- res++;
+ *res = strdup(str1);
+ if (*res == NULL)
+ goto __fail;
+ } else {
+ *res = NULL;
+ }
+ res++;
str2 = *((char **)(ptr + s2offset));
if (str2 != NULL) {
- *res = strdup(str2);
- if (*res == NULL)
- goto __fail;
- } else {
- *res = NULL;
- }
- res++;
+ *res = strdup(str2);
+ if (*res == NULL)
+ goto __fail;
+ } else {
+ *res = NULL;
+ }
+ res++;
}
return cnt;
__fail:
- snd_use_case_free_list(*result, cnt);
- return -ENOMEM;
+ snd_use_case_free_list(*result, cnt);
+ return -ENOMEM;
}
#define get_list2(list, result, type, member, s1, s2) \
get_list20(list, result, \
- (unsigned long)(&((type *)0)->member), \
+ (unsigned long)(&((type *)0)->member), \
(unsigned long)(&((type *)0)->s1), \
(unsigned long)(&((type *)0)->s2))
* \return structure on success, otherwise a NULL (not found)
*/
static inline struct use_case_device *
- find_device(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
+ find_device(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
const char *device_name, int check_supported)
{
struct use_case_device *device;
* \return structure on success, otherwise a NULL (not found)
*/
static struct use_case_modifier *
- find_modifier(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
+ find_modifier(snd_use_case_mgr_t *uc_mgr, struct use_case_verb *verb,
const char *modifier_name, int check_supported)
{
struct use_case_modifier *modifier;
}
long device_status(snd_use_case_mgr_t *uc_mgr,
- const char *device_name)
+ const char *device_name)
{
- struct use_case_device *dev;
- struct list_head *pos;
+ struct use_case_device *dev;
+ struct list_head *pos;
- list_for_each(pos, &uc_mgr->active_devices) {
- dev = list_entry(pos, struct use_case_device, active_list);
- if (strcmp(dev->name, device_name) == 0)
- return 1;
- }
- return 0;
+ list_for_each(pos, &uc_mgr->active_devices) {
+ dev = list_entry(pos, struct use_case_device, active_list);
+ if (strcmp(dev->name, device_name) == 0)
+ return 1;
+ }
+ return 0;
}
long modifier_status(snd_use_case_mgr_t *uc_mgr,
- const char *modifier_name)
+ const char *modifier_name)
{
- struct use_case_modifier *mod;
- struct list_head *pos;
+ struct use_case_modifier *mod;
+ struct list_head *pos;
- list_for_each(pos, &uc_mgr->active_modifiers) {
- mod = list_entry(pos, struct use_case_modifier, active_list);
- if (strcmp(mod->name, modifier_name) == 0)
- return 1;
- }
- return 0;
+ list_for_each(pos, &uc_mgr->active_modifiers) {
+ mod = list_entry(pos, struct use_case_modifier, active_list);
+ if (strcmp(mod->name, modifier_name) == 0)
+ return 1;
+ }
+ return 0;
}
/**
struct list_head *seq;
int err;
- if (device_status(uc_mgr, device->name) == enable)
+ if (device_status(uc_mgr, device->name) == enable)
return 0;
if (enable) {
*/
int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr)
{
- int err;
+ int err;
pthread_mutex_lock(&uc_mgr->mutex);
err = execute_sequence(uc_mgr, &uc_mgr->default_list,
*/
static int get_verb_list(snd_use_case_mgr_t *uc_mgr, const char **list[])
{
- return get_list2(&uc_mgr->verb_list, list,
- struct use_case_verb, list,
- name, comment);
+ return get_list2(&uc_mgr->verb_list, list,
+ struct use_case_verb, list,
+ name, comment);
}
/**
* \return Number of list entries if success, otherwise a negative error code
*/
static int get_device_list(snd_use_case_mgr_t *uc_mgr, const char **list[],
- char *verbname)
-{
- struct use_case_verb *verb;
-
- if (verbname) {
- verb = find_verb(uc_mgr, verbname);
- } else {
- verb = uc_mgr->active_verb;
- }
- if (verb == NULL)
- return -ENOENT;
- return get_list2(&verb->device_list, list,
- struct use_case_device, list,
- name, comment);
+ char *verbname)
+{
+ struct use_case_verb *verb;
+
+ if (verbname) {
+ verb = find_verb(uc_mgr, verbname);
+ } else {
+ verb = uc_mgr->active_verb;
+ }
+ if (verb == NULL)
+ return -ENOENT;
+ return get_list2(&verb->device_list, list,
+ struct use_case_device, list,
+ name, comment);
}
/**
* \return Number of list entries if success, otherwise a negative error code
*/
static int get_modifier_list(snd_use_case_mgr_t *uc_mgr, const char **list[],
- char *verbname)
-{
- struct use_case_verb *verb;
-
- if (verbname) {
- verb = find_verb(uc_mgr, verbname);
- } else {
- verb = uc_mgr->active_verb;
- }
- if (verb == NULL)
- return -ENOENT;
- return get_list2(&verb->modifier_list, list,
- struct use_case_modifier, list,
- name, comment);
+ char *verbname)
+{
+ struct use_case_verb *verb;
+ if (verbname) {
+ verb = find_verb(uc_mgr, verbname);
+ } else {
+ verb = uc_mgr->active_verb;
+ }
+ if (verb == NULL)
+ return -ENOENT;
+ return get_list2(&verb->modifier_list, list,
+ struct use_case_modifier, list,
+ name, comment);
}
/**
* \param source Source list with ucm_value structures
*/
static int add_values(struct list_head *list,
- const char *identifier,
- struct list_head *source)
+ const char *identifier,
+ struct list_head *source)
{
struct ucm_value *v;
struct list_head *pos;
int err;
-
+
list_for_each(pos, source) {
v = list_entry(pos, struct ucm_value, list);
if (check_identifier(identifier, v->name)) {
* \return Number of list entries if success, otherwise a negative error code
*/
static int get_value_list(snd_use_case_mgr_t *uc_mgr,
- const char *identifier,
- const char **list[],
- char *verbname)
+ const char *identifier,
+ const char **list[],
+ char *verbname)
{
struct list_head mylist, *pos;
- struct use_case_verb *verb;
- struct use_case_device *dev;
- struct use_case_modifier *mod;
- char **res;
- int err;
-
- if (verbname) {
- verb = find_verb(uc_mgr, verbname);
- } else {
- verb = uc_mgr->active_verb;
- }
- if (verb == NULL)
- return -ENOENT;
- INIT_LIST_HEAD(&mylist);
+ struct use_case_verb *verb;
+ struct use_case_device *dev;
+ struct use_case_modifier *mod;
+ char **res;
+ int err;
+
+ if (verbname) {
+ verb = find_verb(uc_mgr, verbname);
+ } else {
+ verb = uc_mgr->active_verb;
+ }
+ if (verb == NULL)
+ return -ENOENT;
+ INIT_LIST_HEAD(&mylist);
err = add_values(&mylist, identifier, &uc_mgr->value_list);
if (err < 0)
goto __fail;
- err = add_values(&mylist, identifier, &verb->value_list);
- if (err < 0)
- goto __fail;
- list_for_each(pos, &verb->device_list) {
- dev = list_entry(pos, struct use_case_device, list);
- err = add_values(&mylist, identifier, &dev->value_list);
- if (err < 0)
- goto __fail;
- }
- list_for_each(pos, &verb->modifier_list) {
- mod = list_entry(pos, struct use_case_modifier, list);
- err = add_values(&mylist, identifier, &mod->value_list);
- if (err < 0)
- goto __fail;
- }
+ err = add_values(&mylist, identifier, &verb->value_list);
+ if (err < 0)
+ goto __fail;
+ list_for_each(pos, &verb->device_list) {
+ dev = list_entry(pos, struct use_case_device, list);
+ err = add_values(&mylist, identifier, &dev->value_list);
+ if (err < 0)
+ goto __fail;
+ }
+ list_for_each(pos, &verb->modifier_list) {
+ mod = list_entry(pos, struct use_case_modifier, list);
+ err = add_values(&mylist, identifier, &mod->value_list);
+ if (err < 0)
+ goto __fail;
+ }
err = myvalue_to_str_list(&mylist, &res);
if (err > 0)
- *list = (const char **)res;
+ *list = (const char **)res;
else if (err == 0)
*list = NULL;
__fail:
myvalue_list_free(&mylist);
- return err;
+ return err;
}
/**
* \return Number of list entries if success, otherwise a negative error code
*/
static int get_enabled_device_list(snd_use_case_mgr_t *uc_mgr,
- const char **list[])
+ const char **list[])
{
- if (uc_mgr->active_verb == NULL)
- return -EINVAL;
- return get_list(&uc_mgr->active_devices, list,
- struct use_case_device, active_list,
- name);
+ if (uc_mgr->active_verb == NULL)
+ return -EINVAL;
+ return get_list(&uc_mgr->active_devices, list,
+ struct use_case_device, active_list,
+ name);
}
/**
* \return Number of list entries if success, otherwise a negative error code
*/
static int get_enabled_modifier_list(snd_use_case_mgr_t *uc_mgr,
- const char **list[])
+ const char **list[])
{
- if (uc_mgr->active_verb == NULL)
- return -EINVAL;
- return get_list(&uc_mgr->active_modifiers, list,
- struct use_case_modifier, active_list,
- name);
+ if (uc_mgr->active_verb == NULL)
+ return -EINVAL;
+ return get_list(&uc_mgr->active_modifiers, list,
+ struct use_case_modifier, active_list,
+ name);
}
/**
pthread_mutex_lock(&uc_mgr->mutex);
if (strcmp(identifier, "_verbs") == 0)
err = get_verb_list(uc_mgr, list);
- else if (strcmp(identifier, "_enadevs") == 0)
- err = get_enabled_device_list(uc_mgr, list);
- else if (strcmp(identifier, "_enamods") == 0)
- err = get_enabled_modifier_list(uc_mgr, list);
- else {
- str1 = strchr(identifier, '/');
- if (str1) {
- str = strdup(str1 + 1);
- if (str == NULL) {
- err = -ENOMEM;
- goto __end;
- }
- } else {
- str = NULL;
- }
+ else if (strcmp(identifier, "_enadevs") == 0)
+ err = get_enabled_device_list(uc_mgr, list);
+ else if (strcmp(identifier, "_enamods") == 0)
+ err = get_enabled_modifier_list(uc_mgr, list);
+ else {
+ str1 = strchr(identifier, '/');
+ if (str1) {
+ str = strdup(str1 + 1);
+ if (str == NULL) {
+ err = -ENOMEM;
+ goto __end;
+ }
+ } else {
+ str = NULL;
+ }
if (check_identifier(identifier, "_devices"))
err = get_device_list(uc_mgr, list, str);
- else if (check_identifier(identifier, "_modifiers"))
+ else if (check_identifier(identifier, "_modifiers"))
err = get_modifier_list(uc_mgr, list, str);
else if (check_identifier(identifier, "_identifiers"))
err = get_identifiers_list(uc_mgr, list, str);
static int get_value1(snd_use_case_mgr_t *uc_mgr, char **value,
struct list_head *value_list, const char *identifier)
{
- struct ucm_value *val;
- struct list_head *pos;
-
+ struct ucm_value *val;
+ struct list_head *pos;
+
if (!value_list)
return -ENOENT;
- list_for_each(pos, value_list) {
+ list_for_each(pos, value_list) {
val = list_entry(pos, struct ucm_value, list);
if (check_identifier(identifier, val->name)) {
if (uc_mgr->conf_format < 2) {
}
return uc_mgr_get_substituted_value(uc_mgr, value, val->data);
}
- }
- return -ENOENT;
+ }
+ return -ENOENT;
}
static int get_value3(snd_use_case_mgr_t *uc_mgr,
const char *slash1, *slash2, *mod_dev_after;
const char *ident, *mod_dev, *verb;
int exact = 0;
- int err;
+ int err;
pthread_mutex_lock(&uc_mgr->mutex);
if (identifier == NULL) {
- *value = strdup(uc_mgr->card_name);
- if (*value == NULL) {
- err = -ENOMEM;
- goto __end;
- }
- err = 0;
- } else if (strcmp(identifier, "_verb") == 0) {
- if (uc_mgr->active_verb == NULL) {
- err = -ENOENT;
+ *value = strdup(uc_mgr->card_name);
+ if (*value == NULL) {
+ err = -ENOMEM;
goto __end;
}
- *value = strdup(uc_mgr->active_verb->name);
- if (*value == NULL) {
- err = -ENOMEM;
- goto __end;
- }
- err = 0;
+ err = 0;
+ } else if (strcmp(identifier, "_verb") == 0) {
+ if (uc_mgr->active_verb == NULL) {
+ err = -ENOENT;
+ goto __end;
+ }
+ *value = strdup(uc_mgr->active_verb->name);
+ if (*value == NULL) {
+ err = -ENOMEM;
+ goto __end;
+ }
+ err = 0;
} else if (strcmp(identifier, "_file") == 0) {
/* get the conf file name of the opened card */
if ((uc_mgr->card_name == NULL) ||
} else if (identifier[0] == '_') {
err = -ENOENT;
goto __end;
- } else {
+ } else {
if (identifier[0] == '=') {
exact = 1;
identifier++;
}
err = get_value(uc_mgr, ident, (char **)value, mod_dev, verb,
- exact);
+ exact);
if (ident != identifier)
free((void *)ident);
if (mod_dev)
free((void *)mod_dev);
- }
+ }
__end:
pthread_mutex_unlock(&uc_mgr->mutex);
- return err;
+ return err;
}
const char *identifier,
long *value)
{
- char *str, *str1;
- long err;
+ char *str, *str1;
+ long err;
pthread_mutex_lock(&uc_mgr->mutex);
- if (0) {
- /* nothing here - prepared for fixed identifiers */
- } else {
- str1 = strchr(identifier, '/');
- if (str1) {
- str = strdup(str1 + 1);
- if (str == NULL) {
- err = -ENOMEM;
- goto __end;
- }
- } else {
- str = NULL;
- }
- if (check_identifier(identifier, "_devstatus")) {
+ if (0) {
+ /* nothing here - prepared for fixed identifiers */
+ } else {
+ str1 = strchr(identifier, '/');
+ if (str1) {
+ str = strdup(str1 + 1);
+ if (str == NULL) {
+ err = -ENOMEM;
+ goto __end;
+ }
+ } else {
+ str = NULL;
+ }
+ if (check_identifier(identifier, "_devstatus")) {
if (!str) {
err = -EINVAL;
goto __end;
}
- err = device_status(uc_mgr, str);
+ err = device_status(uc_mgr, str);
if (err >= 0) {
*value = err;
err = 0;
err = -EINVAL;
goto __end;
}
- err = modifier_status(uc_mgr, str);
+ err = modifier_status(uc_mgr, str);
if (err >= 0) {
*value = err;
err = 0;
err = -ENOENT;
#endif
} else
- err = -ENOENT;
- if (str)
- free(str);
- }
+ err = -ENOENT;
+ if (str)
+ free(str);
+ }
__end:
pthread_mutex_unlock(&uc_mgr->mutex);
- return err;
+ return err;
}
static int set_fixedboot_user(snd_use_case_mgr_t *uc_mgr,
}
static int handle_transition_verb(snd_use_case_mgr_t *uc_mgr,
- struct use_case_verb *new_verb)
+ struct use_case_verb *new_verb)
{
- struct list_head *pos;
- struct transition_sequence *trans;
- int err;
+ struct list_head *pos;
+ struct transition_sequence *trans;
+ int err;
- list_for_each(pos, &uc_mgr->active_verb->transition_list) {
- trans = list_entry(pos, struct transition_sequence, list);
- if (strcmp(trans->name, new_verb->name) == 0) {
- err = execute_sequence(uc_mgr, &trans->transition_list,
+ list_for_each(pos, &uc_mgr->active_verb->transition_list) {
+ trans = list_entry(pos, struct transition_sequence, list);
+ if (strcmp(trans->name, new_verb->name) == 0) {
+ err = execute_sequence(uc_mgr, &trans->transition_list,
&uc_mgr->active_verb->value_list,
&uc_mgr->value_list,
NULL);
- if (err >= 0)
- return 1;
- return err;
- }
- }
- return 0;
+ if (err >= 0)
+ return 1;
+ return err;
+ }
+ }
+ return 0;
}
static int set_verb_user(snd_use_case_mgr_t *uc_mgr,
- const char *verb_name)
-{
- struct use_case_verb *verb;
- int err = 0;
-
- if (uc_mgr->active_verb &&
- strcmp(uc_mgr->active_verb->name, verb_name) == 0)
- return 0;
- if (strcmp(verb_name, SND_USE_CASE_VERB_INACTIVE) != 0) {
- verb = find_verb(uc_mgr, verb_name);
- if (verb == NULL)
- return -ENOENT;
- } else {
- verb = NULL;
- }
- if (uc_mgr->active_verb) {
- err = handle_transition_verb(uc_mgr, verb);
- if (err == 0) {
- err = dismantle_use_case(uc_mgr);
- if (err < 0)
- return err;
- } else if (err == 1) {
- uc_mgr->active_verb = verb;
- verb = NULL;
- } else {
- verb = NULL; /* show error */
- }
- }
- if (verb) {
- err = set_verb(uc_mgr, verb, 1);
- if (err < 0)
- uc_error("error: failed to initialize new use case: %s",
- verb_name);
- }
- return err;
+ const char *verb_name)
+{
+ struct use_case_verb *verb;
+ int err = 0;
+
+ if (uc_mgr->active_verb &&
+ strcmp(uc_mgr->active_verb->name, verb_name) == 0)
+ return 0;
+ if (strcmp(verb_name, SND_USE_CASE_VERB_INACTIVE) != 0) {
+ verb = find_verb(uc_mgr, verb_name);
+ if (verb == NULL)
+ return -ENOENT;
+ } else {
+ verb = NULL;
+ }
+ if (uc_mgr->active_verb) {
+ err = handle_transition_verb(uc_mgr, verb);
+ if (err == 0) {
+ err = dismantle_use_case(uc_mgr);
+ if (err < 0)
+ return err;
+ } else if (err == 1) {
+ uc_mgr->active_verb = verb;
+ verb = NULL;
+ } else {
+ verb = NULL; /* show error */
+ }
+ }
+ if (verb) {
+ err = set_verb(uc_mgr, verb, 1);
+ if (err < 0)
+ uc_error("error: failed to initialize new use case: %s",
+ verb_name);
+ }
+ return err;
}
static int set_device_user(snd_use_case_mgr_t *uc_mgr,
- const char *device_name,
- int enable)
+ const char *device_name,
+ int enable)
{
- struct use_case_device *device;
+ struct use_case_device *device;
- if (uc_mgr->active_verb == NULL)
- return -ENOENT;
- device = find_device(uc_mgr, uc_mgr->active_verb, device_name, 1);
- if (device == NULL)
- return -ENOENT;
- return set_device(uc_mgr, device, enable);
+ if (uc_mgr->active_verb == NULL)
+ return -ENOENT;
+ device = find_device(uc_mgr, uc_mgr->active_verb, device_name, 1);
+ if (device == NULL)
+ return -ENOENT;
+ return set_device(uc_mgr, device, enable);
}
static int set_modifier_user(snd_use_case_mgr_t *uc_mgr,
- const char *modifier_name,
- int enable)
+ const char *modifier_name,
+ int enable)
{
- struct use_case_modifier *modifier;
+ struct use_case_modifier *modifier;
- if (uc_mgr->active_verb == NULL)
- return -ENOENT;
+ if (uc_mgr->active_verb == NULL)
+ return -ENOENT;
- modifier = find_modifier(uc_mgr, uc_mgr->active_verb, modifier_name, 1);
- if (modifier == NULL)
- return -ENOENT;
- return set_modifier(uc_mgr, modifier, enable);
+ modifier = find_modifier(uc_mgr, uc_mgr->active_verb, modifier_name, 1);
+ if (modifier == NULL)
+ return -ENOENT;
+ return set_modifier(uc_mgr, modifier, enable);
}
static int switch_device(snd_use_case_mgr_t *uc_mgr,
- const char *old_device,
- const char *new_device)
-{
- struct use_case_device *xold, *xnew;
- struct transition_sequence *trans;
- struct list_head *pos;
- int err, seq_found = 0;
-
- if (uc_mgr->active_verb == NULL)
- return -ENOENT;
- if (device_status(uc_mgr, old_device) == 0) {
- uc_error("error: device %s not enabled", old_device);
- return -EINVAL;
- }
- if (device_status(uc_mgr, new_device) != 0) {
- uc_error("error: device %s already enabled", new_device);
- return -EINVAL;
- }
- xold = find_device(uc_mgr, uc_mgr->active_verb, old_device, 1);
- if (xold == NULL)
- return -ENOENT;
- list_del(&xold->active_list);
- xnew = find_device(uc_mgr, uc_mgr->active_verb, new_device, 1);
- list_add_tail(&xold->active_list, &uc_mgr->active_devices);
- if (xnew == NULL)
- return -ENOENT;
- err = 0;
- list_for_each(pos, &xold->transition_list) {
- trans = list_entry(pos, struct transition_sequence, list);
- if (strcmp(trans->name, new_device) == 0) {
- err = execute_sequence(uc_mgr, &trans->transition_list,
+ const char *old_device,
+ const char *new_device)
+{
+ struct use_case_device *xold, *xnew;
+ struct transition_sequence *trans;
+ struct list_head *pos;
+ int err, seq_found = 0;
+
+ if (uc_mgr->active_verb == NULL)
+ return -ENOENT;
+ if (device_status(uc_mgr, old_device) == 0) {
+ uc_error("error: device %s not enabled", old_device);
+ return -EINVAL;
+ }
+ if (device_status(uc_mgr, new_device) != 0) {
+ uc_error("error: device %s already enabled", new_device);
+ return -EINVAL;
+ }
+ xold = find_device(uc_mgr, uc_mgr->active_verb, old_device, 1);
+ if (xold == NULL)
+ return -ENOENT;
+ list_del(&xold->active_list);
+ xnew = find_device(uc_mgr, uc_mgr->active_verb, new_device, 1);
+ list_add_tail(&xold->active_list, &uc_mgr->active_devices);
+ if (xnew == NULL)
+ return -ENOENT;
+ err = 0;
+ list_for_each(pos, &xold->transition_list) {
+ trans = list_entry(pos, struct transition_sequence, list);
+ if (strcmp(trans->name, new_device) == 0) {
+ err = execute_sequence(uc_mgr, &trans->transition_list,
&xold->value_list,
&uc_mgr->active_verb->value_list,
&uc_mgr->value_list);
- if (err >= 0) {
- list_del(&xold->active_list);
- list_add_tail(&xnew->active_list, &uc_mgr->active_devices);
- }
- seq_found = 1;
- break;
- }
- }
- if (!seq_found) {
- err = set_device(uc_mgr, xold, 0);
- if (err < 0)
- return err;
- err = set_device(uc_mgr, xnew, 1);
- if (err < 0)
- return err;
- }
- return err;
+ if (err >= 0) {
+ list_del(&xold->active_list);
+ list_add_tail(&xnew->active_list, &uc_mgr->active_devices);
+ }
+ seq_found = 1;
+ break;
+ }
+ }
+ if (!seq_found) {
+ err = set_device(uc_mgr, xold, 0);
+ if (err < 0)
+ return err;
+ err = set_device(uc_mgr, xnew, 1);
+ if (err < 0)
+ return err;
+ }
+ return err;
}
static int switch_modifier(snd_use_case_mgr_t *uc_mgr,
- const char *old_modifier,
- const char *new_modifier)
-{
- struct use_case_modifier *xold, *xnew;
- struct transition_sequence *trans;
- struct list_head *pos;
- int err, seq_found = 0;
-
- if (uc_mgr->active_verb == NULL)
- return -ENOENT;
- if (modifier_status(uc_mgr, old_modifier) == 0) {
- uc_error("error: modifier %s not enabled", old_modifier);
- return -EINVAL;
- }
- if (modifier_status(uc_mgr, new_modifier) != 0) {
- uc_error("error: modifier %s already enabled", new_modifier);
- return -EINVAL;
- }
- xold = find_modifier(uc_mgr, uc_mgr->active_verb, old_modifier, 1);
- if (xold == NULL)
- return -ENOENT;
- xnew = find_modifier(uc_mgr, uc_mgr->active_verb, new_modifier, 1);
- if (xnew == NULL)
- return -ENOENT;
- err = 0;
- list_for_each(pos, &xold->transition_list) {
- trans = list_entry(pos, struct transition_sequence, list);
- if (strcmp(trans->name, new_modifier) == 0) {
- err = execute_sequence(uc_mgr, &trans->transition_list,
+ const char *old_modifier,
+ const char *new_modifier)
+{
+ struct use_case_modifier *xold, *xnew;
+ struct transition_sequence *trans;
+ struct list_head *pos;
+ int err, seq_found = 0;
+
+ if (uc_mgr->active_verb == NULL)
+ return -ENOENT;
+ if (modifier_status(uc_mgr, old_modifier) == 0) {
+ uc_error("error: modifier %s not enabled", old_modifier);
+ return -EINVAL;
+ }
+ if (modifier_status(uc_mgr, new_modifier) != 0) {
+ uc_error("error: modifier %s already enabled", new_modifier);
+ return -EINVAL;
+ }
+ xold = find_modifier(uc_mgr, uc_mgr->active_verb, old_modifier, 1);
+ if (xold == NULL)
+ return -ENOENT;
+ xnew = find_modifier(uc_mgr, uc_mgr->active_verb, new_modifier, 1);
+ if (xnew == NULL)
+ return -ENOENT;
+ err = 0;
+ list_for_each(pos, &xold->transition_list) {
+ trans = list_entry(pos, struct transition_sequence, list);
+ if (strcmp(trans->name, new_modifier) == 0) {
+ err = execute_sequence(uc_mgr, &trans->transition_list,
&xold->value_list,
&uc_mgr->active_verb->value_list,
&uc_mgr->value_list);
- if (err >= 0) {
- list_del(&xold->active_list);
- list_add_tail(&xnew->active_list, &uc_mgr->active_modifiers);
- }
- seq_found = 1;
- break;
- }
- }
- if (!seq_found) {
- err = set_modifier(uc_mgr, xold, 0);
- if (err < 0)
- return err;
- err = set_modifier(uc_mgr, xnew, 1);
- if (err < 0)
- return err;
- }
- return err;
+ if (err >= 0) {
+ list_del(&xold->active_list);
+ list_add_tail(&xnew->active_list, &uc_mgr->active_modifiers);
+ }
+ seq_found = 1;
+ break;
+ }
+ }
+ if (!seq_found) {
+ err = set_modifier(uc_mgr, xold, 0);
+ if (err < 0)
+ return err;
+ err = set_modifier(uc_mgr, xnew, 1);
+ if (err < 0)
+ return err;
+ }
+ return err;
}
/**
* \return Zero if success, otherwise a negative error code
*/
int snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
- const char *identifier,
- const char *value)
+ const char *identifier,
+ const char *value)
{
char *str, *str1;
int err = 0;
else if (strcmp(identifier, "_defaults") == 0)
err = set_defaults_user(uc_mgr, value);
else if (strcmp(identifier, "_verb") == 0)
- err = set_verb_user(uc_mgr, value);
- else if (strcmp(identifier, "_enadev") == 0)
- err = set_device_user(uc_mgr, value, 1);
- else if (strcmp(identifier, "_disdev") == 0)
- err = set_device_user(uc_mgr, value, 0);
- else if (strcmp(identifier, "_enamod") == 0)
- err = set_modifier_user(uc_mgr, value, 1);
- else if (strcmp(identifier, "_dismod") == 0)
- err = set_modifier_user(uc_mgr, value, 0);
- else {
- str1 = strchr(identifier, '/');
- if (str1) {
- str = strdup(str1 + 1);
- if (str == NULL) {
- err = -ENOMEM;
- goto __end;
- }
- } else {
- err = -EINVAL;
- goto __end;
- }
- if (check_identifier(identifier, "_swdev"))
- err = switch_device(uc_mgr, str, value);
- else if (check_identifier(identifier, "_swmod"))
- err = switch_modifier(uc_mgr, str, value);
- else
- err = -EINVAL;
- if (str)
- free(str);
- }
+ err = set_verb_user(uc_mgr, value);
+ else if (strcmp(identifier, "_enadev") == 0)
+ err = set_device_user(uc_mgr, value, 1);
+ else if (strcmp(identifier, "_disdev") == 0)
+ err = set_device_user(uc_mgr, value, 0);
+ else if (strcmp(identifier, "_enamod") == 0)
+ err = set_modifier_user(uc_mgr, value, 1);
+ else if (strcmp(identifier, "_dismod") == 0)
+ err = set_modifier_user(uc_mgr, value, 0);
+ else {
+ str1 = strchr(identifier, '/');
+ if (str1) {
+ str = strdup(str1 + 1);
+ if (str == NULL) {
+ err = -ENOMEM;
+ goto __end;
+ }
+ } else {
+ err = -EINVAL;
+ goto __end;
+ }
+ if (check_identifier(identifier, "_swdev"))
+ err = switch_device(uc_mgr, str, value);
+ else if (check_identifier(identifier, "_swmod"))
+ err = switch_modifier(uc_mgr, str, value);
+ else
+ err = -EINVAL;
+ if (str)
+ free(str);
+ }
__end:
pthread_mutex_unlock(&uc_mgr->mutex);
- return err;
+ return err;
}
/**