mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
New simple mixer implementation
This commit is contained in:
parent
341689606f
commit
ab819d2edd
8 changed files with 885 additions and 667 deletions
|
|
@ -2,7 +2,6 @@
|
|||
PCM common fields:
|
||||
type PCM type
|
||||
[comment] Saved comments
|
||||
[stream] capture or playback (default both)
|
||||
|
||||
PCM types:
|
||||
|
||||
|
|
|
|||
|
|
@ -77,8 +77,6 @@ enum _snd_mixer_selem_channel_id {
|
|||
|
||||
/* Simple mixer */
|
||||
|
||||
typedef struct _snd_mixer_selem_info snd_mixer_selem_info_t;
|
||||
typedef struct _snd_mixer_selem_value snd_mixer_selem_value_t;
|
||||
typedef struct _snd_mixer_selem_id snd_mixer_selem_id_t;
|
||||
|
||||
#ifdef SND_ENUM_TYPECHECK
|
||||
|
|
@ -103,29 +101,46 @@ extern "C" {
|
|||
|
||||
const char *snd_mixer_selem_channel_name(snd_mixer_selem_channel_id_t channel);
|
||||
|
||||
int snd_mixer_selem_register(snd_mixer_t *mixer, snd_mixer_class_t **classp);
|
||||
int snd_mixer_selem_register(snd_mixer_t *mixer, void *arg,
|
||||
snd_mixer_class_t **classp);
|
||||
void snd_mixer_selem_get_id(snd_mixer_elem_t *element,
|
||||
snd_mixer_selem_id_t *id);
|
||||
snd_mixer_elem_t *snd_mixer_find_selem(snd_mixer_t *mixer,
|
||||
const snd_mixer_selem_id_t *id);
|
||||
int snd_mixer_selem_info(snd_mixer_elem_t *element,
|
||||
snd_mixer_selem_info_t *info);
|
||||
int snd_mixer_selem_read(snd_mixer_elem_t *element,
|
||||
snd_mixer_selem_value_t *value);
|
||||
int snd_mixer_selem_write(snd_mixer_elem_t *element,
|
||||
const snd_mixer_selem_value_t *value);
|
||||
|
||||
int snd_mixer_selem_info_is_mono(const snd_mixer_selem_info_t *info);
|
||||
int snd_mixer_selem_info_has_channel(const snd_mixer_selem_info_t *obj, snd_mixer_selem_channel_id_t channel);
|
||||
long snd_mixer_selem_value_get_volume(const snd_mixer_selem_value_t *obj, snd_mixer_selem_channel_id_t channel);
|
||||
void snd_mixer_selem_value_set_volume(snd_mixer_selem_value_t *obj, snd_mixer_selem_channel_id_t channel, long value);
|
||||
int snd_mixer_selem_value_get_mute(const snd_mixer_selem_value_t *obj, snd_mixer_selem_channel_id_t channel);
|
||||
int snd_mixer_selem_value_get_capture(const snd_mixer_selem_value_t *obj, snd_mixer_selem_channel_id_t channel);
|
||||
void snd_mixer_selem_value_set_mute(snd_mixer_selem_value_t *obj, snd_mixer_selem_channel_id_t channel, int mute);
|
||||
void snd_mixer_selem_value_set_capture(snd_mixer_selem_value_t *obj, snd_mixer_selem_channel_id_t channel, int capture);
|
||||
void snd_mixer_selem_value_set_mute_all(snd_mixer_selem_value_t *obj, int mute);
|
||||
void snd_mixer_selem_value_set_capture_all(snd_mixer_selem_value_t *obj, int capture);
|
||||
void snd_mixer_selem_value_set_volume_all(snd_mixer_selem_value_t *obj, long value);
|
||||
int snd_mixer_selem_is_playback_mono(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_playback_channel(snd_mixer_elem_t *obj, snd_mixer_selem_channel_id_t channel);
|
||||
int snd_mixer_selem_get_playback_min(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_get_playback_max(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_is_capture_mono(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_capture_channel(snd_mixer_elem_t *obj, snd_mixer_selem_channel_id_t channel);
|
||||
int snd_mixer_selem_get_capture_min(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_get_capture_max(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_get_capture_group(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_common_volume(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_playback_volume(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_playback_volume_joined(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_capture_volume(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_capture_volume_joined(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_common_switch(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_playback_switch(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_playback_switch_joined(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_capture_switch(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_capture_switch_joined(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_selem_has_capture_switch_exclusive(snd_mixer_elem_t *elem);
|
||||
|
||||
int snd_mixer_selem_get_playback_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value);
|
||||
int snd_mixer_selem_get_capture_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value);
|
||||
int snd_mixer_selem_get_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int *value);
|
||||
int snd_mixer_selem_get_capture_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int *value);
|
||||
int snd_mixer_selem_set_playback_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value);
|
||||
int snd_mixer_selem_set_capture_volume(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long value);
|
||||
int snd_mixer_selem_set_playback_volume_all(snd_mixer_elem_t *elem, long value);
|
||||
int snd_mixer_selem_set_capture_volume_all(snd_mixer_elem_t *elem, long value);
|
||||
int snd_mixer_selem_set_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value);
|
||||
int snd_mixer_selem_set_capture_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value);
|
||||
int snd_mixer_selem_set_playback_switch_all(snd_mixer_elem_t *elem, int value);
|
||||
int snd_mixer_selem_set_capture_switch_all(snd_mixer_elem_t *elem, int value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,38 +32,6 @@ void snd_mixer_elem_set_callback_private(snd_mixer_elem_t *obj, void * val);
|
|||
|
||||
snd_mixer_elem_type_t snd_mixer_elem_get_type(const snd_mixer_elem_t *obj);
|
||||
|
||||
size_t snd_mixer_selem_info_sizeof();
|
||||
#define snd_mixer_selem_info_alloca(ptr) ({ assert(ptr); *ptr = (snd_mixer_selem_info_t *) alloca(snd_mixer_selem_info_sizeof()); memset(*ptr, 0, snd_mixer_selem_info_sizeof()); 0; })
|
||||
int snd_mixer_selem_info_malloc(snd_mixer_selem_info_t **ptr);
|
||||
void snd_mixer_selem_info_free(snd_mixer_selem_info_t *obj);
|
||||
void snd_mixer_selem_info_copy(snd_mixer_selem_info_t *dst, const snd_mixer_selem_info_t *src);
|
||||
|
||||
long snd_mixer_selem_info_get_min(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
long snd_mixer_selem_info_get_max(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_get_capture_group(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_has_volume(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_has_joined_volume(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_has_mute(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_has_joined_mute(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_has_capture(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_has_joined_capture(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
int snd_mixer_selem_info_has_exclusive_capture(const snd_mixer_selem_info_t *obj);
|
||||
|
||||
size_t snd_mixer_selem_value_sizeof();
|
||||
#define snd_mixer_selem_value_alloca(ptr) ({ assert(ptr); *ptr = (snd_mixer_selem_value_t *) alloca(snd_mixer_selem_value_sizeof()); memset(*ptr, 0, snd_mixer_selem_value_sizeof()); 0; })
|
||||
int snd_mixer_selem_value_malloc(snd_mixer_selem_value_t **ptr);
|
||||
void snd_mixer_selem_value_free(snd_mixer_selem_value_t *obj);
|
||||
void snd_mixer_selem_value_copy(snd_mixer_selem_value_t *dst, const snd_mixer_selem_value_t *src);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -292,11 +292,15 @@ int snd_mixer_elem_remove(snd_mixer_elem_t *elem)
|
|||
return err;
|
||||
}
|
||||
|
||||
int snd_mixer_elem_change(snd_mixer_elem_t *elem)
|
||||
int snd_mixer_elem_info(snd_mixer_elem_t *elem)
|
||||
{
|
||||
return snd_mixer_elem_throw_event(elem, SND_CTL_EVENT_MASK_INFO);
|
||||
}
|
||||
|
||||
int snd_mixer_elem_value(snd_mixer_elem_t *elem)
|
||||
{
|
||||
return snd_mixer_elem_throw_event(elem, SND_CTL_EVENT_MASK_VALUE);
|
||||
}
|
||||
|
||||
int snd_mixer_class_register(snd_mixer_class_t *class, snd_mixer_t *mixer)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -86,35 +86,14 @@ struct _snd_mixer_selem_id {
|
|||
unsigned int index;
|
||||
};
|
||||
|
||||
#define CAP_VOLUME (1<<0)
|
||||
#define CAP_JOIN_VOLUME (1<<1)
|
||||
#define CAP_MUTE (1<<2)
|
||||
#define CAP_JOIN_MUTE (1<<3)
|
||||
#define CAP_CAPTURE (1<<4)
|
||||
#define CAP_JOIN_CAPTURE (1<<5)
|
||||
#define CAP_EXCL_CAPTURE (1<<6)
|
||||
|
||||
struct _snd_mixer_selem_info {
|
||||
unsigned int caps; /* capabilities */
|
||||
unsigned int channels; /* bitmap of active channels */
|
||||
int capture_group; /* capture group (for exclusive capture) */
|
||||
long min; /* minimum value */
|
||||
long max; /* maximum value */
|
||||
};
|
||||
|
||||
struct _snd_mixer_selem_value {
|
||||
unsigned int mute; /* RW: bitmap of muted channels */
|
||||
unsigned int capture; /* RW: bitmap of capture channels */
|
||||
long volume[32];
|
||||
};
|
||||
|
||||
int snd_mixer_class_register(snd_mixer_class_t *class, snd_mixer_t *mixer);
|
||||
int snd_mixer_add_elem(snd_mixer_t *mixer, snd_mixer_elem_t *elem);
|
||||
int snd_mixer_remove_elem(snd_mixer_t *mixer, snd_mixer_elem_t *elem);
|
||||
int snd_mixer_elem_throw_event(snd_mixer_elem_t *elem, unsigned int mask);
|
||||
int snd_mixer_elem_add(snd_mixer_elem_t *elem, snd_mixer_class_t *class);
|
||||
int snd_mixer_elem_remove(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_elem_change(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_elem_info(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_elem_value(snd_mixer_elem_t *elem);
|
||||
int snd_mixer_elem_attach(snd_mixer_elem_t *melem,
|
||||
snd_hctl_elem_t *helem);
|
||||
int snd_mixer_elem_detach(snd_mixer_elem_t *melem,
|
||||
|
|
|
|||
|
|
@ -118,113 +118,3 @@ snd_mixer_elem_type_t snd_mixer_elem_get_type(const snd_mixer_elem_t *obj)
|
|||
return obj->type;
|
||||
}
|
||||
|
||||
size_t snd_mixer_selem_info_sizeof()
|
||||
{
|
||||
return sizeof(snd_mixer_selem_info_t);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_malloc(snd_mixer_selem_info_t **ptr)
|
||||
{
|
||||
assert(ptr);
|
||||
*ptr = calloc(1, sizeof(snd_mixer_selem_info_t));
|
||||
if (!*ptr)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void snd_mixer_selem_info_free(snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
free(obj);
|
||||
}
|
||||
|
||||
void snd_mixer_selem_info_copy(snd_mixer_selem_info_t *dst, const snd_mixer_selem_info_t *src)
|
||||
{
|
||||
assert(dst && src);
|
||||
*dst = *src;
|
||||
}
|
||||
|
||||
long snd_mixer_selem_info_get_min(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return obj->min;
|
||||
}
|
||||
|
||||
long snd_mixer_selem_info_get_max(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return obj->max;
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_get_capture_group(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return obj->capture_group;
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_has_volume(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return !!(obj->caps & CAP_VOLUME);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_has_joined_volume(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return !!(obj->caps & CAP_JOIN_VOLUME);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_has_mute(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return !!(obj->caps & CAP_MUTE);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_has_joined_mute(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return !!(obj->caps & CAP_JOIN_MUTE);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_has_capture(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return !!(obj->caps & CAP_CAPTURE);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_has_joined_capture(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return !!(obj->caps & CAP_JOIN_CAPTURE);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_info_has_exclusive_capture(const snd_mixer_selem_info_t *obj)
|
||||
{
|
||||
assert(obj);
|
||||
return !!(obj->caps & CAP_EXCL_CAPTURE);
|
||||
}
|
||||
|
||||
size_t snd_mixer_selem_value_sizeof()
|
||||
{
|
||||
return sizeof(snd_mixer_selem_value_t);
|
||||
}
|
||||
|
||||
int snd_mixer_selem_value_malloc(snd_mixer_selem_value_t **ptr)
|
||||
{
|
||||
assert(ptr);
|
||||
*ptr = calloc(1, sizeof(snd_mixer_selem_value_t));
|
||||
if (!*ptr)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void snd_mixer_selem_value_free(snd_mixer_selem_value_t *obj)
|
||||
{
|
||||
free(obj);
|
||||
}
|
||||
|
||||
void snd_mixer_selem_value_copy(snd_mixer_selem_value_t *dst, const snd_mixer_selem_value_t *src)
|
||||
{
|
||||
assert(dst && src);
|
||||
*dst = *src;
|
||||
}
|
||||
|
||||
|
|
|
|||
1322
src/mixer/simple.c
1322
src/mixer/simple.c
File diff suppressed because it is too large
Load diff
|
|
@ -49,7 +49,6 @@ struct _snd_rawmidi {
|
|||
size_t buffer_size;
|
||||
size_t avail_min;
|
||||
unsigned int no_active_sensing: 1;
|
||||
snd_rawmidi_t *other;
|
||||
};
|
||||
|
||||
int snd_rawmidi_hw_open(snd_rawmidi_t **input, snd_rawmidi_t **output,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue