Skip to content

Commit

Permalink
fix(audio): use unsigned saturation for unsigned audio format
Browse files Browse the repository at this point in the history
  • Loading branch information
raphaelcoeffic committed Jan 17, 2025
1 parent 4f4c066 commit 5f83f1e
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 6 deletions.
19 changes: 16 additions & 3 deletions radio/src/audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,14 +388,24 @@ void audioTask(void * pdata)
#define _sat_s16(x) __SSAT((x), 16)
#endif

#if !defined(__USAT)
#define _sat_u16(x) ((uint16_t)limit<uint32_t>(UINT16_MIN, (x), UINT16_MAX))
#else
#define _sat_u16(x) __USAT((x), 16)
#endif

inline void mixSample(audio_data_t * result, int16_t sample, unsigned int fade)
{
int32_t tmp = (int32_t)*result + ((int32_t)sample >> fade);
#if AUDIO_SAMPLE_FMT == AUDIO_SAMPLE_FMT_S16
*result = (audio_data_t)_sat_s16(tmp);
#elif AUDIO_SAMPLE_FMT == AUDIO_SAMPLE_FMT_U16
*result = (audio_data_t)_sat_u16((uint32_t)tmp);
#endif
}

#define RIFF_CHUNK_SIZE 12
uint8_t wavBuffer[AUDIO_BUFFER_SIZE*2] __DMA;
uint8_t wavBuffer[AUDIO_BUFFER_SIZE * 2] __DMA;

int WavContext::mixBuffer(AudioBuffer *buffer, int volume, unsigned int fade)
{
Expand Down Expand Up @@ -648,8 +658,11 @@ void AudioQueue::wakeup()
#if defined(SOFTWARE_VOLUME)
if (currentSpeakerVolume > 0) {
for (uint32_t i=0; i<buffer->size; ++i) {
int32_t tmpSample = (int32_t) ((uint32_t) (buffer->data[i]) - AUDIO_DATA_SILENCE); // conversion from uint16_t
buffer->data[i] = (int16_t) (((tmpSample * currentSpeakerVolume) / VOLUME_LEVEL_MAX) + AUDIO_DATA_SILENCE);
int32_t tmpSample =
(int32_t)((uint32_t)(buffer->data[i]) - AUDIO_DATA_SILENCE);
buffer->data[i] = (int16_t)(((tmpSample * currentSpeakerVolume) /
VOLUME_LEVEL_MAX) +
AUDIO_DATA_SILENCE);
}
buffersFifo.audioPushBuffer();
} else {
Expand Down
4 changes: 2 additions & 2 deletions radio/src/audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ constexpr uint8_t AUDIO_FILENAME_MAXLEN = (AUDIO_LUA_FILENAME_MAXLEN > AUDIO_MOD
#if defined(SIMU) || defined(AUDIO_SPI)
#define AUDIO_SAMPLE_FMT AUDIO_SAMPLE_FMT_S16
#else
#define AUDIO_SAMPLE_FMT AUDIO_SAMPLE_FMT_U12
#define AUDIO_SAMPLE_FMT AUDIO_SAMPLE_FMT_U16
#endif
#endif

Expand All @@ -107,7 +107,7 @@ constexpr uint8_t AUDIO_FILENAME_MAXLEN = (AUDIO_LUA_FILENAME_MAXLEN > AUDIO_MOD
#if AUDIO_SAMPLE_FMT == AUDIO_SAMPLE_FMT_S16
typedef int16_t audio_data_t;
#define AUDIO_DATA_SILENCE 0
#elif AUDIO_SAMPLE_FMT == AUDIO_SAMPLE_FMT_U12
#elif AUDIO_SAMPLE_FMT == AUDIO_SAMPLE_FMT_U16
typedef uint16_t audio_data_t;
#define AUDIO_DATA_SILENCE 0x8000
#else
Expand Down
2 changes: 1 addition & 1 deletion radio/src/hal/audio_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#define AUDIO_SAMPLE_RATE 32000

#define AUDIO_SAMPLE_FMT_S16 0
#define AUDIO_SAMPLE_FMT_U12 1
#define AUDIO_SAMPLE_FMT_U16 1


void audioSetVolume(uint8_t volume);
Expand Down

0 comments on commit 5f83f1e

Please sign in to comment.