summaryrefslogtreecommitdiff
path: root/src/audio/audio_element_handle.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-02-21 14:40:18 +1100
committerjacqueline <me@jacqueline.id.au>2023-02-21 14:40:18 +1100
commit47ae601d417d0ef99eb6fe433ef695614d8d2786 (patch)
treef536ecc214c012c0d69b3a8d350a7a1cadb2f671 /src/audio/audio_element_handle.cpp
parent941bafca17b13547a88668b787ce4c8e064ef7ff (diff)
downloadtangara-fw-47ae601d417d0ef99eb6fe433ef695614d8d2786.tar.gz
Tidy up pipeline and use arena capacity to test for overruns
Diffstat (limited to 'src/audio/audio_element_handle.cpp')
-rw-r--r--src/audio/audio_element_handle.cpp80
1 files changed, 0 insertions, 80 deletions
diff --git a/src/audio/audio_element_handle.cpp b/src/audio/audio_element_handle.cpp
deleted file mode 100644
index c5f0c374..00000000
--- a/src/audio/audio_element_handle.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#include "audio_element_handle.hpp"
-#include "audio_element.hpp"
-#include "freertos/projdefs.h"
-#include "freertos/task.h"
-
-namespace audio {
-
-AudioElementHandle::AudioElementHandle(std::unique_ptr<TaskHandle_t> task,
- std::shared_ptr<IAudioElement> element)
- : task_(std::move(task)), element_(std::move(element)) {}
-
-AudioElementHandle::~AudioElementHandle() {
- Quit();
-}
-
-auto AudioElementHandle::CurrentState() -> ElementState {
- return element_->ElementState();
-}
-
-auto AudioElementHandle::PlayPause(enum PlayPause state) -> void {
- ElementState s = CurrentState();
- if (state == PLAY && s == STATE_PAUSE) {
- // Ensure we actually finished any previous pause command.
- // TODO: really?
- PauseSync();
- SetStateAndWakeUp(STATE_RUN);
- return;
- }
- if (state == PAUSE && s == STATE_RUN) {
- element_->ElementState(STATE_PAUSE);
- SetStateAndWakeUp(STATE_PAUSE);
- return;
- }
-}
-
-auto AudioElementHandle::Quit() -> void {
- SetStateAndWakeUp(STATE_QUIT);
-}
-
-auto AudioElementHandle::PauseSync() -> void {
- PlayPause(PAUSE);
- MonitorUntilState(eSuspended);
-}
-
-auto AudioElementHandle::QuitSync() -> void {
- Quit();
- MonitorUntilState(eDeleted);
-}
-
-auto AudioElementHandle::MonitorUntilState(eTaskState desired) -> void {
- while (eTaskGetState(*task_) != desired) {
- WakeUpTask();
- vTaskDelay(pdMS_TO_TICKS(1));
- }
-}
-
-auto AudioElementHandle::SetStateAndWakeUp(ElementState state) -> void {
- element_->ElementState(state);
- WakeUpTask();
-}
-
-auto AudioElementHandle::WakeUpTask() -> void {
- // TODO: various races where the task isn't blocked yet, but there is a block
- // between now and its next element state check. Also think about chunk blocks
- // nested in element bodies.
- // Maybe we need a big mutex or semaphore somewhere in here.
- switch (eTaskGetState(*task_)) {
- case eBlocked:
- // TODO: when is this safe?
- xTaskAbortDelay(*task_);
- break;
- case eSuspended:
- vTaskResume(*task_);
- break;
- default:
- return;
- }
-}
-
-} // namespace audio