summaryrefslogtreecommitdiff
path: root/src/audio/audio_fsm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/audio_fsm.cpp')
-rw-r--r--src/audio/audio_fsm.cpp71
1 files changed, 28 insertions, 43 deletions
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp
index 6cca8211..9121cb5a 100644
--- a/src/audio/audio_fsm.cpp
+++ b/src/audio/audio_fsm.cpp
@@ -25,6 +25,7 @@
#include "future_fetcher.hpp"
#include "i2s_audio_output.hpp"
#include "i2s_dac.hpp"
+#include "service_locator.hpp"
#include "system_events.hpp"
#include "track.hpp"
#include "track_queue.hpp"
@@ -33,49 +34,15 @@ namespace audio {
static const char kTag[] = "audio_fsm";
-drivers::IGpios* AudioState::sIGpios;
-std::shared_ptr<drivers::I2SDac> AudioState::sDac;
-std::weak_ptr<database::Database> AudioState::sDatabase;
+std::shared_ptr<system_fsm::ServiceLocator> AudioState::sServices;
std::shared_ptr<FatfsAudioInput> AudioState::sFileSource;
std::unique_ptr<Decoder> AudioState::sDecoder;
std::shared_ptr<SampleConverter> AudioState::sSampleConverter;
std::shared_ptr<IAudioOutput> AudioState::sOutput;
-TrackQueue* AudioState::sTrackQueue;
std::optional<database::TrackId> AudioState::sCurrentTrack;
-auto AudioState::Init(drivers::IGpios* gpio_expander,
- std::weak_ptr<database::Database> database,
- std::shared_ptr<database::ITagParser> tag_parser,
- drivers::Bluetooth* bluetooth,
- TrackQueue* queue) -> bool {
- sIGpios = gpio_expander;
- sTrackQueue = queue;
-
- auto dac = drivers::I2SDac::create(gpio_expander);
- if (!dac) {
- return false;
- }
- sDac.reset(dac.value());
- sDatabase = database;
-
- sFileSource.reset(new FatfsAudioInput(tag_parser));
- sOutput.reset(new I2SAudioOutput(sIGpios, sDac));
- // sOutput.reset(new BluetoothAudioOutput(bluetooth));
-
- sSampleConverter.reset(new SampleConverter());
- sSampleConverter->SetOutput(sOutput);
-
- Decoder::Start(sFileSource, sSampleConverter);
-
- return true;
-}
-
-void AudioState::react(const system_fsm::StorageMounted& ev) {
- sDatabase = ev.db;
-}
-
void AudioState::react(const system_fsm::KeyUpChanged& ev) {
if (ev.falling && sOutput->AdjustVolumeUp()) {
ESP_LOGI(kTag, "volume up!");
@@ -100,7 +67,26 @@ void AudioState::react(const system_fsm::HasPhonesChanged& ev) {
namespace states {
-void Uninitialised::react(const system_fsm::BootComplete&) {
+void Uninitialised::react(const system_fsm::BootComplete& ev) {
+ sServices = ev.services;
+
+ auto dac = drivers::I2SDac::create(sServices->gpios());
+ if (!dac) {
+ events::System().Dispatch(system_fsm::FatalError{});
+ events::Ui().Dispatch(system_fsm::FatalError{});
+ return;
+ }
+
+ sFileSource.reset(new FatfsAudioInput(sServices->tag_parser()));
+ sOutput.reset(new I2SAudioOutput(sServices->gpios(),
+ std::unique_ptr<drivers::I2SDac>{*dac}));
+ // sOutput.reset(new BluetoothAudioOutput(bluetooth));
+
+ sSampleConverter.reset(new SampleConverter());
+ sSampleConverter->SetOutput(sOutput);
+
+ Decoder::Start(sFileSource, sSampleConverter);
+
transit<Standby>();
}
@@ -117,19 +103,18 @@ void Standby::react(const internal::InputFileOpened& ev) {
}
void Standby::react(const QueueUpdate& ev) {
- auto current_track = sTrackQueue->GetCurrent();
+ auto current_track = sServices->track_queue().GetCurrent();
if (!current_track || (sCurrentTrack && *sCurrentTrack == *current_track)) {
return;
}
sCurrentTrack = current_track;
- auto db = sDatabase.lock();
+ auto db = sServices->database().lock();
if (!db) {
ESP_LOGW(kTag, "database not open; ignoring play request");
return;
}
-
sFileSource->SetPath(db->GetTrackPath(*current_track));
}
@@ -158,7 +143,7 @@ void Playback::react(const QueueUpdate& ev) {
if (!ev.current_changed) {
return;
}
- auto current_track = sTrackQueue->GetCurrent();
+ auto current_track = sServices->track_queue().GetCurrent();
if (!current_track) {
sFileSource->SetPath();
sCurrentTrack.reset();
@@ -168,7 +153,7 @@ void Playback::react(const QueueUpdate& ev) {
sCurrentTrack = current_track;
- auto db = sDatabase.lock();
+ auto db = sServices->database().lock();
if (!db) {
return;
}
@@ -191,8 +176,8 @@ void Playback::react(const internal::InputFileClosed& ev) {}
void Playback::react(const internal::InputFileFinished& ev) {
ESP_LOGI(kTag, "finished playing file");
- sTrackQueue->Next();
- if (!sTrackQueue->GetCurrent()) {
+ sServices->track_queue().Next();
+ if (!sServices->track_queue().GetCurrent()) {
transit<Standby>();
}
}