From 28dd71905fc8d1b3897a55c45ade11d3cc43dc02 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 21:44:33 +0100 Subject: [PATCH] Fixes #3375: better linearity for Horus volume control --- radio/src/targets/horus/audio_driver.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/radio/src/targets/horus/audio_driver.cpp b/radio/src/targets/horus/audio_driver.cpp index 07223b6e0..28147dd9a 100644 --- a/radio/src/targets/horus/audio_driver.cpp +++ b/radio/src/targets/horus/audio_driver.cpp @@ -20,12 +20,6 @@ #include "../../opentx.h" -const uint8_t volumeScale[VOLUME_LEVEL_MAX+1] = { - 254, 127, 110, 100, 90, 80, 70, 60, 50, 40, - 30, 20, 19, 18, 17, 16, 15, 14, 13, 12, - 11, 10, 5, 0 -}; - #if !defined(SIMU) #define VS_WRITE_COMMAND 0x02 @@ -414,13 +408,24 @@ bool audioPushBuffer(AudioBuffer * buffer) } } +// adjust this value for a volume level just above the silence +// values is attenuation in dB, higher value - less volume +// max value is 126 +#define VOLUME_MIN_DB 40 + void setScaledVolume(uint8_t volume) { if (volume > VOLUME_LEVEL_MAX) { volume = VOLUME_LEVEL_MAX; } - - setVolume(volumeScale[volume]); + // maximum volume is 0x00 and total silence is 0xFE + if (volume == 0) { + setVolume(0xFE); // silence + } + else { + uint32_t vol = (VOLUME_MIN_DB * 2) - ((uint32_t)volume * (VOLUME_MIN_DB * 2)) / VOLUME_LEVEL_MAX; + setVolume(vol); + } } void setVolume(uint8_t volume)