Skip to content

Commit

Permalink
ucm: add snd_use_case_parse_selem_id()
Browse files Browse the repository at this point in the history
and add strict ucm_id checks to snd_use_case_parse_ctl_elem_id()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
  • Loading branch information
perexg committed Nov 14, 2019
1 parent 4ce38a5 commit 5c88b18
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 4 deletions.
13 changes: 12 additions & 1 deletion include/use-case.h
Original file line number Diff line number Diff line change
Expand Up @@ -447,8 +447,19 @@ static __inline__ int snd_use_case_verb_list(snd_use_case_mgr_t *uc_mgr,
* \return Zero if success, otherwise a negative error code
*/
int snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
const char *ucm_id, char *value);
const char *ucm_id,
const char *value);

/**
* \brief Parse mixer element identifier
* \param dst Simple mixer element identifier
* \param ucm_id Use case identifier
* \param value String value to be parsed
* \return Zero if success, otherwise a negative error code
*/
int snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
const char *ucm_id,
const char *value);

/**
* \}
Expand Down
32 changes: 29 additions & 3 deletions src/ucm/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1929,17 +1929,43 @@ int snd_use_case_set(snd_use_case_mgr_t *uc_mgr,
* \return Zero if success, otherwise a negative error code
*/
int snd_use_case_parse_ctl_elem_id(snd_ctl_elem_id_t *dst,
const char *ucm_id, char *value)
const char *ucm_id,
const char *value)
{
snd_ctl_elem_iface_t iface;

int jack_control;

jack_control = strcmp(ucm_id, "JackControl") == 0;
if (!jack_control &&
strcmp(ucm_id, "PlaybackVolume") &&
strcmp(ucm_id, "PlaybackSwitch") &&
strcmp(ucm_id, "CaptureVolume") &&
strcmp(ucm_id, "CaptureSwitch"))
return -EINVAL;
snd_ctl_elem_id_clear(dst);
if (strcasestr(ucm_id, "name="))
return __snd_ctl_ascii_elem_id_parse(dst, value, NULL);
iface = SND_CTL_ELEM_IFACE_MIXER;
if (strcasecmp(ucm_id, "JackControl") == 0)
if (jack_control)
iface = SND_CTL_ELEM_IFACE_CARD;
snd_ctl_elem_id_set_interface(dst, iface);
snd_ctl_elem_id_set_name(dst, value);
return 0;
}

/**
* \brief Parse mixer element identifier
* \param dst Simple mixer element identifier
* \param ucm_id Use case identifier
* \param value String value to be parsed
* \return Zero if success, otherwise a negative error code
*/
int snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
const char *ucm_id,
const char *value)
{
if (strcmp(ucm_id, "PlaybackMixerId") == 0 ||
strcmp(ucm_id, "CaptureMixerId") == 0)
return snd_mixer_selem_id_parse(dst, value);
return -EINVAL;
}

0 comments on commit 5c88b18

Please sign in to comment.