Add accessor to user control elements

Added accessor functions to user control elements, snd_ctl_elem_add_*(),
and_ctl_elem_remove() and snd_ctl_elem_info_is_user().
This commit is contained in:
Takashi Iwai 2005-01-03 11:52:39 +00:00
parent 77348e830f
commit 0732cce6f0
4 changed files with 133 additions and 33 deletions

View file

@ -339,6 +339,7 @@ int snd_ctl_elem_info_is_volatile(const snd_ctl_elem_info_t *obj);
int snd_ctl_elem_info_is_inactive(const snd_ctl_elem_info_t *obj);
int snd_ctl_elem_info_is_locked(const snd_ctl_elem_info_t *obj);
int snd_ctl_elem_info_is_owner(const snd_ctl_elem_info_t *obj);
int snd_ctl_elem_info_is_user(const snd_ctl_elem_info_t *obj);
pid_t snd_ctl_elem_info_get_owner(const snd_ctl_elem_info_t *obj);
unsigned int snd_ctl_elem_info_get_count(const snd_ctl_elem_info_t *obj);
long snd_ctl_elem_info_get_min(const snd_ctl_elem_info_t *obj);
@ -367,6 +368,12 @@ void snd_ctl_elem_info_set_subdevice(snd_ctl_elem_info_t *obj, unsigned int val)
void snd_ctl_elem_info_set_name(snd_ctl_elem_info_t *obj, const char *val);
void snd_ctl_elem_info_set_index(snd_ctl_elem_info_t *obj, unsigned int val);
int snd_ctl_elem_add_integer(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, unsigned int count, long imin, long imax, long istep);;
int snd_ctl_elem_add_integer64(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, unsigned int count, long long imin, long long imax, long long istep);;
int snd_ctl_elem_add_boolean(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id, unsigned int count);
int snd_ctl_elem_add_iec958(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id);
int snd_ctl_elem_remove(snd_ctl_t *ctl, snd_ctl_elem_id_t *id);
size_t snd_ctl_elem_value_sizeof(void);
/** \hideinitializer
* \brief allocate an invalid #snd_ctl_elem_value_t using standard alloca

View file

@ -160,3 +160,13 @@ ALSA_1.0.5 {
snd_timer_params_set_early_event;
snd_timer_params_get_early_event;
} ALSA_1.0.4;
ALSA_1.0.8 {
global:
snd_ctl_elem_add_integer;
snd_ctl_elem_add_integer64;
snd_ctl_elem_add_boolean;
snd_ctl_elem_add_iec958;
snd_ctl_elem_remove;
} ALSA_1.0.5;

View file

@ -253,31 +253,118 @@ int snd_ctl_elem_info(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
}
/**
* \brief Create and add an user CTL element
* \brief Create and add an user INTEGER CTL element
* \param ctl CTL handle
* \param info CTL element info
* \param id CTL element id to add
* \param count number of elements
* \param min minimum value
* \param max maximum value
* \param step value step
* \return 0 on success otherwise a negative error code
*
* Note that the new element is locked!
*/
int snd_ctl_elem_add(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
int snd_ctl_elem_add_integer(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
unsigned int count, long min, long max, long step)
{
assert(ctl && info && info->id.name[0]);
snd_ctl_elem_info_t *info;
snd_ctl_elem_value_t *val;
unsigned int i;
int err;
assert(ctl && id && id->name[0]);
snd_ctl_elem_info_alloca(&info);
info->id = *id;
info->type = SND_CTL_ELEM_TYPE_INTEGER;
info->count = count;
info->value.integer.min = min;
info->value.integer.max = max;
info->value.integer.step = step;
err = ctl->ops->element_add(ctl, info);
if (err < 0)
return err;
snd_ctl_elem_value_alloca(&val);
val->id = *id;
for (i = 0; i < count; i++)
val->value.integer.value[i] = min;
err = ctl->ops->element_write(ctl, val);
return err;
}
/**
* \brief Create and add an user INTEGER64 CTL element
* \param ctl CTL handle
* \param id CTL element id to add
* \param count number of elements
* \param min minimum value
* \param max maximum value
* \param step value step
* \return 0 on success otherwise a negative error code
*/
int snd_ctl_elem_add_integer64(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
unsigned int count, long long min, long long max,
long long step)
{
snd_ctl_elem_info_t *info;
snd_ctl_elem_value_t *val;
unsigned int i;
int err;
assert(ctl && id && id->name[0]);
snd_ctl_elem_info_alloca(&info);
info->id = *id;
info->type = SND_CTL_ELEM_TYPE_INTEGER64;
info->count = count;
info->value.integer64.min = min;
info->value.integer64.max = max;
info->value.integer64.step = step;
err = ctl->ops->element_add(ctl, info);
if (err < 0)
return err;
snd_ctl_elem_value_alloca(&val);
val->id = *id;
for (i = 0; i < count; i++)
val->value.integer64.value[i] = min;
err = ctl->ops->element_write(ctl, val);
return err;
}
/**
* \brief Create and add an user BOOLEAN CTL element
* \param ctl CTL handle
* \param id CTL element id to add
* \param count number of elements
* \return 0 on success otherwise a negative error code
*/
int snd_ctl_elem_add_boolean(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
unsigned int count)
{
snd_ctl_elem_info_t *info;
assert(ctl && id && id->name[0]);
snd_ctl_elem_info_alloca(&info);
info->id = *id;
info->type = SND_CTL_ELEM_TYPE_BOOLEAN;
info->count = count;
info->value.integer.min = 0;
info->value.integer.max = 1;
return ctl->ops->element_add(ctl, info);
}
/**
* \brief Replace an user CTL element
* \brief Create and add an user IEC958 CTL element
* \param ctl CTL handle
* \param info CTL element info
* \param id CTL element info to add
* \return 0 on success otherwise a negative error code
*
* Note that the new element is locked!
*/
int snd_ctl_elem_replace(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
int snd_ctl_elem_add_iec958(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id)
{
assert(ctl && info && info->id.name[0]);
return ctl->ops->element_replace(ctl, info);
snd_ctl_elem_info_t *info;
assert(ctl && id && id->name[0]);
snd_ctl_elem_info_alloca(&info);
info->id = *id;
info->type = SND_CTL_ELEM_TYPE_IEC958;
info->count = 1;
return ctl->ops->element_add(ctl, info);
}
/**
@ -285,8 +372,6 @@ int snd_ctl_elem_replace(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
* \param ctl CTL handle
* \param id CTL element identification
* \return 0 on success otherwise a negative error code
*
* Note that the new element is locked!
*/
int snd_ctl_elem_remove(snd_ctl_t *ctl, snd_ctl_elem_id_t *id)
{
@ -1569,6 +1654,17 @@ int snd_ctl_elem_info_is_owner(const snd_ctl_elem_info_t *obj)
return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_OWNER);
}
/**
* \brief Get info if it's a user element
* \param obj CTL element id/info
* \return 0 if element value is a system element, 1 if it's a user-created element
*/
int snd_ctl_elem_info_is_user(const snd_ctl_elem_info_t *obj)
{
assert(obj);
return !!(obj->access & SNDRV_CTL_ELEM_ACCESS_USER);
}
/**
* \brief (DEPRECATED) Get info about values passing policy from a CTL element value
* \param obj CTL element id/info

View file

@ -333,23 +333,9 @@ static void snd_pcm_softvol_dump(snd_pcm_t *pcm, snd_output_t *out)
int snd_ctl_elem_add(snd_ctl_t *ctl, snd_ctl_elem_info_t *info);
int snd_ctl_elem_replace(snd_ctl_t *ctl, snd_ctl_elem_info_t *info);
static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo, int replace)
static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo)
{
int err;
cinfo->type = SND_CTL_ELEM_TYPE_INTEGER;
cinfo->count = 1;
cinfo->value.integer.min = 0;
cinfo->value.integer.max = svol->max_val;
if (replace)
err = snd_ctl_elem_replace(svol->ctl, cinfo);
else
err = snd_ctl_elem_add(svol->ctl, cinfo);
if (err < 0)
return err;
/* initialize */
svol->elem.value.integer.value[0] = 0;
return snd_ctl_elem_write(svol->ctl, &svol->elem);
return snd_ctl_elem_add_integer(svol->ctl, &cinfo->id, 1, 0, svol->max_val, 0);
}
static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
@ -392,7 +378,7 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
SNDERR("Cannot get info for CTL %s", ctl_name);
return err;
}
err = add_user_ctl(svol, cinfo, 0);
err = add_user_ctl(svol, cinfo);
if (err < 0) {
SNDERR("Cannot add a control");
return err;
@ -406,7 +392,8 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
SNDERR("Invalid control");
return -EINVAL;
}
err = add_user_ctl(svol, cinfo, 1);
snd_ctl_elem_remove(svol->ctl, &cinfo->id);
err = add_user_ctl(svol, cinfo);
if (err < 0) {
SNDERR("Cannot replace a control");
return err;