From: Jakub Nabaglo Date: Tue, 26 Sep 2017 07:24:55 +0000 (+1000) Subject: Attempt to fix hardware volume bug on devices without a linear scale X-Git-Tag: 3.2d10~26^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2915e6672c88b0887ee028eb6d6ea14b1a364518;p=thirdparty%2Fshairport-sync.git Attempt to fix hardware volume bug on devices without a linear scale --- diff --git a/audio_alsa.c b/audio_alsa.c index 3288b85d..8a3c8b65 100644 --- a/audio_alsa.c +++ b/audio_alsa.c @@ -43,11 +43,14 @@ static void play(short buf[], int samples); static void stop(void); static void flush(void); int delay(long *the_delay); +void do_mute(int request); + static void volume(double vol); void do_volume(double vol); -void do_mute(int request); static void linear_volume(double vol); +void do_linear_volume(double vol); + static void parameters(audio_parameters *info); static void mute(int do_mute); static double set_volume; @@ -376,8 +379,7 @@ static int init(int argc, char **argv) { } else { // use the linear scale and do the db conversion ourselves debug(1, "note: the hardware mixer specified -- \"%s\" -- does not have " - "a dB volume scale, so it can't be used. Trying software " - "volume control.", + "a dB volume scale.", alsa_mix_ctrl); if (snd_ctl_open(&ctl, alsa_mix_dev, 0) < 0) { @@ -395,10 +397,14 @@ static int init(int argc, char **argv) { debug(1, "Volume control \"%s\" has dB volume from %f to %f.", alsa_mix_ctrl, (1.0 * alsa_mix_mindb) / 100.0, (1.0 * alsa_mix_maxdb) / 100.0); has_softvol = 1; + audio_alsa.volume = &volume; // insert the volume function now we know it can do dB stuff + audio_alsa.parameters = ¶meters; // likewise the parameters stuff } else { debug(1, "Cannot get the dB range from the volume control \"%s\"", alsa_mix_ctrl); } + + /* debug(1, "Min and max volumes are %d and %d.",alsa_mix_minv,alsa_mix_maxv);