mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-05 13:30:00 -05:00
More documentation. Tiny change for simple mixer element API (get_range)
This commit is contained in:
parent
5b50ec848a
commit
b4ac62f3dd
12 changed files with 1526 additions and 1092 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue