New simple mixer implementation

This commit is contained in:
Abramo Bagnara 2001-02-15 23:05:41 +00:00
parent 341689606f
commit ab819d2edd
8 changed files with 885 additions and 667 deletions

View file

@ -2,7 +2,6 @@
PCM common fields:
type PCM type
[comment] Saved comments
[stream] capture or playback (default both)
PCM types:

View file

@ -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
}

View file

@ -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
}

View file

@ -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)
{

View file

@ -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,

View file

@ -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;
}

File diff suppressed because it is too large Load diff

View file

@ -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,