diff --git a/radio/src/boards/rm-h750/audio_driver.cpp b/radio/src/boards/rm-h750/audio_driver.cpp index 732288da7..180c16fb6 100644 --- a/radio/src/boards/rm-h750/audio_driver.cpp +++ b/radio/src/boards/rm-h750/audio_driver.cpp @@ -26,7 +26,6 @@ #include "stm32_i2c_driver.h" #include "stm32_hal_ll.h" -#include "timers_driver.h" #include "audio.h" #include "debug.h" @@ -176,7 +175,7 @@ void audioSetVolume(uint8_t volume) if (btAudioLinked()) volume = volume + (volume >> 2); #endif - tas2505_set_volume(&_tas2505, volume * 9 / 10, audioHeadphoneDetect()); // TX15 HP cannot handle the full power of TAS2505 + tas2505_set_volume(&_tas2505, volume, audioHeadphoneDetect()); } extern "C" void DMA1_Stream4_IRQHandler(void) diff --git a/radio/src/drivers/tas2505.cpp b/radio/src/drivers/tas2505.cpp index e701ed3a3..7cc93b19a 100644 --- a/radio/src/drivers/tas2505.cpp +++ b/radio/src/drivers/tas2505.cpp @@ -131,10 +131,11 @@ int tas2505_init(tas2505_t* dev) // 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 60 +#define VOLUME_MIN_DB 45 void tas2505_set_volume(tas2505_t* dev, uint8_t volume, bool headphone_mode = false) { + TRACE("Set volume: %d, headphone_mode: %d", volume, headphone_mode); if (volume > VOLUME_LEVEL_MAX) { volume = VOLUME_LEVEL_MAX; } diff --git a/radio/src/edgetx.cpp b/radio/src/edgetx.cpp index aa426e8b1..b6f52596e 100644 --- a/radio/src/edgetx.cpp +++ b/radio/src/edgetx.cpp @@ -614,19 +614,20 @@ void calcBacklightValue(int16_t source) #endif } -#define VOLUME_HYSTERESIS 10 // how much must a input value change to actually be considered for new volume setting -getvalue_t requiredSpeakerVolumeRawLast = 1024 + 1; //initial value must be outside normal range +#define VOLUME_SOURCE_DEADZONE 10 // how much must a input value change to actually be considered for new volume setting void calcVolumeValue(int16_t source) { - getvalue_t raw = getValue(source); - // only set volume if input changed more than hysteresis - if (abs(requiredSpeakerVolumeRawLast - raw) > VOLUME_HYSTERESIS) { - requiredSpeakerVolumeRawLast = raw; + int32_t shifted = 1024 + getValue(source); + int32_t v; + if (shifted < VOLUME_SOURCE_DEADZONE) { + v = 0; + } else { + v = 1 + ((shifted - VOLUME_SOURCE_DEADZONE) * (VOLUME_LEVEL_MAX - 1)) / + (2048 - VOLUME_SOURCE_DEADZONE); + if (v > VOLUME_LEVEL_MAX) v = VOLUME_LEVEL_MAX; } - requiredSpeakerVolume = - ((1024 + requiredSpeakerVolumeRawLast) * VOLUME_LEVEL_MAX) / - 2048; + requiredSpeakerVolume = (int16_t)v; } void checkBacklight() diff --git a/radio/src/hal/audio_driver.h b/radio/src/hal/audio_driver.h index d91e52245..d348d3ed4 100644 --- a/radio/src/hal/audio_driver.h +++ b/radio/src/hal/audio_driver.h @@ -24,8 +24,13 @@ #include // Audio volume is defined between 0 and VOLUME_LEVEL_MAX. +// Targets that need a different range can define it in their board/hal header. +#ifndef VOLUME_LEVEL_MAX #define VOLUME_LEVEL_MAX 23 +#endif +#ifndef VOLUME_LEVEL_DEF #define VOLUME_LEVEL_DEF 12 +#endif #define AUDIO_SAMPLE_RATE 32000 diff --git a/radio/src/targets/tx15/hal.h b/radio/src/targets/tx15/hal.h index 53d8d38e0..105ef5b38 100644 --- a/radio/src/targets/tx15/hal.h +++ b/radio/src/targets/tx15/hal.h @@ -197,11 +197,13 @@ SAI1_Block_A: PDM_CLOCK (1 MHz bit-clock output on SAI1_CK1 / PE5, !FLYSKY_GIMBA #define AUDIO_SPI SPI2 #define AUDIO_RESET_PIN GPIO_PIN(GPIOH, 10) #define AUDIO_HP_DETECT_PIN GPIO_PIN(GPIOA, 5) -#define I2S_DMA DMA1 -#define I2S_DMA_Stream LL_DMA_STREAM_4 -#define I2S_DMA_Stream_Request LL_DMAMUX1_REQ_SPI2_TX -#define I2S_DMA_Stream_IRQn DMA1_Stream4_IRQn -#define I2S_DMA_Stream_IRQHandler DMA1_Stream4_IRQHandler +#undef VOLUME_LEVEL_MAX +#define VOLUME_LEVEL_MAX 20 +#define I2S_DMA DMA1 +#define I2S_DMA_Stream LL_DMA_STREAM_4 +#define I2S_DMA_Stream_Request LL_DMAMUX1_REQ_SPI2_TX +#define I2S_DMA_Stream_IRQn DMA1_Stream4_IRQn +#define I2S_DMA_Stream_IRQHandler DMA1_Stream4_IRQHandler // MEMS PDM microphone — not available when FLYSKY_GIMBAL is enabled #if !defined(FLYSKY_GIMBAL) diff --git a/radio/src/targets/tx16smk3/hal.h b/radio/src/targets/tx16smk3/hal.h index a1d84bdeb..ec540649d 100644 --- a/radio/src/targets/tx16smk3/hal.h +++ b/radio/src/targets/tx16smk3/hal.h @@ -401,11 +401,13 @@ USART6: INTMODULE_USART #define AUDIO_SPI SPI2 #define AUDIO_RESET_PIN GPIO_PIN(GPIOH, 10) #define AUDIO_HP_DETECT_PIN GPIO_PIN(GPIOH, 14) -#define I2S_DMA DMA1 -#define I2S_DMA_Stream LL_DMA_STREAM_4 -#define I2S_DMA_Stream_Request LL_DMAMUX1_REQ_SPI2_TX -#define I2S_DMA_Stream_IRQn DMA1_Stream4_IRQn -#define I2S_DMA_Stream_IRQHandler DMA1_Stream4_IRQHandler +#undef VOLUME_LEVEL_MAX +#define VOLUME_LEVEL_MAX 20 +#define I2S_DMA DMA1 +#define I2S_DMA_Stream LL_DMA_STREAM_4 +#define I2S_DMA_Stream_Request LL_DMAMUX1_REQ_SPI2_TX +#define I2S_DMA_Stream_IRQn DMA1_Stream4_IRQn +#define I2S_DMA_Stream_IRQHandler DMA1_Stream4_IRQHandler //MEMS — PDM microphone: // clock output driven by SAI1 block A on SAI1_CK1 / PE5 (AF6, 1 MHz)