summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-07-26 17:36:10 +1000
committerjacqueline <me@jacqueline.id.au>2023-07-26 17:36:10 +1000
commitb05db70c14e8835989fb7df60775f68d2732cd69 (patch)
tree107ffebd12e2e2ea3c3b16b73b4b6f56dc3e5931 /src
parent9b1b401dcb986a26d10bcc898be670653acc2d3f (diff)
downloadtangara-fw-b05db70c14e8835989fb7df60775f68d2732cd69.tar.gz
Fix premature end of track
Diffstat (limited to 'src')
-rw-r--r--src/audio/audio_fsm.cpp4
-rw-r--r--src/audio/audio_task.cpp13
-rw-r--r--src/audio/fatfs_audio_input.cpp2
-rw-r--r--src/audio/include/audio_source.hpp2
4 files changed, 8 insertions, 13 deletions
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp
index c8d64bdd..b8c20584 100644
--- a/src/audio/audio_fsm.cpp
+++ b/src/audio/audio_fsm.cpp
@@ -15,6 +15,7 @@
#include "event_queue.hpp"
#include "fatfs_audio_input.hpp"
#include "freertos/portmacro.h"
+#include "freertos/projdefs.h"
#include "future_fetcher.hpp"
#include "i2s_audio_output.hpp"
#include "i2s_dac.hpp"
@@ -120,6 +121,9 @@ void Playback::entry() {
void Playback::exit() {
ESP_LOGI(kTag, "finishing playback");
+ // TODO(jacqueline): Second case where it's useful to wait for the i2s buffer
+ // to drain.
+ vTaskDelay(pdMS_TO_TICKS(250));
sI2SOutput->SetInUse(false);
}
diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp
index 6079e077..b6eff550 100644
--- a/src/audio/audio_task.cpp
+++ b/src/audio/audio_task.cpp
@@ -68,18 +68,9 @@ auto Timer::SetLengthBytes(uint32_t len) -> void {
}
auto Timer::AddBytes(std::size_t bytes) -> void {
- float samples_sunk = bytes;
- samples_sunk /= format_.channels;
-
- // 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 = ((format_.bits_per_sample + 16 - 1) / 16) * 2;
- samples_sunk /= bytes_per_sample;
-
- current_sample_in_second_ += samples_sunk;
bool incremented = false;
- while (current_sample_in_second_ > format_.sample_rate) {
+ current_sample_in_second_ += bytes_to_samples(bytes);
+ while (current_sample_in_second_ >= format_.sample_rate) {
current_seconds_++;
current_sample_in_second_ -= format_.sample_rate;
incremented = true;
diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp
index d5df61df..07474fd7 100644
--- a/src/audio/fatfs_audio_input.cpp
+++ b/src/audio/fatfs_audio_input.cpp
@@ -295,7 +295,7 @@ auto FatfsAudioInput::CloseCurrentFile() -> void {
}
auto FatfsAudioInput::HasDataRemaining() -> bool {
- return !xStreamBufferIsEmpty(streamer_buffer_) || !streamer_->HasFinished();
+ return !streamer_->HasFinished() || !xStreamBufferIsEmpty(streamer_buffer_);
}
auto FatfsAudioInput::ContainerToStreamType(database::Encoding enc)
diff --git a/src/audio/include/audio_source.hpp b/src/audio/include/audio_source.hpp
index 115f8bf4..055a92cd 100644
--- a/src/audio/include/audio_source.hpp
+++ b/src/audio/include/audio_source.hpp
@@ -27,7 +27,7 @@ class IAudioSource {
public:
Flags(bool is_start, bool is_end) {
flags_[0] = is_start;
- flags_[1] = is_start;
+ flags_[1] = is_end;
}
auto is_start() -> bool { return flags_[0]; }