summaryrefslogtreecommitdiffstats
path: root/src/audiomixertest.c
diff options
context:
space:
mode:
authorAshok Sidipotu <ashok.sidipotu@collabora.com>2023-12-14 16:19:21 +0530
committerAshok Sidipotu <ashok.sidipotu@collabora.com>2023-12-15 08:09:40 +0100
commit5567e12699dcc6584a620d2682430e3882dc0907 (patch)
treea2378a5199b94566d2cf5311d6f394ad5569cfb9 /src/audiomixertest.c
parentf6eb75678f6c08c4eb3fe232f814834319611ff7 (diff)
audiomixer: add new channel volume API
- Add API to control left and right channel volumes. - Fix a bug in treble gain update. The changed gain value of Treble is not updated in the audiomixer as the gain changed callback(on_eq_params_changed) doesnt look beyond bass for gain controls. Fix this issue by continuing to look beyond bass control. - Adjust the floating point comparision epsilon value from 0.000001 to 0.00001. Bug-AGL: SPEC-4931 Change-Id: I2a242d08f194b66abd84bb31a97364884e8d2a1d Signed-off-by: Ashok Sidipotu <ashok.sidipotu@collabora.com>
Diffstat (limited to 'src/audiomixertest.c')
-rw-r--r--src/audiomixertest.c131
1 files changed, 112 insertions, 19 deletions
diff --git a/src/audiomixertest.c b/src/audiomixertest.c
index ddb7ac9..641fe70 100644
--- a/src/audiomixertest.c
+++ b/src/audiomixertest.c
@@ -69,7 +69,7 @@ set_gain (AudioMixerTest *self, gint id, gfloat gain)
if(id == i) {
if (g_str_equal ("bass", ctrl->name) || g_str_equal ("treble", ctrl->name)) {
- if (fabs (ctrl->gain - gain) < 0.000001)
+ if (fabs (ctrl->gain - gain) < 0.00001)
g_warning ("gain already at requested level %f", ctrl->gain);
else {
audiomixer_change_gain (self->am, ctrl, gain);
@@ -100,10 +100,54 @@ set_volume (AudioMixerTest *self, gint id, double vol)
g_warning ("volume cannot be applied for %s control", ctrl->name);
else {
- if (fabs (ctrl->volume - vol) < 0.000001)
+ if (fabs (ctrl->volume - vol) < 0.00001)
g_warning ("volume is already at requested level %f", ctrl->volume);
else {
- audiomixer_change_volume (self->am, ctrl, (double)vol);
+ audiomixer_change_volume (self->am, ctrl, vol);
+ ret = TRUE;
+ }
+
+ }
+ break;
+ }
+ }
+
+ return ret;
+}
+
+
+static gint
+set_channels_volume (AudioMixerTest *self, gint id, double lvol, double rvol)
+{
+ gint ret = -1;
+ int i;
+ gboolean set_left_channel_volume = TRUE;
+ gboolean set_right_channel_volume = TRUE;
+
+ for (i = 0; i < self->nctrls; i++) {
+ const struct mixer_control *ctrl = self->ctrls[i];
+
+ if (id == i) {
+ if (g_str_equal ("bass", ctrl->name) || g_str_equal ("treble", ctrl->name))
+ g_warning ("volume cannot be applied for %s control", ctrl->name);
+ else {
+
+ if (fabs (ctrl->lvolume - lvol) < 0.00001) {
+ set_left_channel_volume = FALSE;
+ lvol = ctrl->lvolume;
+ g_warning ("left volume is already at requested level %f",
+ ctrl->lvolume);
+ }
+
+ if (fabs (ctrl->rvolume - rvol) < 0.00001) {
+ set_right_channel_volume = FALSE;
+ rvol = ctrl->rvolume;
+ g_warning ("right volume is already at requested level %f",
+ ctrl->rvolume);
+ }
+
+ if (set_left_channel_volume || set_right_channel_volume) {
+ audiomixer_change_channel_volume (self->am, ctrl, lvol, rvol);
ret = TRUE;
}
@@ -129,8 +173,9 @@ print_ctrls (AudioMixerTest *self)
fprintf(stdout, "\n%2d. %-25s [gain: %.2f]", i, ctrl->name,
ctrl->gain);
else
- fprintf(stdout, "\n%2d. %-25s [vol: %.2f, mute:%d]", i, ctrl->name,
- ctrl->volume, ctrl->mute);
+ fprintf (stdout, "\n%2d. %-25s [vol: %.2f, lvol: %.2f, rvol: %.2f,"
+ " mute:%d]", i, ctrl->name, ctrl->volume, ctrl->lvolume, ctrl->rvolume,
+ ctrl->mute);
}
fprintf (stdout, "\n");
}
@@ -149,21 +194,33 @@ static void show_help (void)
" -h, --help Show this help\n"
" -p, --print-controls prints controls\n"
" -i, --id control id(serial#) of the control, take a look at the controls to get the id of control\n"
- " Examples\n"
+ " Examples:\n"
" audio-mixer-test -> prints the controls and help text\n"
" audio-mixer-test -p -> prints only the controls\n"
- " -v, --set-volume set volume level for volume controls(all controls except bass and treble)\n"
- " Examples\n"
- " audio-mixer-test -v 0.2 -> sets volume of the 1st control with 0.2\n"
- " audio-mixer-test -i 9 -v 0.2 -> sets volume of the 9th control with 0.2\n"
- " -g, --set-gain gain level for gain controls like bass and treble\n"
- " Examples\n"
- " audio-mixer-test -i 11 -g 0.8 -> sets gain of the 11th control with 0.8\n"
+ " -v, --set-volume set volume level for a volume control(all controls except bass and treble) this option sets\n"
+ " volume for all the channels, for setting channel specific volumes check -l or -r options\n"
+ " Examples:\n"
+ " audio-mixer-test -v 0.2 -> sets volume(for all channels) of the 1st control(default id)\n"
+ " with 0.2\n"
+ " audio-mixer-test -i 9 -v 0.2 -> sets volume of the 9th control with 0.2\n"
+ " -l, --left-chan-vol set left channel volume for a volume control(all controls except bass and treble)\n"
+ " -r, --right-chan-vol set right channel volume for a volume control(all controls except bass and treble)\n"
+ " only stereo channels are supported for now, and vol update on both the channels is required\n"
+ " Examples:\n"
+ " audio-mixer-test -l 0.2 -> gives an error as only one channel is updated\n"
+ " audio-mixer-test -l 0.1 -r 0.2 -> sets left channel volume of 0.1 and right channel volume of\n"
+ " 0.2 on the 1st control (default id) with 0.2\n"
+ " audio-mixer-test -i 9 -l 0.1 -r 0.2 -> sets left channel volume of 0.1 and right channel volume\n"
+ " of 0.2 on the 9th control with 0.2\n"
+ " -g, --set-gain set gain level for gain controls like bass and treble\n"
+ " Examples:\n"
+ " audio-mixer-test -i 12 -g 0.8 -> sets gain of the 11th control with 0.8\n"
" -m, --set-mute mute/unmute volume controls(all controls except bass and treble) takes no arguments\n"
- " Examples\n"
- " audio-mixer-test -m -> mutes the 1st control\n"
- " audio-mixer-test -m -> unmutes the 1st control, if it is issued after the above command\n"
- " audio-mixer-test -i 9 -m -> mutes 9th control (Multimedia) with 0.8\n");
+ " Examples:\n"
+ " audio-mixer-test -m -> mutes the 1st control (default id)\n"
+ " audio-mixer-test -m -> unmutes the 1st control (default id), if it is issued after\n"
+ " the above command\n"
+ " audio-mixer-test -i 9 -m -> mutes 9th control (Multimedia) with 0.8\n");
}
static void
@@ -192,8 +249,10 @@ main (gint argc, gchar **argv)
struct audiomixer_events audiomixer_events = { 0 };
gint id = -1;
- double vol = 0.0;
+ double vol = 0.0, lvol = 0.0, rvol = 0.0;
gfloat gain = 0.0;
+ gboolean set_right_channel_volume = FALSE;
+ gboolean set_left_channel_volume = FALSE;
self.loop = g_main_loop_new (NULL, FALSE);
@@ -245,13 +304,15 @@ main (gint argc, gchar **argv)
{ "help", no_argument, NULL, 'h' },
{ "print-controls", no_argument, NULL, 'p' },
{ "id", required_argument, NULL, 'i' },
+ { "left-chan-vol", required_argument, NULL, 'l' },
+ { "right-chan-vol", required_argument, NULL, 'r' },
{ "set-volume", required_argument, NULL, 'v' },
{ "set-mute", no_argument, NULL, 'm' },
{ "set-gain", required_argument, NULL, 'g' },
{ NULL, 0, NULL, 0}
};
- while ((c = getopt_long (argc, argv, "hpi:v:mg:", long_options, NULL)) != -1) {
+ while ((c = getopt_long (argc, argv, "hpi:v:mg:l:r:", long_options, NULL)) != -1) {
switch(c) {
case 'h':
show_help ();
@@ -285,6 +346,26 @@ main (gint argc, gchar **argv)
break;
+ case 'l':
+ if (id == -1) {
+ g_warning ("control id not given defaulting it to 0(Master Playback)");
+ id = 0;
+ }
+
+ lvol = (double)atof (optarg);
+ set_left_channel_volume = TRUE;
+ break;
+
+ case 'r':
+ if (id == -1) {
+ g_warning ("control id not given defaulting it to 0(Master Playback)");
+ id = 0;
+ }
+
+ rvol = (double)atof (optarg);
+ set_right_channel_volume = TRUE;
+ break;
+
case 'm':
if (id == -1) {
g_warning ("control id not given defaulting it to 0(Master Playback)");
@@ -322,6 +403,18 @@ main (gint argc, gchar **argv)
}
}
+ if (set_left_channel_volume && set_right_channel_volume) {
+ ret = set_channels_volume (&self, id, lvol, rvol);
+ if (ret != TRUE)
+ g_warning ("set_channels_volume failed");
+ else
+ /* wait for volume to be acked */
+ g_main_loop_run (self.loop);
+ }
+ else if (set_left_channel_volume || set_right_channel_volume) {
+ g_warning ("set volume of both left and right channels");
+ }
+
exit:
/* clean up at program exit */
audio_mixer_clear (&self);