More documentation. Tiny change for simple mixer element API (get_range)

This commit is contained in:
Abramo Bagnara 2001-03-30 09:43:29 +00:00
parent 5b50ec848a
commit b4ac62f3dd
12 changed files with 1526 additions and 1092 deletions

View file

@ -1,3 +1,12 @@
/**
* \file mixer/mixer.c
* \author Jaroslav Kysela <perex@suse.cz>
* \author Abramo Bagnara <abramo@alsa-project.org>
* \date 2001
*
* Mixer interface is designed to access mixer elements.
* Callbacks may be used for event handling.
*/
/*
* Mixer Interface - main file
* Copyright (c) 1998/1999/2000 by Jaroslav Kysela <perex@suse.cz>
@ -20,6 +29,7 @@
*
*/
#ifndef DOC_HIDDEN
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@ -33,16 +43,18 @@ typedef struct _snd_mixer_slave {
struct list_head list;
} snd_mixer_slave_t;
typedef struct _snd_mixer_elem_bag {
} snd_mixer_elem_bag_t;
#endif
static int snd_mixer_compare_default(const snd_mixer_elem_t *c1,
const snd_mixer_elem_t *c2);
/**
* \brief Opens an empty mixer
* \param mixerp Returned mixer handle
* \param mode Open mode
* \return 0 on success otherwise a negative error code
*/
int snd_mixer_open(snd_mixer_t **mixerp, int mode ATTRIBUTE_UNUSED)
{
snd_mixer_t *mixer;
@ -58,6 +70,14 @@ int snd_mixer_open(snd_mixer_t **mixerp, int mode ATTRIBUTE_UNUSED)
return 0;
}
/**
* \brief Attach an HCTL element to a mixer element
* \param melem Mixer element
* \param helem HCTL element
* \return 0 on success otherwise a negative error code
*
* For use by mixer element class specific code.
*/
int snd_mixer_elem_attach(snd_mixer_elem_t *melem,
snd_hctl_elem_t *helem)
{
@ -69,6 +89,14 @@ int snd_mixer_elem_attach(snd_mixer_elem_t *melem,
return bag_add(&melem->helems, helem);
}
/**
* \brief Detach an HCTL element from a mixer element
* \param melem Mixer element
* \param helem HCTL element
* \return 0 on success otherwise a negative error code
*
* For use by mixer element class specific code.
*/
int snd_mixer_elem_detach(snd_mixer_elem_t *melem,
snd_hctl_elem_t *helem)
{
@ -81,6 +109,13 @@ int snd_mixer_elem_detach(snd_mixer_elem_t *melem,
return 0;
}
/**
* \brief Return true if a mixer element does not contain any HCTL elements
* \param melem Mixer element
* \return 0 if not empty, 1 if empty
*
* For use by mixer element class specific code.
*/
int snd_mixer_elem_empty(snd_mixer_elem_t *melem)
{
return bag_empty(&melem->helems);
@ -144,6 +179,12 @@ static int hctl_event_handler(snd_hctl_t *hctl, unsigned int mask,
}
/**
* \brief Attach an HCTL to an opened mixer
* \param mixer Mixer handle
* \param name HCTL name (see #snd_hctl_open)
* \return 0 on success otherwise a negative error code
*/
int snd_mixer_attach(snd_mixer_t *mixer, const char *name)
{
snd_mixer_slave_t *slave;
@ -170,6 +211,12 @@ int snd_mixer_attach(snd_mixer_t *mixer, const char *name)
return 0;
}
/**
* \brief Detach a previously attached HCTL to an opened mixer freeing all related resources
* \param mixer Mixer handle
* \param name HCTL previously attached
* \return 0 on success otherwise a negative error code
*/
int snd_mixer_detach(snd_mixer_t *mixer, const char *name)
{
struct list_head *pos;
@ -195,7 +242,7 @@ static int snd_mixer_throw_event(snd_mixer_t *mixer, unsigned int mask,
return 0;
}
int snd_mixer_elem_throw_event(snd_mixer_elem_t *elem, unsigned int mask)
static int snd_mixer_elem_throw_event(snd_mixer_elem_t *elem, unsigned int mask)
{
elem->class->mixer->events++;
if (elem->callback)
@ -226,6 +273,14 @@ static int _snd_mixer_find_elem(snd_mixer_t *mixer, snd_mixer_elem_t *elem, int
return idx;
}
/**
* \brief Add an element for a registered mixer element class
* \param elem Mixer element
* \param class Mixer element class
* \return 0 on success otherwise a negative error code
*
* For use by mixer element class specific code.
*/
int snd_mixer_elem_add(snd_mixer_elem_t *elem, snd_mixer_class_t *class)
{
int dir, idx;
@ -263,6 +318,13 @@ int snd_mixer_elem_add(snd_mixer_elem_t *elem, snd_mixer_class_t *class)
return snd_mixer_throw_event(mixer, SND_CTL_EVENT_MASK_ADD, elem);
}
/**
* \brief Remove a mixer element
* \param elem Mixer element
* \return 0 on success otherwise a negative error code
*
* For use by mixer element class specific code.
*/
int snd_mixer_elem_remove(snd_mixer_elem_t *elem)
{
snd_mixer_t *mixer = elem->class->mixer;
@ -292,16 +354,38 @@ int snd_mixer_elem_remove(snd_mixer_elem_t *elem)
return err;
}
/**
* \brief Mixer element informations are changed
* \param elem Mixer element
* \return 0 on success otherwise a negative error code
*
* For use by mixer element class specific code.
*/
int snd_mixer_elem_info(snd_mixer_elem_t *elem)
{
return snd_mixer_elem_throw_event(elem, SND_CTL_EVENT_MASK_INFO);
}
/**
* \brief Mixer element values is changed
* \param elem Mixer element
* \return 0 on success otherwise a negative error code
*
* For use by mixer element class specific code.
*/
int snd_mixer_elem_value(snd_mixer_elem_t *elem)
{
return snd_mixer_elem_throw_event(elem, SND_CTL_EVENT_MASK_VALUE);
}
/**
* \brief Register mixer element class
* \param class Mixer element class
* \param mixer Mixer handle
* \return 0 on success otherwise a negative error code
*
* For use by mixer element class specific code.
*/
int snd_mixer_class_register(snd_mixer_class_t *class, snd_mixer_t *mixer)
{
struct list_head *pos;
@ -325,6 +409,11 @@ int snd_mixer_class_register(snd_mixer_class_t *class, snd_mixer_t *mixer)
return 0;
}
/**
* \brief Unregister mixer element class and remove all its elements
* \param class Mixer element class
* \return 0 on success otherwise a negative error code
*/
int snd_mixer_class_unregister(snd_mixer_class_t *class)
{
unsigned int k;
@ -342,6 +431,11 @@ int snd_mixer_class_unregister(snd_mixer_class_t *class)
return 0;
}
/**
* \brief Load a mixer elements
* \param mixer Mixer handle
* \return 0 on success otherwise a negative error code
*/
int snd_mixer_load(snd_mixer_t *mixer)
{
struct list_head *pos;
@ -356,6 +450,10 @@ int snd_mixer_load(snd_mixer_t *mixer)
return 0;
}
/**
* \brief Unload all mixer elements and free all related resources
* \param mixer Mixer handle
*/
void snd_mixer_free(snd_mixer_t *mixer)
{
struct list_head *pos;
@ -366,6 +464,11 @@ void snd_mixer_free(snd_mixer_t *mixer)
}
}
/**
* \brief Close a mixer and free all related resources
* \param mixer Mixer handle
* \return 0 on success otherwise a negative error code
*/
int snd_mixer_close(snd_mixer_t *mixer)
{
int res = 0;
@ -423,21 +526,32 @@ static int snd_mixer_sort(snd_mixer_t *mixer)
return 0;
}
int snd_mixer_set_compare(snd_mixer_t *mixer, snd_mixer_compare_t msort)
/**
* \brief Change mixer compare function and reorder elements
* \param mixer Mixer handle
* \param compare Element compare function
* \return 0 on success otherwise a negative error code
*/
int snd_mixer_set_compare(snd_mixer_t *mixer, snd_mixer_compare_t compare)
{
snd_mixer_compare_t msort_old;
snd_mixer_compare_t compare_old;
int err;
assert(mixer);
msort_old = mixer->compare;
mixer->compare = msort == NULL ? snd_mixer_compare_default : msort;
compare_old = mixer->compare;
mixer->compare = compare == NULL ? snd_mixer_compare_default : compare;
if ((err = snd_mixer_sort(mixer)) < 0) {
mixer->compare = msort_old;
mixer->compare = compare_old;
return err;
}
return 0;
}
/**
* \brief get count of poll descriptors for mixer handle
* \param mixer Mixer handle
* \return count of poll descriptors
*/
int snd_mixer_poll_descriptors_count(snd_mixer_t *mixer)
{
struct list_head *pos;
@ -455,6 +569,13 @@ int snd_mixer_poll_descriptors_count(snd_mixer_t *mixer)
return c;
}
/**
* \brief get poll descriptors
* \param mixer Mixer handle
* \param pfds array of poll descriptors
* \param space space in the poll descriptor array
* \return count of filled descriptors
*/
int snd_mixer_poll_descriptors(snd_mixer_t *mixer, struct pollfd *pfds, unsigned int space)
{
struct list_head *pos;
@ -477,6 +598,12 @@ int snd_mixer_poll_descriptors(snd_mixer_t *mixer, struct pollfd *pfds, unsigned
return count;
}
/**
* \brief Wait for a mixer to become ready (i.e. at least one event pending)
* \param mixer Mixer handle
* \param timeout maximum time in milliseconds to wait
* \return 0 otherwise a negative error code on failure
*/
int snd_mixer_wait(snd_mixer_t *mixer, int timeout)
{
struct pollfd spfds[16];
@ -500,6 +627,11 @@ int snd_mixer_wait(snd_mixer_t *mixer, int timeout)
return 0;
}
/**
* \brief get first element for a mixer
* \param mixer Mixer handle
* \return pointer to first element
*/
snd_mixer_elem_t *snd_mixer_first_elem(snd_mixer_t *mixer)
{
assert(mixer);
@ -508,6 +640,11 @@ snd_mixer_elem_t *snd_mixer_first_elem(snd_mixer_t *mixer)
return list_entry(mixer->elems.next, snd_mixer_elem_t, list);
}
/**
* \brief get last element for a mixer
* \param mixer Mixer handle
* \return pointer to last element
*/
snd_mixer_elem_t *snd_mixer_last_elem(snd_mixer_t *mixer)
{
assert(mixer);
@ -516,6 +653,11 @@ snd_mixer_elem_t *snd_mixer_last_elem(snd_mixer_t *mixer)
return list_entry(mixer->elems.prev, snd_mixer_elem_t, list);
}
/**
* \brief get next mixer element
* \param elem mixer element
* \return pointer to next element
*/
snd_mixer_elem_t *snd_mixer_elem_next(snd_mixer_elem_t *elem)
{
assert(elem);
@ -524,6 +666,11 @@ snd_mixer_elem_t *snd_mixer_elem_next(snd_mixer_elem_t *elem)
return list_entry(elem->list.next, snd_mixer_elem_t, list);
}
/**
* \brief get previous mixer element
* \param elem mixer element
* \return pointer to previous element
*/
snd_mixer_elem_t *snd_mixer_elem_prev(snd_mixer_elem_t *elem)
{
assert(elem);
@ -532,6 +679,11 @@ snd_mixer_elem_t *snd_mixer_elem_prev(snd_mixer_elem_t *elem)
return list_entry(elem->list.prev, snd_mixer_elem_t, list);
}
/**
* \brief Handle pending mixer events invoking callbacks
* \param mixer Mixer handle
* \return 0 otherwise a negative error code on failure
*/
int snd_mixer_handle_events(snd_mixer_t *mixer)
{
struct list_head *pos;
@ -548,3 +700,91 @@ int snd_mixer_handle_events(snd_mixer_t *mixer)
return mixer->events;
}
/**
* \brief Set callback function for a mixer
* \param mixer mixer handle
* \param callback callback function
*/
void snd_mixer_set_callback(snd_mixer_t *obj, snd_mixer_callback_t val)
{
assert(obj);
obj->callback = val;
}
/**
* \brief Set callback private value for a mixer
* \param mixer mixer handle
* \param callback_private callback private value
*/
void snd_mixer_set_callback_private(snd_mixer_t *obj, void * val)
{
assert(obj);
obj->callback_private = val;
}
/**
* \brief Get callback private value for a mixer
* \param mixer mixer handle
* \return callback private value
*/
void * snd_mixer_get_callback_private(const snd_mixer_t *obj)
{
assert(obj);
return obj->callback_private;
}
/**
* \brief Get elements count for a mixer
* \param mixer mixer handle
* \return elements count
*/
unsigned int snd_mixer_get_count(const snd_mixer_t *obj)
{
assert(obj);
return obj->count;
}
/**
* \brief Set callback function for a mixer element
* \param obj mixer element
* \param val callback function
*/
void snd_mixer_elem_set_callback(snd_mixer_elem_t *obj, snd_mixer_elem_callback_t val)
{
assert(obj);
obj->callback = val;
}
/**
* \brief Set callback private value for a mixer element
* \param obj mixer element
* \param val callback private value
*/
void snd_mixer_elem_set_callback_private(snd_mixer_elem_t *obj, void * val)
{
assert(obj);
obj->callback_private = val;
}
/**
* \brief Get callback private value for a mixer element
* \param obj mixer element
* \return callback private value
*/
void * snd_mixer_elem_get_callback_private(const snd_mixer_elem_t *obj)
{
assert(obj);
return obj->callback_private;
}
/**
* \brief Get type for a mixer element
* \param obj mixer element
* \return mixer element type
*/
snd_mixer_elem_type_t snd_mixer_elem_get_type(const snd_mixer_elem_t *obj)
{
assert(obj);
return obj->type;
}