mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2026-03-06 01:40:09 -05:00
ucm: add a basic set of trace/debug log calls
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
66a3d542ac
commit
11235095bf
4 changed files with 69 additions and 15 deletions
|
|
@ -165,8 +165,8 @@ static int read_tlv_file(unsigned int **res,
|
||||||
const char *filepath)
|
const char *filepath)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int fd;
|
int fd = -1;
|
||||||
struct stat64 st;
|
struct stat64 st = { 0 };
|
||||||
size_t sz;
|
size_t sz;
|
||||||
ssize_t sz_read;
|
ssize_t sz_read;
|
||||||
struct snd_ctl_tlv *tlv;
|
struct snd_ctl_tlv *tlv;
|
||||||
|
|
@ -174,7 +174,7 @@ static int read_tlv_file(unsigned int **res,
|
||||||
fd = open(filepath, O_RDONLY);
|
fd = open(filepath, O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
return err;
|
goto __fail;
|
||||||
}
|
}
|
||||||
if (fstat64(fd, &st) == -1) {
|
if (fstat64(fd, &st) == -1) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
|
|
@ -208,7 +208,9 @@ static int read_tlv_file(unsigned int **res,
|
||||||
}
|
}
|
||||||
|
|
||||||
__fail:
|
__fail:
|
||||||
close(fd);
|
if (fd >= 0)
|
||||||
|
close(fd);
|
||||||
|
snd_trace(UCM, "read TLV from '%s' (size %llu)", filepath, (long long int)st.st_size);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -217,8 +219,8 @@ static int binary_file_parse(snd_ctl_elem_value_t *dst,
|
||||||
const char *filepath)
|
const char *filepath)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int fd;
|
int fd = -1;
|
||||||
struct stat64 st;
|
struct stat64 st = { 0 };
|
||||||
size_t sz;
|
size_t sz;
|
||||||
ssize_t sz_read;
|
ssize_t sz_read;
|
||||||
char *res;
|
char *res;
|
||||||
|
|
@ -229,12 +231,12 @@ static int binary_file_parse(snd_ctl_elem_value_t *dst,
|
||||||
if (type != SND_CTL_ELEM_TYPE_BYTES) {
|
if (type != SND_CTL_ELEM_TYPE_BYTES) {
|
||||||
uc_error("only support byte type!");
|
uc_error("only support byte type!");
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
return err;
|
goto __fail;
|
||||||
}
|
}
|
||||||
fd = open(filepath, O_RDONLY);
|
fd = open(filepath, O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
return err;
|
goto __fail;
|
||||||
}
|
}
|
||||||
if (stat64(filepath, &st) == -1) {
|
if (stat64(filepath, &st) == -1) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
|
|
@ -262,7 +264,9 @@ static int binary_file_parse(snd_ctl_elem_value_t *dst,
|
||||||
__fail_read:
|
__fail_read:
|
||||||
free(res);
|
free(res);
|
||||||
__fail:
|
__fail:
|
||||||
close(fd);
|
if (fd >= 0)
|
||||||
|
close(fd);
|
||||||
|
snd_trace(UCM, "read binary data from '%s' (size %llu)", filepath, (long long int)st.st_size);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -408,6 +412,8 @@ static int execute_cset(snd_ctl_t *ctl, const char *cset, unsigned int type)
|
||||||
snd_ctl_elem_info_t *info, *info2 = NULL;
|
snd_ctl_elem_info_t *info, *info2 = NULL;
|
||||||
unsigned int *res = NULL;
|
unsigned int *res = NULL;
|
||||||
|
|
||||||
|
snd_trace(UCM, "execute cset [%d] '%s'", type, cset);
|
||||||
|
|
||||||
snd_ctl_elem_id_malloc(&id);
|
snd_ctl_elem_id_malloc(&id);
|
||||||
snd_ctl_elem_value_malloc(&value);
|
snd_ctl_elem_value_malloc(&value);
|
||||||
snd_ctl_elem_info_malloc(&info);
|
snd_ctl_elem_info_malloc(&info);
|
||||||
|
|
@ -526,6 +532,8 @@ static int execute_sysw(const char *sysw)
|
||||||
int fd, myerrno;
|
int fd, myerrno;
|
||||||
bool ignore_error = false;
|
bool ignore_error = false;
|
||||||
|
|
||||||
|
snd_trace(UCM, "execute sysw '%s'", sysw);
|
||||||
|
|
||||||
if (sysw == NULL || *sysw == '\0')
|
if (sysw == NULL || *sysw == '\0')
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
@ -597,6 +605,8 @@ static int execute_cfgsave(snd_use_case_mgr_t *uc_mgr, const char *filename)
|
||||||
bool with_root = false;
|
bool with_root = false;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
snd_trace(UCM, "execute cfgsave to '%s'", filename);
|
||||||
|
|
||||||
file = strdup(filename);
|
file = strdup(filename);
|
||||||
if (!file)
|
if (!file)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
@ -678,6 +688,8 @@ static int run_device_sequence(snd_use_case_mgr_t *uc_mgr, struct use_case_verb
|
||||||
{
|
{
|
||||||
struct use_case_device *device;
|
struct use_case_device *device;
|
||||||
|
|
||||||
|
snd_trace(UCM, "device sequence '%s/%s': %s", verb->name, name, uc_mgr_enable_str(enable));
|
||||||
|
|
||||||
if (verb == NULL) {
|
if (verb == NULL) {
|
||||||
uc_error("error: enadev2 / disdev2 must be executed inside the verb context");
|
uc_error("error: enadev2 / disdev2 must be executed inside the verb context");
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
@ -702,6 +714,8 @@ static int run_device_all_sequence(snd_use_case_mgr_t *uc_mgr, struct use_case_v
|
||||||
struct list_head *pos;
|
struct list_head *pos;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
snd_trace(UCM, "disable all devices sequence for '%s'", verb->name);
|
||||||
|
|
||||||
if (verb == NULL) {
|
if (verb == NULL) {
|
||||||
uc_error("error: disdevall must be executed inside the verb context");
|
uc_error("error: disdevall must be executed inside the verb context");
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
@ -835,6 +849,7 @@ static int execute_sequence(snd_use_case_mgr_t *uc_mgr,
|
||||||
goto __fail;
|
goto __fail;
|
||||||
break;
|
break;
|
||||||
case SEQUENCE_ELEMENT_TYPE_SLEEP:
|
case SEQUENCE_ELEMENT_TYPE_SLEEP:
|
||||||
|
snd_trace(UCM, "sleeping %li", s->data.sleep);
|
||||||
usleep(s->data.sleep);
|
usleep(s->data.sleep);
|
||||||
break;
|
break;
|
||||||
case SEQUENCE_ELEMENT_TYPE_EXEC:
|
case SEQUENCE_ELEMENT_TYPE_EXEC:
|
||||||
|
|
@ -852,6 +867,7 @@ static int execute_sequence(snd_use_case_mgr_t *uc_mgr,
|
||||||
break;
|
break;
|
||||||
ignore_error = s->data.exec[0] == '-';
|
ignore_error = s->data.exec[0] == '-';
|
||||||
shell_retry:
|
shell_retry:
|
||||||
|
snd_debug(UCM, "system command '%s'", s->data.exec + (ignore_error ? 1 : 0));
|
||||||
err = system(s->data.exec + (ignore_error ? 1 : 0));
|
err = system(s->data.exec + (ignore_error ? 1 : 0));
|
||||||
if (WIFSIGNALED(err)) {
|
if (WIFSIGNALED(err)) {
|
||||||
err = -EINTR;
|
err = -EINTR;
|
||||||
|
|
@ -935,6 +951,9 @@ static int execute_component_seq(snd_use_case_mgr_t *uc_mgr,
|
||||||
struct list_head *seq;
|
struct list_head *seq;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
snd_trace(UCM, "execute component sequence '%s': %s", cmpt_seq->device ?
|
||||||
|
cmpt_seq->device->name : NULL, uc_mgr_enable_str(cmpt_seq->enable));
|
||||||
|
|
||||||
/* enter component domain and store cdev for the component */
|
/* enter component domain and store cdev for the component */
|
||||||
uc_mgr->in_component_domain = 1;
|
uc_mgr->in_component_domain = 1;
|
||||||
uc_mgr->cdev = cdev;
|
uc_mgr->cdev = cdev;
|
||||||
|
|
@ -1511,6 +1530,8 @@ int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr,
|
||||||
snd_use_case_mgr_t *mgr;
|
snd_use_case_mgr_t *mgr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} open '%s'", card_name);
|
||||||
|
|
||||||
/* create a new UCM */
|
/* create a new UCM */
|
||||||
mgr = calloc(1, sizeof(snd_use_case_mgr_t));
|
mgr = calloc(1, sizeof(snd_use_case_mgr_t));
|
||||||
if (mgr == NULL)
|
if (mgr == NULL)
|
||||||
|
|
@ -1563,11 +1584,13 @@ int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr,
|
||||||
}
|
}
|
||||||
|
|
||||||
*uc_mgr = mgr;
|
*uc_mgr = mgr;
|
||||||
|
snd_trace(UCM, "{API call} open '%s' succeed", card_name);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
uc_mgr_card_close(mgr);
|
uc_mgr_card_close(mgr);
|
||||||
uc_mgr_free(mgr);
|
uc_mgr_free(mgr);
|
||||||
|
snd_trace(UCM, "{API call} open '%s' failed: %s", card_name, snd_strerror(err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1575,6 +1598,8 @@ int snd_use_case_mgr_reload(snd_use_case_mgr_t *uc_mgr)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} reload");
|
||||||
|
|
||||||
pthread_mutex_lock(&uc_mgr->mutex);
|
pthread_mutex_lock(&uc_mgr->mutex);
|
||||||
|
|
||||||
do_reset(uc_mgr);
|
do_reset(uc_mgr);
|
||||||
|
|
@ -2079,10 +2104,12 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
|
||||||
const char **list[])
|
const char **list[])
|
||||||
{
|
{
|
||||||
char *str, *str1;
|
char *str, *str1;
|
||||||
int err;
|
int err, i;
|
||||||
|
|
||||||
if (uc_mgr == NULL || identifier == NULL)
|
if (uc_mgr == NULL || identifier == NULL) {
|
||||||
return uc_mgr_scan_master_configs(list);
|
err = uc_mgr_scan_master_configs(list);
|
||||||
|
goto __end_unlocked;
|
||||||
|
}
|
||||||
pthread_mutex_lock(&uc_mgr->mutex);
|
pthread_mutex_lock(&uc_mgr->mutex);
|
||||||
if (strcmp(identifier, "_verbs") == 0)
|
if (strcmp(identifier, "_verbs") == 0)
|
||||||
err = get_verb_list(uc_mgr, list);
|
err = get_verb_list(uc_mgr, list);
|
||||||
|
|
@ -2120,6 +2147,10 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
|
||||||
}
|
}
|
||||||
__end:
|
__end:
|
||||||
pthread_mutex_unlock(&uc_mgr->mutex);
|
pthread_mutex_unlock(&uc_mgr->mutex);
|
||||||
|
__end_unlocked:
|
||||||
|
snd_trace(UCM, "{API call} get list '%s': %d (%s)", identifier, err, snd_strerror(err));
|
||||||
|
for (i = 0; i < err; i++)
|
||||||
|
snd_trace(UCM, " [%d]='%s'", i, (*list)[i]);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2374,6 +2405,7 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
|
||||||
}
|
}
|
||||||
__end:
|
__end:
|
||||||
pthread_mutex_unlock(&uc_mgr->mutex);
|
pthread_mutex_unlock(&uc_mgr->mutex);
|
||||||
|
snd_trace(UCM, "{API call} get string '%s'='%s' (error %s)", identifier, err >= 0 ? *value : NULL, snd_strerror(err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2436,6 +2468,7 @@ int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
|
||||||
}
|
}
|
||||||
__end:
|
__end:
|
||||||
pthread_mutex_unlock(&uc_mgr->mutex);
|
pthread_mutex_unlock(&uc_mgr->mutex);
|
||||||
|
snd_trace(UCM, "{API call} get integer '%s'=%li (error %s)", identifier, err >= 0 ? *value : -1, snd_strerror(err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2518,6 +2551,8 @@ static int set_verb_user(snd_use_case_mgr_t *uc_mgr,
|
||||||
struct use_case_verb *verb;
|
struct use_case_verb *verb;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} set verb '%s'", verb_name);
|
||||||
|
|
||||||
if (uc_mgr->active_verb &&
|
if (uc_mgr->active_verb &&
|
||||||
strcmp(uc_mgr->active_verb->name, verb_name) == 0)
|
strcmp(uc_mgr->active_verb->name, verb_name) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -2557,6 +2592,7 @@ static int set_device_user(snd_use_case_mgr_t *uc_mgr,
|
||||||
{
|
{
|
||||||
struct use_case_device *device;
|
struct use_case_device *device;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} set device '%s'", device_name);
|
||||||
if (uc_mgr->active_verb == NULL)
|
if (uc_mgr->active_verb == NULL)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
device = find_device(uc_mgr, uc_mgr->active_verb, device_name, 1);
|
device = find_device(uc_mgr, uc_mgr->active_verb, device_name, 1);
|
||||||
|
|
@ -2571,6 +2607,8 @@ static int set_modifier_user(snd_use_case_mgr_t *uc_mgr,
|
||||||
{
|
{
|
||||||
struct use_case_modifier *modifier;
|
struct use_case_modifier *modifier;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} set modifier '%s': %s", modifier_name, uc_mgr_enable_str(enable));
|
||||||
|
|
||||||
if (uc_mgr->active_verb == NULL)
|
if (uc_mgr->active_verb == NULL)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
|
|
@ -2589,6 +2627,7 @@ static int switch_device(snd_use_case_mgr_t *uc_mgr,
|
||||||
struct list_head *pos;
|
struct list_head *pos;
|
||||||
int err, seq_found = 0;
|
int err, seq_found = 0;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} switch device '%s'->'%s'", old_device, new_device);
|
||||||
if (uc_mgr->active_verb == NULL)
|
if (uc_mgr->active_verb == NULL)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
if (device_status(uc_mgr, old_device) == 0) {
|
if (device_status(uc_mgr, old_device) == 0) {
|
||||||
|
|
@ -2644,6 +2683,7 @@ static int switch_modifier(snd_use_case_mgr_t *uc_mgr,
|
||||||
struct list_head *pos;
|
struct list_head *pos;
|
||||||
int err, seq_found = 0;
|
int err, seq_found = 0;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} switch modifier '%s'->'%s'", old_modifier, new_modifier);
|
||||||
if (uc_mgr->active_verb == NULL)
|
if (uc_mgr->active_verb == NULL)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
if (modifier_status(uc_mgr, old_modifier) == 0) {
|
if (modifier_status(uc_mgr, old_modifier) == 0) {
|
||||||
|
|
@ -2695,6 +2735,7 @@ int snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
|
||||||
char *str, *str1;
|
char *str, *str1;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
snd_trace(UCM, "{API call} set '%s'='%s'", identifier, value);
|
||||||
pthread_mutex_lock(&uc_mgr->mutex);
|
pthread_mutex_lock(&uc_mgr->mutex);
|
||||||
if (strcmp(identifier, "_fboot") == 0)
|
if (strcmp(identifier, "_fboot") == 0)
|
||||||
err = set_fixedboot_user(uc_mgr, value);
|
err = set_fixedboot_user(uc_mgr, value);
|
||||||
|
|
|
||||||
|
|
@ -191,8 +191,12 @@ int uc_mgr_exec(const char *prog)
|
||||||
sigset_t omask;
|
sigset_t omask;
|
||||||
char **argv;
|
char **argv;
|
||||||
|
|
||||||
if (parse_args(&argv, 32, prog))
|
snd_debug(UCM, "executing '%s'\n", prog);
|
||||||
|
|
||||||
|
if (parse_args(&argv, 32, prog)) {
|
||||||
|
snd_info(UCM, "unable to parse exec arguments for '%s'", prog);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
prog = argv[0];
|
prog = argv[0];
|
||||||
if (prog == NULL) {
|
if (prog == NULL) {
|
||||||
|
|
@ -201,6 +205,7 @@ int uc_mgr_exec(const char *prog)
|
||||||
}
|
}
|
||||||
if (prog[0] != '/' && prog[0] != '.') {
|
if (prog[0] != '/' && prog[0] != '.') {
|
||||||
if (!find_exec(argv[0], bin, sizeof(bin))) {
|
if (!find_exec(argv[0], bin, sizeof(bin))) {
|
||||||
|
snd_warn(UCM, "unable to find executable '%s'", argv[0]);
|
||||||
err = -ENOEXEC;
|
err = -ENOEXEC;
|
||||||
goto __error;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
@ -231,8 +236,7 @@ int uc_mgr_exec(const char *prog)
|
||||||
if (p == -1) {
|
if (p == -1) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
pthread_mutex_unlock(&fork_lock);
|
pthread_mutex_unlock(&fork_lock);
|
||||||
uc_error("Unable to fork() for \"%s\" -- %s", prog,
|
uc_error("Unable to fork() for \"%s\" -- %s", prog, strerror(errno));
|
||||||
strerror(errno));
|
|
||||||
goto __error;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -321,6 +321,11 @@ static inline int uc_mgr_has_local_config(snd_use_case_mgr_t *uc_mgr)
|
||||||
snd_config_iterator_end(uc_mgr->local_config);
|
snd_config_iterator_end(uc_mgr->local_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const char *uc_mgr_enable_str(bool enable)
|
||||||
|
{
|
||||||
|
return enable ? "enable" : "disable";
|
||||||
|
}
|
||||||
|
|
||||||
int uc_mgr_card_open(snd_use_case_mgr_t *uc_mgr);
|
int uc_mgr_card_open(snd_use_case_mgr_t *uc_mgr);
|
||||||
void uc_mgr_card_close(snd_use_case_mgr_t *uc_mgr);
|
void uc_mgr_card_close(snd_use_case_mgr_t *uc_mgr);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -683,6 +683,8 @@ int uc_mgr_set_variable(snd_use_case_mgr_t *uc_mgr, const char *name,
|
||||||
struct ucm_value *curr;
|
struct ucm_value *curr;
|
||||||
char *val2;
|
char *val2;
|
||||||
|
|
||||||
|
snd_trace(UCM, "set variable '%s'='%s'", name, val);
|
||||||
|
|
||||||
list_for_each(pos, &uc_mgr->variable_list) {
|
list_for_each(pos, &uc_mgr->variable_list) {
|
||||||
curr = list_entry(pos, struct ucm_value, list);
|
curr = list_entry(pos, struct ucm_value, list);
|
||||||
if (strcmp(curr->name, name) == 0) {
|
if (strcmp(curr->name, name) == 0) {
|
||||||
|
|
@ -718,6 +720,8 @@ int uc_mgr_delete_variable(snd_use_case_mgr_t *uc_mgr, const char *name)
|
||||||
struct list_head *pos;
|
struct list_head *pos;
|
||||||
struct ucm_value *curr;
|
struct ucm_value *curr;
|
||||||
|
|
||||||
|
snd_trace(UCM, "delete variable '%s'", name);
|
||||||
|
|
||||||
list_for_each(pos, &uc_mgr->variable_list) {
|
list_for_each(pos, &uc_mgr->variable_list) {
|
||||||
curr = list_entry(pos, struct ucm_value, list);
|
curr = list_entry(pos, struct ucm_value, list);
|
||||||
if (strcmp(curr->name, name) == 0) {
|
if (strcmp(curr->name, name) == 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue