Start on audio FSM playback. needs more thought.

custom
jacqueline 2 years ago
parent 4b93bb22db
commit db2e29a72d
  1. 7
      src/audio/audio_fsm.cpp
  2. 5
      src/audio/audio_task.cpp
  3. 6
      src/audio/fatfs_audio_input.cpp
  4. 8
      src/audio/include/audio_events.hpp
  5. 7
      src/audio/include/audio_fsm.hpp
  6. 4
      src/audio/include/fatfs_audio_input.hpp

@ -6,6 +6,7 @@
#include "audio_fsm.hpp" #include "audio_fsm.hpp"
#include "audio_decoder.hpp" #include "audio_decoder.hpp"
#include "audio_events.hpp"
#include "audio_task.hpp" #include "audio_task.hpp"
#include "dac.hpp" #include "dac.hpp"
#include "fatfs_audio_input.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 states
} // namespace audio } // namespace audio

@ -21,6 +21,7 @@
#include "esp_err.h" #include "esp_err.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_log.h" #include "esp_log.h"
#include "event_queue.hpp"
#include "freertos/portmacro.h" #include "freertos/portmacro.h"
#include "freertos/projdefs.h" #include "freertos/projdefs.h"
#include "freertos/queue.h" #include "freertos/queue.h"
@ -44,10 +45,14 @@ static const char* kTag = "task";
void AudioTaskMain(std::unique_ptr<Pipeline> pipeline, IAudioSink* sink) { void AudioTaskMain(std::unique_ptr<Pipeline> pipeline, IAudioSink* sink) {
std::optional<StreamInfo::Format> output_format; std::optional<StreamInfo::Format> output_format;
uint_fast16_t delay_ticks = pdMS_TO_TICKS(5);
std::vector<Pipeline*> elements = pipeline->GetIterationOrder(); std::vector<Pipeline*> elements = pipeline->GetIterationOrder();
events::EventQueue &event_queue = events::EventQueue::GetInstance();
while (1) { while (1) {
event_queue.ServiceAudio(delay_ticks);
for (int i = 0; i < elements.size(); i++) { for (int i = 0; i < elements.size(); i++) {
std::vector<RawStream> raw_in_streams; std::vector<RawStream> raw_in_streams;
elements.at(i)->InStreams(&raw_in_streams); elements.at(i)->InStreams(&raw_in_streams);

@ -35,7 +35,7 @@ FatfsAudioInput::FatfsAudioInput()
FatfsAudioInput::~FatfsAudioInput() {} FatfsAudioInput::~FatfsAudioInput() {}
auto FatfsAudioInput::OpenFile(const std::string& path) -> void { auto FatfsAudioInput::OpenFile(const std::string& path) -> bool {
if (is_file_open_) { if (is_file_open_) {
f_close(&current_file_); f_close(&current_file_);
is_file_open_ = false; 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); FRESULT res = f_open(&current_file_, path.c_str(), FA_READ);
if (res != FR_OK) { if (res != FR_OK) {
ESP_LOGE(kTag, "failed to open file! res: %i", res); ESP_LOGE(kTag, "failed to open file! res: %i", res);
// TODO(jacqueline): Handle errors. return false;
return;
} }
is_file_open_ = true; is_file_open_ = true;
return true;
} }
auto FatfsAudioInput::Process(const std::vector<InputStream>& inputs, auto FatfsAudioInput::Process(const std::vector<InputStream>& inputs,

@ -6,14 +6,22 @@
#pragma once #pragma once
#include <string>
#include "tinyfsm.hpp" #include "tinyfsm.hpp"
#include "song.hpp" #include "song.hpp"
namespace audio { namespace audio {
struct PlayFile : tinyfsm::Event {
std::string filename;
};
struct PlaySong : tinyfsm::Event { struct PlaySong : tinyfsm::Event {
database::SongId id; database::SongId id;
std::optional<database::SongData> data;
std::optional<database::SongTags> tags;
}; };
} // namespace audio } // namespace audio

@ -37,6 +37,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> {
virtual void react(const system_fsm::BootComplete&) {} virtual void react(const system_fsm::BootComplete&) {}
virtual void react(const PlaySong&) {} virtual void react(const PlaySong&) {}
virtual void react(const PlayFile&) {}
protected: protected:
static drivers::GpioExpander* sGpioExpander; static drivers::GpioExpander* sGpioExpander;
@ -59,6 +60,12 @@ class Uninitialised : public AudioState {
class Standby : public AudioState { class Standby : public AudioState {
public: public:
void react(const PlaySong&) override {} void react(const PlaySong&) override {}
void react(const PlayFile&) override;
using AudioState::react;
};
class Playback : public AudioState {
public:
using AudioState::react; using AudioState::react;
}; };

@ -28,10 +28,10 @@ namespace audio {
class FatfsAudioInput : public IAudioElement { class FatfsAudioInput : public IAudioElement {
public: public:
explicit FatfsAudioInput(); 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) auto Process(const std::vector<InputStream>& inputs, OutputStream* output)
-> void override; -> void override;

Loading…
Cancel
Save