mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
ucm: Introduce "Value {}" section, more implementation work
- new "Value {}" section is introduced for read-only values
describing the PCM and control/mixer IDs (or any other
things)
- more complete implementation for API functions
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
1c79fad969
commit
404cd090b2
5 changed files with 855 additions and 1335 deletions
|
|
@ -179,9 +179,10 @@ char *snd_use_case_identifier(const char *fmt, ...);
|
|||
/**
|
||||
* \brief Free a string list
|
||||
* \param list The string list to free
|
||||
* \param items Count of strings
|
||||
* \return Zero if success, otherwise a negative error code
|
||||
*/
|
||||
int snd_use_case_free_list(const char *list[]);
|
||||
int snd_use_case_free_list(const char *list[], int items);
|
||||
|
||||
/**
|
||||
* \brief Obtain a list of entries
|
||||
|
|
@ -192,14 +193,14 @@ int snd_use_case_free_list(const char *list[]);
|
|||
*
|
||||
* Defined identifiers:
|
||||
* NULL - get card list
|
||||
* (in pair verb+comment)
|
||||
* (in pair cardname+comment)
|
||||
* _verbs - get verb list
|
||||
* (in pair verb+comment)
|
||||
* _devices[/<verb>] - get list of supported devices
|
||||
* (in pair device+comment)
|
||||
* _modifiers[/<verb>]- get list of supported modifiers
|
||||
* (in pair modifier+comment)
|
||||
* _tqs[/<verb>] - get list of QoS identifiers
|
||||
* TQ[/<verb>] - get list of TQ identifiers
|
||||
* _enadevs - get list of enabled devices
|
||||
* _enamods - get list of enabled modifiers
|
||||
*
|
||||
|
|
@ -222,20 +223,19 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
|
|||
* Known identifiers:
|
||||
* NULL - return current card
|
||||
* _verb - return current verb
|
||||
* _tq - return current Tone Quality
|
||||
* _tq/<modifier> - return Tone Quality for given modifier
|
||||
* _pcm_/_pdevice[/<modifier>] - full PCM playback device name
|
||||
* _pcm_/_cdevice[/<modifier>] - full PCM capture device name
|
||||
* _ctl_/_pctl_[/<modifier>] - playback control device name
|
||||
* _ctl_/_pctlvol[/<modifier>] - playback control volume ID string
|
||||
* _ctl_/_pctlsw[/<modifier>] - playback control switch ID string
|
||||
* _ctl_/_cctl[/<modifier>] - capture control device name
|
||||
* _ctl_/_cctlvol[/<modifier>] - capture control volume ID string
|
||||
* _ctl_/_cctlsw[/<modifier>] - capture control switch ID string
|
||||
* _mixer_/_pname[/<modifier>] - name of playback mixer
|
||||
* _mixer_/_pid[/<modifier>] - mixer playback ID
|
||||
* _mixer_/_cname[/<modifier>] - name of capture mixer
|
||||
* _mixer_/_cid[/<modifier>] - mixer capture ID
|
||||
* TQ[/<modifier>] - Tone Quality [for given modifier]
|
||||
* PlaybackPCM[/<modifier>] - full PCM playback device name
|
||||
* CapturePCM[/<modifier>] - full PCM capture device name
|
||||
* PlaybackCTL[/<modifier>] - playback control device name
|
||||
* PlaybackVolume[/<modifier>] - playback control volume ID string
|
||||
* PlaybackSwitch[/<modifier>] - playback control switch ID string
|
||||
* CaptureCTL[/<modifier>] - capture control device name
|
||||
* CaptureVolume[/<modifier>] - capture control volume ID string
|
||||
* CaptureSwitch[/<modifier>] - capture control switch ID string
|
||||
* PlaybackMixer[/<modifier>] - name of playback mixer
|
||||
* PlaybackMixerID[/<modifier>] - mixer playback ID
|
||||
* CaptureMixer[/<modifier>] - name of capture mixer
|
||||
* CaptureMixerID[/<modifier>] - mixer capture ID
|
||||
*/
|
||||
int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
|
||||
const char *identifier,
|
||||
|
|
@ -251,8 +251,8 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
|
|||
* _devstatus/<device> - return status for given device
|
||||
* _modstatus/<modifier> - return status for given modifier
|
||||
*/
|
||||
int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
|
||||
const char *identifier);
|
||||
long snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
|
||||
const char *identifier);
|
||||
|
||||
/**
|
||||
* \brief Set new
|
||||
|
|
@ -310,13 +310,6 @@ int snd_use_case_mgr_close(snd_use_case_mgr_t *uc_mgr);
|
|||
*/
|
||||
int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr);
|
||||
|
||||
/**
|
||||
* \brief Dump current sound card use case control settings
|
||||
* \param card_name Sound card name
|
||||
* \return zero if success, otherwise a negative error code
|
||||
*/
|
||||
int snd_use_case_dump(const char *card_name);
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
|||
1829
src/ucm/main.c
1829
src/ucm/main.c
File diff suppressed because it is too large
Load diff
242
src/ucm/parser.c
242
src/ucm/parser.c
|
|
@ -219,6 +219,88 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse values.
|
||||
*
|
||||
* Parse values describing PCM, control/mixer settings and stream parameters.
|
||||
*
|
||||
* Value {
|
||||
* TQ Voice
|
||||
* CapturePCM "hw:1"
|
||||
* PlaybackVolume "name='Master Playback Volume',index=2"
|
||||
* PlaybackSwitch "name='Master Playback Switch',index=2"
|
||||
* }
|
||||
*/
|
||||
static int parse_value(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED,
|
||||
struct list_head *base,
|
||||
snd_config_t *cfg)
|
||||
{
|
||||
struct ucm_value *curr;
|
||||
snd_config_iterator_t i, next, j, next2;
|
||||
snd_config_t *n, *n2;
|
||||
long l;
|
||||
long long ll;
|
||||
double d;
|
||||
snd_config_type_t type;
|
||||
int err;
|
||||
|
||||
snd_config_for_each(i, next, cfg) {
|
||||
n = snd_config_iterator_entry(i);
|
||||
snd_config_for_each(j, next2, n) {
|
||||
const char *id;
|
||||
n2 = snd_config_iterator_entry(i);
|
||||
err = snd_config_get_id(n2, &id);
|
||||
if (err < 0)
|
||||
continue;
|
||||
|
||||
/* alloc new value */
|
||||
curr = calloc(1, sizeof(struct ucm_value));
|
||||
if (curr == NULL)
|
||||
return -ENOMEM;
|
||||
list_add_tail(&curr->list, base);
|
||||
curr->name = strdup(id);
|
||||
if (curr->name == NULL)
|
||||
return -ENOMEM;
|
||||
type = snd_config_get_type(n2);
|
||||
switch (type) {
|
||||
case SND_CONFIG_TYPE_INTEGER:
|
||||
curr->data = malloc(16);
|
||||
if (curr->data == NULL)
|
||||
return -ENOMEM;
|
||||
snd_config_get_integer(n2, &l);
|
||||
sprintf(curr->data, "%li", l);
|
||||
break;
|
||||
case SND_CONFIG_TYPE_INTEGER64:
|
||||
curr->data = malloc(32);
|
||||
if (curr->data == NULL)
|
||||
return -ENOMEM;
|
||||
snd_config_get_integer64(n2, &ll);
|
||||
sprintf(curr->data, "%lli", ll);
|
||||
break;
|
||||
case SND_CONFIG_TYPE_REAL:
|
||||
curr->data = malloc(64);
|
||||
if (curr->data == NULL)
|
||||
return -ENOMEM;
|
||||
snd_config_get_real(n2, &d);
|
||||
sprintf(curr->data, "%-16g", d);
|
||||
break;
|
||||
case SND_CONFIG_TYPE_STRING:
|
||||
err = parse_string(n2, &curr->data);
|
||||
if (err < 0) {
|
||||
uc_error("error: unable to parse a string for id '%s'!", id);
|
||||
return err;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
uc_error("error: invalid type %i in Value compound", type);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse Modifier Use cases
|
||||
*
|
||||
|
|
@ -240,10 +322,12 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED,
|
|||
* ]
|
||||
*
|
||||
* # Optional TQ and ALSA PCMs
|
||||
* TQ Voice
|
||||
* CapturePCM "hw:1"
|
||||
* MasterPlaybackVolume "name='Master Playback Volume',index=2"
|
||||
* MasterPlaybackSwitch "name='Master Playback Switch',index=2"
|
||||
* Value {
|
||||
* TQ Voice
|
||||
* CapturePCM "hw:1"
|
||||
* PlaybackVolume "name='Master Playback Volume',index=2"
|
||||
* PlaybackSwitch "name='Master Playback Switch',index=2"
|
||||
* }
|
||||
*
|
||||
* }
|
||||
*/
|
||||
|
|
@ -267,6 +351,7 @@ static int parse_modifier(snd_use_case_mgr_t *uc_mgr,
|
|||
INIT_LIST_HEAD(&modifier->disable_list);
|
||||
INIT_LIST_HEAD(&modifier->transition_list);
|
||||
INIT_LIST_HEAD(&modifier->dev_list);
|
||||
INIT_LIST_HEAD(&modifier->value_list);
|
||||
list_add_tail(&modifier->list, &verb->modifier_list);
|
||||
err = snd_config_get_id(cfg, &id);
|
||||
if (err < 0)
|
||||
|
|
@ -335,64 +420,10 @@ static int parse_modifier(snd_use_case_mgr_t *uc_mgr,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "TQ") == 0) {
|
||||
err = parse_string(n, &modifier->tq);
|
||||
if (strcmp(id, "Value") == 0) {
|
||||
err = parse_value(uc_mgr, &modifier->value_list, n);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to parse TQ");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "CapturePCM") == 0) {
|
||||
err = parse_string(n, &modifier->capture_pcm);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get Capture PCM ID");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "PlaybackPCM") == 0) {
|
||||
err = parse_string(n, &modifier->playback_pcm);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get Playback PCM ID");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterPlaybackVolume") == 0) {
|
||||
err = parse_string(n, &modifier->playback_volume_id);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterPlaybackVolume");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterPlaybackSwitch") == 0) {
|
||||
err = parse_string(n, &modifier->playback_switch_id);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterPlaybackSwitch");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterCaptureVolume") == 0) {
|
||||
err = parse_string(n, &modifier->capture_volume_id);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterCaptureVolume");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterCaptureSwitch") == 0) {
|
||||
err = parse_string(n, &modifier->capture_switch_id);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterCaptureSwitch");
|
||||
uc_error("error: failed to parse Value");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
|
|
@ -422,9 +453,10 @@ static int parse_modifier(snd_use_case_mgr_t *uc_mgr,
|
|||
* ...
|
||||
* ]
|
||||
*
|
||||
* MasterPlaybackVolume "name='Master Playback Volume',index=2"
|
||||
* MasterPlaybackSwitch "name='Master Playback Switch',index=2"
|
||||
*
|
||||
* Value {
|
||||
* PlaybackVolume "name='Master Playback Volume',index=2"
|
||||
* PlaybackSwitch "name='Master Playback Switch',index=2"
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
static int parse_device_index(snd_use_case_mgr_t *uc_mgr,
|
||||
|
|
@ -446,17 +478,16 @@ static int parse_device_index(snd_use_case_mgr_t *uc_mgr,
|
|||
INIT_LIST_HEAD(&device->enable_list);
|
||||
INIT_LIST_HEAD(&device->disable_list);
|
||||
INIT_LIST_HEAD(&device->transition_list);
|
||||
INIT_LIST_HEAD(&device->value_list);
|
||||
list_add_tail(&device->list, &verb->device_list);
|
||||
device->name = strdup(name);
|
||||
if (device->name == NULL)
|
||||
return -ENOMEM;
|
||||
if (snd_config_get_id(cfg, &id) < 0)
|
||||
return -EINVAL;
|
||||
err = safe_strtol(id, &device->idx);
|
||||
if (err < 0) {
|
||||
uc_error("Invalid device index '%s'", id);
|
||||
return -EINVAL;
|
||||
}
|
||||
device->name = malloc(strlen(name) + strlen(id) + 2);
|
||||
if (device->name == NULL)
|
||||
return -ENOMEM;
|
||||
strcpy(device->name, name);
|
||||
strcat(device->name, ".");
|
||||
strcat(device->name, id);
|
||||
|
||||
snd_config_for_each(i, next, cfg) {
|
||||
const char *id;
|
||||
|
|
@ -506,37 +537,10 @@ static int parse_device_index(snd_use_case_mgr_t *uc_mgr,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterPlaybackVolume") == 0) {
|
||||
err = parse_string(n, &device->playback_volume_id);
|
||||
if (strcmp(id, "Value") == 0) {
|
||||
err = parse_value(uc_mgr, &device->value_list, n);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterPlaybackVolume");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterPlaybackSwitch") == 0) {
|
||||
err = parse_string(n, &device->playback_switch_id);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterPlaybackSwitch");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterCaptureVolume") == 0) {
|
||||
err = parse_string(n, &device->capture_volume_id);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterCaptureVolume");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "MasterCaptureSwitch") == 0) {
|
||||
err = parse_string(n, &device->capture_switch_id);
|
||||
if (err < 0) {
|
||||
uc_error("error: failed to get MasterCaptureSwitch");
|
||||
uc_error("error: failed to parse Value");
|
||||
return err;
|
||||
}
|
||||
continue;
|
||||
|
|
@ -577,7 +581,7 @@ static int parse_device(snd_use_case_mgr_t *uc_mgr,
|
|||
* # enable and disable sequences are compulsory
|
||||
* EnableSequence [
|
||||
* cset "name='Master Playback Switch',index=2 0,0"
|
||||
* cset "name='Master Playback Volume':index=2 25,25"
|
||||
* cset "name='Master Playback Volume',index=2 25,25"
|
||||
* msleep 50
|
||||
* cset "name='Master Playback Switch',index=2 1,1"
|
||||
* cset "name='Master Playback Volume',index=2 50,50"
|
||||
|
|
@ -592,10 +596,11 @@ static int parse_device(snd_use_case_mgr_t *uc_mgr,
|
|||
* ]
|
||||
*
|
||||
* # Optional TQ and ALSA PCMs
|
||||
* TQ HiFi
|
||||
* CapturePCM 0
|
||||
* PlaybackPCM 0
|
||||
*
|
||||
* Value {
|
||||
* TQ HiFi
|
||||
* CapturePCM 0
|
||||
* PlaybackPCM 0
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
static int parse_verb(snd_use_case_mgr_t *uc_mgr,
|
||||
|
|
@ -643,25 +648,9 @@ static int parse_verb(snd_use_case_mgr_t *uc_mgr,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "TQ") == 0) {
|
||||
uc_dbg("Parse TQ");
|
||||
err = parse_string(n, &verb->tq);
|
||||
if (err < 0)
|
||||
return err;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "CapturePCM") == 0) {
|
||||
uc_dbg("Parse CapturePCM");
|
||||
err = parse_string(n, &verb->capture_pcm);
|
||||
if (err < 0)
|
||||
return err;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(id, "PlaybackPCM") == 0) {
|
||||
uc_dbg("Parse PlaybackPCM");
|
||||
err = parse_string(n, &verb->playback_pcm);
|
||||
if (strcmp(id, "Value") == 0) {
|
||||
uc_dbg("Parse Value");
|
||||
err = parse_value(uc_mgr, &verb->value_list, n);
|
||||
if (err < 0)
|
||||
return err;
|
||||
continue;
|
||||
|
|
@ -703,6 +692,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
|
|||
INIT_LIST_HEAD(&verb->transition_list);
|
||||
INIT_LIST_HEAD(&verb->device_list);
|
||||
INIT_LIST_HEAD(&verb->modifier_list);
|
||||
INIT_LIST_HEAD(&verb->value_list);
|
||||
list_add_tail(&verb->list, &uc_mgr->verb_list);
|
||||
verb->name = strdup(use_case_name);
|
||||
if (verb->name == NULL)
|
||||
|
|
|
|||
|
|
@ -50,6 +50,12 @@
|
|||
#define SEQUENCE_ELEMENT_TYPE_SLEEP 2
|
||||
#define SEQUENCE_ELEMENT_TYPE_EXEC 3
|
||||
|
||||
struct ucm_value {
|
||||
struct list_head list;
|
||||
char *name;
|
||||
char *data;
|
||||
};
|
||||
|
||||
struct sequence_element {
|
||||
struct list_head list;
|
||||
unsigned int type;
|
||||
|
|
@ -99,20 +105,8 @@ struct use_case_modifier {
|
|||
/* list of supported devices per modifier */
|
||||
struct list_head dev_list;
|
||||
|
||||
/* ALSA PCM devices associated with any modifier PCM streams */
|
||||
char *capture_pcm;
|
||||
char *playback_pcm;
|
||||
|
||||
/* Any modifier stream TQ */
|
||||
char *tq;
|
||||
|
||||
/* aliased controls */
|
||||
char *playback_ctl;
|
||||
char *playback_volume_id;
|
||||
char *playback_switch_id;
|
||||
char *capture_ctl;
|
||||
char *capture_volume_id;
|
||||
char *capture_switch_id;
|
||||
/* values */
|
||||
struct list_head value_list;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -127,7 +121,6 @@ struct use_case_device {
|
|||
|
||||
char *name;
|
||||
char *comment;
|
||||
long idx; /* index for similar devices i.e. 2 headphone jacks */
|
||||
|
||||
/* device enable and disable sequences */
|
||||
struct list_head enable_list;
|
||||
|
|
@ -136,13 +129,8 @@ struct use_case_device {
|
|||
/* device transition list */
|
||||
struct list_head transition_list;
|
||||
|
||||
/* aliased controls */
|
||||
char *playback_ctl;
|
||||
char *playback_volume_id;
|
||||
char *playback_switch_id;
|
||||
char *capture_ctl;
|
||||
char *capture_volume_id;
|
||||
char *capture_switch_id;
|
||||
/* value list */
|
||||
struct list_head value_list;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -164,16 +152,14 @@ struct use_case_verb {
|
|||
/* verb transition list */
|
||||
struct list_head transition_list;
|
||||
|
||||
/* verb PCMs and TQ */
|
||||
char *tq;
|
||||
char *capture_pcm;
|
||||
char *playback_pcm;
|
||||
|
||||
/* hardware devices that can be used with this use case */
|
||||
struct list_head device_list;
|
||||
|
||||
/* modifiers that can be used with this use case */
|
||||
struct list_head modifier_list;
|
||||
|
||||
/* value list */
|
||||
struct list_head value_list;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -80,6 +80,19 @@ int uc_mgr_config_load(const char *file, snd_config_t **cfg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void uc_mgr_free_value(struct list_head *base)
|
||||
{
|
||||
struct list_head *pos, *npos;
|
||||
struct ucm_value *val;
|
||||
|
||||
list_for_each_safe(pos, npos, base) {
|
||||
val = list_entry(pos, struct ucm_value, list);
|
||||
free(val->name);
|
||||
free(val->data);
|
||||
list_del(pos);
|
||||
}
|
||||
}
|
||||
|
||||
void uc_mgr_free_dev_list(struct list_head *base)
|
||||
{
|
||||
struct list_head *pos, *npos;
|
||||
|
|
@ -147,15 +160,7 @@ void uc_mgr_free_modifier(struct list_head *base)
|
|||
uc_mgr_free_sequence(&mod->disable_list);
|
||||
uc_mgr_free_transition(&mod->transition_list);
|
||||
uc_mgr_free_dev_list(&mod->dev_list);
|
||||
free(mod->capture_pcm);
|
||||
free(mod->playback_pcm);
|
||||
free(mod->tq);
|
||||
free(mod->playback_ctl);
|
||||
free(mod->playback_volume_id);
|
||||
free(mod->playback_switch_id);
|
||||
free(mod->capture_ctl);
|
||||
free(mod->capture_volume_id);
|
||||
free(mod->capture_switch_id);
|
||||
uc_mgr_free_value(&mod->value_list);
|
||||
free(mod);
|
||||
list_del(pos);
|
||||
}
|
||||
|
|
@ -173,12 +178,7 @@ void uc_mgr_free_device(struct list_head *base)
|
|||
uc_mgr_free_sequence(&dev->enable_list);
|
||||
uc_mgr_free_sequence(&dev->disable_list);
|
||||
uc_mgr_free_transition(&dev->transition_list);
|
||||
free(dev->playback_ctl);
|
||||
free(dev->playback_volume_id);
|
||||
free(dev->playback_switch_id);
|
||||
free(dev->capture_ctl);
|
||||
free(dev->capture_volume_id);
|
||||
free(dev->capture_switch_id);
|
||||
uc_mgr_free_value(&dev->value_list);
|
||||
free(dev);
|
||||
list_del(pos);
|
||||
}
|
||||
|
|
@ -196,9 +196,7 @@ void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
|
|||
uc_mgr_free_sequence(&verb->enable_list);
|
||||
uc_mgr_free_sequence(&verb->disable_list);
|
||||
uc_mgr_free_transition(&verb->transition_list);
|
||||
free(verb->tq);
|
||||
free(verb->capture_pcm);
|
||||
free(verb->playback_pcm);
|
||||
uc_mgr_free_value(&verb->value_list);
|
||||
uc_mgr_free_device(&verb->device_list);
|
||||
uc_mgr_free_modifier(&verb->modifier_list);
|
||||
free(verb);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue