mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-11-03 09:01:52 -05:00 
			
		
		
		
	ucm: save the whole ctl info to the ctl_list structure
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
		
							parent
							
								
									0dd89f3892
								
							
						
					
					
						commit
						d8dfe4dac7
					
				
					 4 changed files with 47 additions and 37 deletions
				
			
		| 
						 | 
					@ -1361,35 +1361,32 @@ static char *rval_conf_name(snd_use_case_mgr_t *uc_mgr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *rval_card_id(snd_use_case_mgr_t *uc_mgr)
 | 
					static char *rval_card_id(snd_use_case_mgr_t *uc_mgr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct list_head *pos;
 | 
						struct ctl_list *ctl_list;
 | 
				
			||||||
	struct ctl_list *ctl_list = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	list_for_each(pos, &uc_mgr->ctl_list) {
 | 
					 | 
				
			||||||
		if (ctl_list) {
 | 
					 | 
				
			||||||
			uc_error("multiple control device names were found!");
 | 
					 | 
				
			||||||
			return NULL;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ctl_list = list_entry(pos, struct ctl_list, list);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctl_list = uc_mgr_get_one_ctl(uc_mgr);
 | 
				
			||||||
	if (ctl_list == NULL)
 | 
						if (ctl_list == NULL)
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
 | 
						return strdup(snd_ctl_card_info_get_id(ctl_list->ctl_info));
 | 
				
			||||||
	return strdup(ctl_list->ctl_id);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *rval_card_name(snd_use_case_mgr_t *uc_mgr)
 | 
					static char *rval_card_name(snd_use_case_mgr_t *uc_mgr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (uc_mgr->card_short_name)
 | 
						struct ctl_list *ctl_list;
 | 
				
			||||||
		return strdup(uc_mgr->card_short_name);
 | 
					
 | 
				
			||||||
 | 
						ctl_list = uc_mgr_get_one_ctl(uc_mgr);
 | 
				
			||||||
 | 
						if (ctl_list == NULL)
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
 | 
						return strdup(snd_ctl_card_info_get_name(ctl_list->ctl_info));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *rval_card_longname(snd_use_case_mgr_t *uc_mgr)
 | 
					static char *rval_card_longname(snd_use_case_mgr_t *uc_mgr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (uc_mgr->card_long_name[0])
 | 
						struct ctl_list *ctl_list;
 | 
				
			||||||
		return strdup(uc_mgr->card_long_name);
 | 
					
 | 
				
			||||||
 | 
						ctl_list = uc_mgr_get_one_ctl(uc_mgr);
 | 
				
			||||||
 | 
						if (ctl_list == NULL)
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
 | 
						return strdup(snd_ctl_card_info_get_longname(ctl_list->ctl_info));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *rval_env(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char *id)
 | 
					static char *rval_env(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char *id)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1437,7 +1437,7 @@ static int get_card_info(snd_use_case_mgr_t *mgr,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* find the card in the local machine and store the card long name */
 | 
					/* find the card in the local machine and store the card long name */
 | 
				
			||||||
static int get_card_long_name(snd_use_case_mgr_t *mgr)
 | 
					static int get_card_long_name(snd_use_case_mgr_t *mgr, char *longname)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char *card_name = mgr->card_name;
 | 
						const char *card_name = mgr->card_name;
 | 
				
			||||||
	int card, err;
 | 
						int card, err;
 | 
				
			||||||
| 
						 | 
					@ -1464,8 +1464,7 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr)
 | 
				
			||||||
			_long_name = snd_ctl_card_info_get_longname(info);
 | 
								_long_name = snd_ctl_card_info_get_longname(info);
 | 
				
			||||||
			if (!strcmp(card_name, _name) ||
 | 
								if (!strcmp(card_name, _name) ||
 | 
				
			||||||
			    !strcmp(card_name, _long_name)) {
 | 
								    !strcmp(card_name, _long_name)) {
 | 
				
			||||||
				snd_strlcpy(mgr->card_short_name, _name, sizeof(mgr->card_short_name));
 | 
									snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
 | 
				
			||||||
				snd_strlcpy(mgr->card_long_name, _long_name, sizeof(mgr->card_long_name));
 | 
					 | 
				
			||||||
				return 0;
 | 
									return 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1480,7 +1479,7 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* set the driver name and long name by the card ctl name */
 | 
					/* set the driver name and long name by the card ctl name */
 | 
				
			||||||
static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name)
 | 
					static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name, char *longname)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	snd_ctl_t *ctl;
 | 
						snd_ctl_t *ctl;
 | 
				
			||||||
	snd_ctl_card_info_t *info;
 | 
						snd_ctl_card_info_t *info;
 | 
				
			||||||
| 
						 | 
					@ -1495,10 +1494,8 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_name = snd_ctl_card_info_get_name(info);
 | 
						_name = snd_ctl_card_info_get_name(info);
 | 
				
			||||||
	_long_name = snd_ctl_card_info_get_longname(info);
 | 
						_long_name = snd_ctl_card_info_get_longname(info);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	snd_strlcpy(mgr->card_short_name, _name, sizeof(mgr->card_short_name));
 | 
					 | 
				
			||||||
	snd_strlcpy(mgr->card_long_name, _long_name, sizeof(mgr->card_long_name));
 | 
					 | 
				
			||||||
	snd_strlcpy(mgr->conf_file_name, _name, sizeof(mgr->conf_file_name));
 | 
						snd_strlcpy(mgr->conf_file_name, _name, sizeof(mgr->conf_file_name));
 | 
				
			||||||
 | 
						snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1550,26 +1547,27 @@ int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	snd_config_t *cfg;
 | 
						snd_config_t *cfg;
 | 
				
			||||||
	const char *name = uc_mgr->card_name;
 | 
						const char *name = uc_mgr->card_name;
 | 
				
			||||||
 | 
						char longname[MAX_CARD_LONG_NAME];
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_name, sizeof(uc_mgr->conf_file_name));
 | 
						snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_name, sizeof(uc_mgr->conf_file_name));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strncmp(name, "hw:", 3) == 0) {
 | 
						if (strncmp(name, "hw:", 3) == 0) {
 | 
				
			||||||
		err = get_by_card(uc_mgr, name);
 | 
							err = get_by_card(uc_mgr, name, longname);
 | 
				
			||||||
		if (err == 0)
 | 
							if (err == 0)
 | 
				
			||||||
			goto __longname;
 | 
								goto __longname;
 | 
				
			||||||
		uc_error("card '%s' is not valid", name);
 | 
							uc_error("card '%s' is not valid", name);
 | 
				
			||||||
		goto __error;
 | 
							goto __error;
 | 
				
			||||||
	} else if (strncmp(name, "strict:", 7)) {
 | 
						} else if (strncmp(name, "strict:", 7)) {
 | 
				
			||||||
		err = get_card_long_name(uc_mgr);
 | 
							err = get_card_long_name(uc_mgr, longname);
 | 
				
			||||||
		if (err == 0) { /* load file that matches the card long name */
 | 
							if (err == 0) { /* load file that matches the card long name */
 | 
				
			||||||
__longname:
 | 
					__longname:
 | 
				
			||||||
			err = load_master_config(uc_mgr, uc_mgr->card_long_name, &cfg, 1);
 | 
								err = load_master_config(uc_mgr, longname, &cfg, 1);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (err == 0) {
 | 
							if (err == 0) {
 | 
				
			||||||
			/* got device-specific file that matches the card long name */
 | 
								/* got device-specific file that matches the card long name */
 | 
				
			||||||
			snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_long_name, sizeof(uc_mgr->conf_file_name));
 | 
								snd_strlcpy(uc_mgr->conf_file_name, longname, sizeof(uc_mgr->conf_file_name));
 | 
				
			||||||
			goto __parse;
 | 
								goto __parse;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,8 +114,8 @@ struct ctl_dev {
 | 
				
			||||||
struct ctl_list {
 | 
					struct ctl_list {
 | 
				
			||||||
	struct list_head list;
 | 
						struct list_head list;
 | 
				
			||||||
	struct list_head dev_list;
 | 
						struct list_head dev_list;
 | 
				
			||||||
	char *ctl_id;
 | 
					 | 
				
			||||||
	snd_ctl_t *ctl;
 | 
						snd_ctl_t *ctl;
 | 
				
			||||||
 | 
						snd_ctl_card_info_t *ctl_info;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -205,8 +205,6 @@ struct use_case_verb {
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct snd_use_case_mgr {
 | 
					struct snd_use_case_mgr {
 | 
				
			||||||
	char *card_name;
 | 
						char *card_name;
 | 
				
			||||||
	char card_short_name[MAX_CARD_SHORT_NAME];
 | 
					 | 
				
			||||||
	char card_long_name[MAX_CARD_LONG_NAME];
 | 
					 | 
				
			||||||
	char conf_file_name[MAX_CARD_LONG_NAME];
 | 
						char conf_file_name[MAX_CARD_LONG_NAME];
 | 
				
			||||||
	char *comment;
 | 
						char *comment;
 | 
				
			||||||
	int conf_format;
 | 
						int conf_format;
 | 
				
			||||||
| 
						 | 
					@ -264,6 +262,7 @@ int uc_mgr_open_ctl(snd_use_case_mgr_t *uc_mgr,
 | 
				
			||||||
                    snd_ctl_t **ctl,
 | 
					                    snd_ctl_t **ctl,
 | 
				
			||||||
                    const char *device);
 | 
					                    const char *device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ctl_list *uc_mgr_get_one_ctl(snd_use_case_mgr_t *uc_mgr);
 | 
				
			||||||
void uc_mgr_free_ctl_list(snd_use_case_mgr_t *uc_mgr);
 | 
					void uc_mgr_free_ctl_list(snd_use_case_mgr_t *uc_mgr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** The name of the environment variable containing the UCM directory */
 | 
					/** The name of the environment variable containing the UCM directory */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,6 +49,21 @@ void uc_mgr_stdout(const char *fmt,...)
 | 
				
			||||||
	va_end(va);
 | 
						va_end(va);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ctl_list *uc_mgr_get_one_ctl(snd_use_case_mgr_t *uc_mgr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct list_head *pos;
 | 
				
			||||||
 | 
						struct ctl_list *ctl_list = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						list_for_each(pos, &uc_mgr->ctl_list) {
 | 
				
			||||||
 | 
							if (ctl_list) {
 | 
				
			||||||
 | 
								uc_error("multiple control device names were found!");
 | 
				
			||||||
 | 
								return NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctl_list = list_entry(pos, struct ctl_list, list);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ctl_list;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void uc_mgr_free_ctl(struct ctl_list *ctl_list)
 | 
					static void uc_mgr_free_ctl(struct ctl_list *ctl_list)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct list_head *pos, *npos;
 | 
						struct list_head *pos, *npos;
 | 
				
			||||||
| 
						 | 
					@ -59,7 +74,7 @@ static void uc_mgr_free_ctl(struct ctl_list *ctl_list)
 | 
				
			||||||
		free(ctl_dev->device);
 | 
							free(ctl_dev->device);
 | 
				
			||||||
		free(ctl_dev);
 | 
							free(ctl_dev);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	free(ctl_list->ctl_id);
 | 
						snd_ctl_card_info_free(ctl_list->ctl_info);
 | 
				
			||||||
	free(ctl_list);
 | 
						free(ctl_list);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,7 +118,8 @@ static int uc_mgr_ctl_add_dev(struct ctl_list *ctl_list, const char *device)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int uc_mgr_ctl_add(snd_use_case_mgr_t *uc_mgr,
 | 
					static int uc_mgr_ctl_add(snd_use_case_mgr_t *uc_mgr,
 | 
				
			||||||
			  struct ctl_list *ctl_list,
 | 
								  struct ctl_list *ctl_list,
 | 
				
			||||||
			  snd_ctl_t *ctl, int card, snd_ctl_card_info_t *info,
 | 
								  snd_ctl_t *ctl, int card,
 | 
				
			||||||
 | 
								  snd_ctl_card_info_t *info,
 | 
				
			||||||
			  const char *device)
 | 
								  const char *device)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ctl_list *cl = NULL;
 | 
						struct ctl_list *cl = NULL;
 | 
				
			||||||
| 
						 | 
					@ -119,11 +135,11 @@ static int uc_mgr_ctl_add(snd_use_case_mgr_t *uc_mgr,
 | 
				
			||||||
			return -ENOMEM;
 | 
								return -ENOMEM;
 | 
				
			||||||
		INIT_LIST_HEAD(&cl->dev_list);
 | 
							INIT_LIST_HEAD(&cl->dev_list);
 | 
				
			||||||
		cl->ctl = ctl;
 | 
							cl->ctl = ctl;
 | 
				
			||||||
		cl->ctl_id = strdup(id);
 | 
							if (snd_ctl_card_info_malloc(&cl->ctl_info) < 0) {
 | 
				
			||||||
		if (cl->ctl_id == NULL) {
 | 
					 | 
				
			||||||
			free(cl);
 | 
								free(cl);
 | 
				
			||||||
			return -ENOMEM;
 | 
								return -ENOMEM;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							snd_ctl_card_info_copy(cl->ctl_info, info);
 | 
				
			||||||
		ctl_list = cl;
 | 
							ctl_list = cl;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (card >= 0) {
 | 
						if (card >= 0) {
 | 
				
			||||||
| 
						 | 
					@ -197,7 +213,7 @@ int uc_mgr_open_ctl(snd_use_case_mgr_t *uc_mgr,
 | 
				
			||||||
	/* insert to cache, if just name differs */
 | 
						/* insert to cache, if just name differs */
 | 
				
			||||||
	list_for_each(pos1, &uc_mgr->ctl_list) {
 | 
						list_for_each(pos1, &uc_mgr->ctl_list) {
 | 
				
			||||||
		ctl_list = list_entry(pos1, struct ctl_list, list);
 | 
							ctl_list = list_entry(pos1, struct ctl_list, list);
 | 
				
			||||||
		if (strcmp(id, ctl_list->ctl_id) == 0) {
 | 
							if (strcmp(id, snd_ctl_card_info_get_id(ctl_list->ctl_info)) == 0) {
 | 
				
			||||||
			card = snd_card_get_index(id);
 | 
								card = snd_card_get_index(id);
 | 
				
			||||||
			err = uc_mgr_ctl_add(uc_mgr, ctl_list, *ctl, card, info, device);
 | 
								err = uc_mgr_ctl_add(uc_mgr, ctl_list, *ctl, card, info, device);
 | 
				
			||||||
			if (err < 0)
 | 
								if (err < 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue