From 0c7637393f25e059cdcd448c5a9baf9666ec2e1c Mon Sep 17 00:00:00 2001 From: Abramo Bagnara Date: Sun, 18 Feb 2001 17:56:37 +0000 Subject: [PATCH] Added range specification to simple mixer. Fixes to alsamixer. Added mixer support to alsa-oss --- include/mixer.h | 7 +++++- include/pcm.h | 1 + src/mixer/simple.c | 57 +++++++++++++++++++++++++++++++++++++++++---- src/pcm/pcm_share.c | 4 ++-- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/include/mixer.h b/include/mixer.h index 305491c7..5b223ed1 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -105,6 +105,8 @@ 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); +const char *snd_mixer_selem_get_name(snd_mixer_elem_t *elem); +unsigned int snd_mixer_selem_get_index(snd_mixer_elem_t *elem); snd_mixer_elem_t *snd_mixer_find_selem(snd_mixer_t *mixer, const snd_mixer_selem_id_t *id); @@ -141,7 +143,10 @@ int snd_mixer_selem_set_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_ 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); - +void snd_mixer_selem_set_playback_volume_range(snd_mixer_elem_t *elem, + long min, long max); +void snd_mixer_selem_set_capture_volume_range(snd_mixer_elem_t *elem, + long min, long max); #ifdef __cplusplus } #endif diff --git a/include/pcm.h b/include/pcm.h index 920ce49e..4eb6ef0b 100644 --- a/include/pcm.h +++ b/include/pcm.h @@ -216,6 +216,7 @@ int snd_pcm_open(snd_pcm_t **pcm, const char *name, snd_pcm_type_t snd_pcm_type(snd_pcm_t *pcm); int snd_pcm_close(snd_pcm_t *pcm); +int snd_pcm_poll_descriptors_count(snd_pcm_t *pcm, unsigned int *count); int snd_pcm_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space); int snd_pcm_nonblock(snd_pcm_t *pcm, int nonblock); int snd_pcm_async(snd_pcm_t *pcm, int sig, pid_t pid); diff --git a/src/mixer/simple.c b/src/mixer/simple.c index 62352833..6acf9473 100644 --- a/src/mixer/simple.c +++ b/src/mixer/simple.c @@ -75,6 +75,7 @@ typedef struct _selem { unsigned int capture_group; unsigned int caps; struct { + unsigned int range: 1; /* Forced range */ long min, max; unsigned int channels; long vol[32]; @@ -593,11 +594,15 @@ static int simple_update(snd_mixer_elem_t *melem) } simple->caps = caps; simple->str[PLAY].channels = pchannels; - simple->str[PLAY].min = pmin; - simple->str[PLAY].max = pmax; + if (!simple->str[PLAY].range) { + simple->str[PLAY].min = pmin; + simple->str[PLAY].max = pmax; + } simple->str[CAPT].channels = cchannels; - simple->str[CAPT].min = cmin; - simple->str[CAPT].max = cmax; + if (!simple->str[CAPT].range) { + simple->str[CAPT].min = cmin; + simple->str[CAPT].max = cmax; + } return 0; } @@ -900,6 +905,24 @@ void snd_mixer_selem_get_id(snd_mixer_elem_t *elem, *id = s->id; } +const char *snd_mixer_selem_get_name(snd_mixer_elem_t *elem) +{ + selem_t *s; + assert(elem); + assert(elem->type == SND_MIXER_ELEM_SIMPLE); + s = elem->private_data; + return s->id.name; +} + +unsigned int snd_mixer_selem_get_index(snd_mixer_elem_t *elem) +{ + selem_t *s; + assert(elem); + assert(elem->type == SND_MIXER_ELEM_SIMPLE); + s = elem->private_data; + return s->id.index; +} + int snd_mixer_selem_is_playback_mono(snd_mixer_elem_t *elem) { selem_t *s; @@ -1367,3 +1390,29 @@ const char *snd_mixer_selem_channel_name(snd_mixer_selem_channel_id_t channel) return p; } +void snd_mixer_selem_set_playback_volume_range(snd_mixer_elem_t *elem, + long min, long max) +{ + selem_t *s; + assert(elem); + assert(elem->type == SND_MIXER_ELEM_SIMPLE); + s = elem->private_data; + assert(min != max); + s->str[PLAY].range = 1; + s->str[PLAY].min = min; + s->str[PLAY].max = max; +} + +void snd_mixer_selem_set_capture_volume_range(snd_mixer_elem_t *elem, + long min, long max) +{ + selem_t *s; + assert(elem); + assert(elem->type == SND_MIXER_ELEM_SIMPLE); + s = elem->private_data; + assert(min != max); + s->str[CAPT].range = 1; + s->str[CAPT].min = min; + s->str[CAPT].max = max; +} + diff --git a/src/pcm/pcm_share.c b/src/pcm/pcm_share.c index 11b2c232..2e57eb7c 100644 --- a/src/pcm/pcm_share.c +++ b/src/pcm/pcm_share.c @@ -338,7 +338,7 @@ static snd_pcm_uframes_t _snd_pcm_share_slave_missing(snd_pcm_share_slave_t *sla return missing; } -void *snd_pcm_share_slave_thread(void *data) +void *snd_pcm_share_thread(void *data) { snd_pcm_share_slave_t *slave = data; snd_pcm_t *spcm = slave->pcm; @@ -1303,7 +1303,7 @@ int snd_pcm_share_open(snd_pcm_t **pcmp, const char *name, const char *sname, pthread_cond_init(&slave->poll_cond, NULL); list_add_tail(&slave->list, &slaves); Pthread_mutex_lock(&slave->mutex); - err = pthread_create(&slave->thread, NULL, snd_pcm_share_slave_thread, slave); + err = pthread_create(&slave->thread, NULL, snd_pcm_share_thread, slave); assert(err == 0); Pthread_mutex_unlock(&slaves_mutex); } else { -- 2.47.1