summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2018-10-31 10:17:55 +0200
committerJari Vetoniemi <mailroxas@gmail.com>2018-10-31 10:17:55 +0200
commita879880395be1f7a46724c3aafa0f450ec5a4e81 (patch)
tree04518bd5086ce2d70aebf442fb11ad86ea1ef298
parent28452717ad1ee7dc817506358240fa9dcde392ea (diff)
implement control searching and volume range get
-rw-r--r--src/mixer.c37
-rw-r--r--src/stubs.h4
2 files changed, 35 insertions, 6 deletions
diff --git a/src/mixer.c b/src/mixer.c
index 67046e6..73bfc35 100644
--- a/src/mixer.c
+++ b/src/mixer.c
@@ -143,14 +143,16 @@ get_controls(snd_mixer_t *mixer)
}
}
+ mixer->controls = NULL;
snd_mixer_elem_t **tail = &mixer->controls;
for (size_t i = 0; i < ARRAY_SIZE(controls); ++i) {
if (!controls[i].name[0])
continue;
+ controls[i].next = NULL;
controls[i].mixer = mixer;
*tail = &controls[i];
- tail = &(*tail)->next;
+ tail = &controls[i].next;
}
}
@@ -236,7 +238,7 @@ snd_mixer_handle_events(snd_mixer_t *mixer)
}
struct _snd_mixer_selem_id {
- char noop;
+ const char *name;
};
int
@@ -254,6 +256,23 @@ snd_mixer_selem_id_free(snd_mixer_selem_id_t *obj)
free(obj);
}
+void
+snd_mixer_selem_id_set_name(snd_mixer_selem_id_t *obj, const char *val)
+{
+ obj->name = val;
+}
+
+snd_mixer_elem_t*
+snd_mixer_find_selem(snd_mixer_t *mixer, const snd_mixer_selem_id_t *id)
+{
+ for (snd_mixer_elem_t *elem = mixer->controls; elem; elem = elem->next) {
+ if (elem->name && id->name && !strcasecmp(elem->name, id->name))
+ return elem;
+ }
+
+ return NULL;
+}
+
snd_mixer_elem_t*
snd_mixer_first_elem(snd_mixer_t *mixer)
{
@@ -266,6 +285,12 @@ snd_mixer_elem_next(snd_mixer_elem_t *elem)
return elem->next;
}
+void
+snd_mixer_selem_get_id(snd_mixer_elem_t *element, snd_mixer_selem_id_t *id)
+{
+ id->name = element->name;
+}
+
const char*
snd_mixer_selem_get_name(snd_mixer_elem_t *elem)
{
@@ -280,6 +305,14 @@ snd_mixer_selem_get_playback_volume(snd_mixer_elem_t *elem, snd_mixer_selem_chan
}
int
+snd_mixer_selem_get_playback_volume_range(snd_mixer_elem_t *elem, long *min, long *max)
+{
+ if (min) *min = 0;
+ if (max) *max = 0x7f;
+ return 0;
+}
+
+int
snd_mixer_selem_get_playback_dB(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, long *value)
{
if (value) *value = (long)elem->vol - 0x7f;
diff --git a/src/stubs.h b/src/stubs.h
index cf94ee8..aaab0b5 100644
--- a/src/stubs.h
+++ b/src/stubs.h
@@ -389,9 +389,7 @@ int snd_mixer_class_set_private_free(snd_mixer_class_t *class_, void (*private_f
int snd_mixer_class_set_compare(snd_mixer_class_t *class_, snd_mixer_compare_t compare) { WARNX1("stub"); return 0; }
const char *snd_mixer_selem_channel_name(snd_mixer_selem_channel_id_t channel) { WARNX1("stub"); return NULL; }
int snd_mixer_selem_register(snd_mixer_t *mixer, struct snd_mixer_selem_regopt *options, snd_mixer_class_t **classp) { WARNX1("stub"); return 0; }
-void snd_mixer_selem_get_id(snd_mixer_elem_t *element, snd_mixer_selem_id_t *id) { WARNX1("stub"); }
unsigned int snd_mixer_selem_get_index(snd_mixer_elem_t *elem) { WARNX1("stub"); return 0; }
-snd_mixer_elem_t *snd_mixer_find_selem(snd_mixer_t *mixer, const snd_mixer_selem_id_t *id) { WARNX1("stub"); return NULL; }
int snd_mixer_selem_is_playback_mono(snd_mixer_elem_t *elem) { WARNX1("stub"); return 0; }
int snd_mixer_selem_has_playback_channel(snd_mixer_elem_t *obj, snd_mixer_selem_channel_id_t channel) { WARNX1("stub"); return 0; }
int snd_mixer_selem_is_capture_mono(snd_mixer_elem_t *elem) { WARNX1("stub"); return 0; }
@@ -421,7 +419,6 @@ int snd_mixer_selem_set_capture_dB_all(snd_mixer_elem_t *elem, long value, int d
int snd_mixer_selem_set_capture_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value) { WARNX1("stub"); return 0; }
int snd_mixer_selem_set_playback_switch_all(snd_mixer_elem_t *elem, int value) { WARNX1("stub"); return 0; }
int snd_mixer_selem_set_capture_switch_all(snd_mixer_elem_t *elem, int value) { WARNX1("stub"); return 0; }
-int snd_mixer_selem_get_playback_volume_range(snd_mixer_elem_t *elem, long *min, long *max) { WARNX1("stub"); return 0; }
int snd_mixer_selem_set_playback_volume_range(snd_mixer_elem_t *elem, long min, long max) { WARNX1("stub"); return 0; }
int snd_mixer_selem_get_capture_volume_range(snd_mixer_elem_t *elem, long *min, long *max) { WARNX1("stub"); return 0; }
int snd_mixer_selem_get_capture_dB_range(snd_mixer_elem_t *elem, long *min, long *max) { WARNX1("stub"); return 0; }
@@ -437,7 +434,6 @@ size_t snd_mixer_selem_id_sizeof(void) { WARNX1("stub"); return 0; }
void snd_mixer_selem_id_copy(snd_mixer_selem_id_t *dst, const snd_mixer_selem_id_t *src) { WARNX1("stub"); }
const char *snd_mixer_selem_id_get_name(const snd_mixer_selem_id_t *obj) { WARNX1("stub"); return NULL; }
unsigned int snd_mixer_selem_id_get_index(const snd_mixer_selem_id_t *obj) { WARNX1("stub"); return 0; }
-void snd_mixer_selem_id_set_name(snd_mixer_selem_id_t *obj, const char *val) { WARNX1("stub"); }
void snd_mixer_selem_id_set_index(snd_mixer_selem_id_t *obj, unsigned int val) { WARNX1("stub"); }
int snd_mixer_selem_compare(const snd_mixer_elem_t *c1, const snd_mixer_elem_t *c2) { WARNX1("stub"); return 0; }
int snd_mixer_sbasic_info(const snd_mixer_class_t *class, sm_class_basic_t *info) { WARNX1("stub"); return 0; }