summaryrefslogtreecommitdiff
path: root/src/audio/audio_task.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-06-22 09:40:46 +1000
committerjacqueline <me@jacqueline.id.au>2023-06-22 09:40:46 +1000
commitcde8002df4a86a2a6efd4aa0b5c174b2f39f7bf7 (patch)
tree58f7281b56539eee5a5b12e981b59349511c3c2c /src/audio/audio_task.cpp
parentb58b072d2d42cc1a9dab3e6b27f2f3ae70fe7610 (diff)
downloadtangara-fw-cde8002df4a86a2a6efd4aa0b5c174b2f39f7bf7.tar.gz
Fix (i think?) mysterious overly large reads in libmad
Diffstat (limited to 'src/audio/audio_task.cpp')
-rw-r--r--src/audio/audio_task.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp
index d4c1d27a..24bc7be7 100644
--- a/src/audio/audio_task.cpp
+++ b/src/audio/audio_task.cpp
@@ -173,11 +173,11 @@ void AudioTaskMain(std::unique_ptr<Pipeline> pipeline, IAudioSink* sink) {
float samples_sunk = bytes_sunk;
samples_sunk /= pcm.channels;
- int8_t bps = pcm.bits_per_sample;
- if (bps == 24) {
- bps = 32;
- }
- samples_sunk /= (bps / 8);
+ // Samples must be aligned to 16 bits. The number of actual bytes per
+ // sample is therefore the bps divided by 16, rounded up (align to word),
+ // times two (convert to bytes).
+ uint8_t bytes_per_sample = ((pcm.bits_per_sample + 16 - 1) / 16) * 2;
+ samples_sunk /= bytes_per_sample;
current_sample_in_second += samples_sunk;
while (current_sample_in_second >= pcm.sample_rate) {