Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion radio/src/boards/rm-h750/audio_driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,17 @@ static void audio_update_dma_buffer(uint8_t tc)
}
}

// TX15 HP cannot handle the full power of TAS2505
// max volume is limited to 15db attenuation
// Index 0 = silence
// 1 = low volume
// 11 = center
// 23 = max volume
static const uint8_t volumeScale[VOLUME_LEVEL_MAX + 1] =
{
0, 114, 90, 75, 63, 55, 49, 45, 42, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 18, 17, 16, 15
};

bool audioHeadphoneDetect()
{
#if defined(KCX_BTAUDIO)
Expand All @@ -171,12 +182,17 @@ bool audioHeadphoneDetect()

void audioSetVolume(uint8_t volume)
{
if (volume > VOLUME_LEVEL_MAX) {
volume = VOLUME_LEVEL_MAX;
}

#if defined(KCX_BTAUDIO)
// KCX need a volume boost
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, volumeScale[volume], audioHeadphoneDetect());
}

extern "C" void DMA1_Stream4_IRQHandler(void)
Expand Down
25 changes: 7 additions & 18 deletions radio/src/drivers/tas2505.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,29 +128,18 @@ int tas2505_init(tas2505_t* dev)
return 0;
}

// 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

void tas2505_set_volume(tas2505_t* dev, uint8_t volume, bool headphone_mode = false)
{
if (volume > VOLUME_LEVEL_MAX) {
volume = VOLUME_LEVEL_MAX;
}
// maximum volume is 0x00 and total silence is 0xFE
if (volume == 0) {
volume = 0xFE;
}

if (headphone_mode) {
tas2505_write_reg(dev, TAS2505_SPKVOL1, 0xFE);
tas2505_write_reg(dev, TAS2505_HP_VOL, 0xFE);
tas2505_write_reg(dev, TAS2505_HP_VOL, volume);
} else {
uint32_t vol = (VOLUME_MIN_DB * 2) -
((uint32_t)volume * (VOLUME_MIN_DB * 2)) / VOLUME_LEVEL_MAX;
if (headphone_mode) {
tas2505_write_reg(dev, TAS2505_SPKVOL1, 0xFE);
tas2505_write_reg(dev, TAS2505_HP_VOL, vol);
} else {
tas2505_write_reg(dev, TAS2505_SPKVOL1, vol);
tas2505_write_reg(dev, TAS2505_HP_VOL, 0xFE);
}
tas2505_write_reg(dev, TAS2505_SPKVOL1, volume);
tas2505_write_reg(dev, TAS2505_HP_VOL, 0xFE);
}
}