summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-06-01 15:28:10 +1000
committerjacqueline <me@jacqueline.id.au>2023-06-01 15:28:10 +1000
commitdb2e29a72d9b934e7b58f1d20ac3768eae484ab5 (patch)
treefcbf75def2f8672188e37e3e79c2c5be6929c6ad
parent4b93bb22db02b8882338a2092fd240ca15e91c6d (diff)
downloadtangara-fw-db2e29a72d9b934e7b58f1d20ac3768eae484ab5.tar.gz
Start on audio FSM playback. needs more thought.
-rw-r--r--src/audio/audio_fsm.cpp7
-rw-r--r--src/audio/audio_task.cpp5
-rw-r--r--src/audio/fatfs_audio_input.cpp6
-rw-r--r--src/audio/include/audio_events.hpp8
-rw-r--r--src/audio/include/audio_fsm.hpp7
-rw-r--r--src/audio/include/fatfs_audio_input.hpp4
6 files changed, 32 insertions, 5 deletions
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp
index 17bb888c..a1bb956f 100644
--- a/src/audio/audio_fsm.cpp
+++ b/src/audio/audio_fsm.cpp
@@ -6,6 +6,7 @@
#include "audio_fsm.hpp"
#include "audio_decoder.hpp"
+#include "audio_events.hpp"
#include "audio_task.hpp"
#include "dac.hpp"
#include "fatfs_audio_input.hpp"
@@ -50,6 +51,12 @@ void Uninitialised::react(const system_fsm::BootComplete&) {
});
}
+void Standby::react(const PlayFile &ev) {
+ if (sFileSource->OpenFile(ev.filename)) {
+ transit<Playback>();
+ }
+}
+
} // namespace states
} // namespace audio
diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp
index 58466c4f..6cc2d927 100644
--- a/src/audio/audio_task.cpp
+++ b/src/audio/audio_task.cpp
@@ -21,6 +21,7 @@
#include "esp_err.h"
#include "esp_heap_caps.h"
#include "esp_log.h"
+#include "event_queue.hpp"
#include "freertos/portmacro.h"
#include "freertos/projdefs.h"
#include "freertos/queue.h"
@@ -44,10 +45,14 @@ static const char* kTag = "task";
void AudioTaskMain(std::unique_ptr<Pipeline> pipeline, IAudioSink* sink) {
std::optional<StreamInfo::Format> output_format;
+ uint_fast16_t delay_ticks = pdMS_TO_TICKS(5);
std::vector<Pipeline*> elements = pipeline->GetIterationOrder();
+ events::EventQueue &event_queue = events::EventQueue::GetInstance();
while (1) {
+ event_queue.ServiceAudio(delay_ticks);
+
for (int i = 0; i < elements.size(); i++) {
std::vector<RawStream> raw_in_streams;
elements.at(i)->InStreams(&raw_in_streams);
diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp
index affe2ff3..ed5db315 100644
--- a/src/audio/fatfs_audio_input.cpp
+++ b/src/audio/fatfs_audio_input.cpp
@@ -35,7 +35,7 @@ FatfsAudioInput::FatfsAudioInput()
FatfsAudioInput::~FatfsAudioInput() {}
-auto FatfsAudioInput::OpenFile(const std::string& path) -> void {
+auto FatfsAudioInput::OpenFile(const std::string& path) -> bool {
if (is_file_open_) {
f_close(&current_file_);
is_file_open_ = false;
@@ -44,11 +44,11 @@ auto FatfsAudioInput::OpenFile(const std::string& path) -> void {
FRESULT res = f_open(&current_file_, path.c_str(), FA_READ);
if (res != FR_OK) {
ESP_LOGE(kTag, "failed to open file! res: %i", res);
- // TODO(jacqueline): Handle errors.
- return;
+ return false;
}
is_file_open_ = true;
+ return true;
}
auto FatfsAudioInput::Process(const std::vector<InputStream>& inputs,
diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp
index e59d7739..765e0899 100644
--- a/src/audio/include/audio_events.hpp
+++ b/src/audio/include/audio_events.hpp
@@ -6,14 +6,22 @@
#pragma once
+#include <string>
+
#include "tinyfsm.hpp"
#include "song.hpp"
namespace audio {
+struct PlayFile : tinyfsm::Event {
+ std::string filename;
+};
+
struct PlaySong : tinyfsm::Event {
database::SongId id;
+ std::optional<database::SongData> data;
+ std::optional<database::SongTags> tags;
};
} // namespace audio
diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp
index bf5acf69..7368cfc8 100644
--- a/src/audio/include/audio_fsm.hpp
+++ b/src/audio/include/audio_fsm.hpp
@@ -37,6 +37,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> {
virtual void react(const system_fsm::BootComplete&) {}
virtual void react(const PlaySong&) {}
+ virtual void react(const PlayFile&) {}
protected:
static drivers::GpioExpander* sGpioExpander;
@@ -59,6 +60,12 @@ class Uninitialised : public AudioState {
class Standby : public AudioState {
public:
void react(const PlaySong&) override {}
+ void react(const PlayFile&) override;
+ using AudioState::react;
+};
+
+class Playback : public AudioState {
+ public:
using AudioState::react;
};
diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/audio/include/fatfs_audio_input.hpp
index d2285515..98ad4d2b 100644
--- a/src/audio/include/fatfs_audio_input.hpp
+++ b/src/audio/include/fatfs_audio_input.hpp
@@ -28,10 +28,10 @@ namespace audio {
class FatfsAudioInput : public IAudioElement {
public:
- explicit FatfsAudioInput();
+ FatfsAudioInput();
~FatfsAudioInput();
- auto OpenFile(const std::string& path) -> void;
+ auto OpenFile(const std::string& path) -> bool;
auto Process(const std::vector<InputStream>& inputs, OutputStream* output)
-> void override;