summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-07-09 14:41:02 +1000
committerjacqueline <me@jacqueline.id.au>2024-07-09 14:41:02 +1000
commit370d1853b5d099de28c032def4ce3e53b7d735ad (patch)
tree062b6dea507082d28c7bfc2feb7ced450bcd64c8 /src
parent41e0605f17a784e8f125b3ad10ddfe5ef63337d9 (diff)
downloadtangara-fw-370d1853b5d099de28c032def4ce3e53b7d735ad.tar.gz
Break FatfsStreamFactory's dep on ServiceLocator
Diffstat (limited to 'src')
-rw-r--r--src/tangara/audio/audio_fsm.cpp3
-rw-r--r--src/tangara/audio/fatfs_stream_factory.cpp12
-rw-r--r--src/tangara/audio/fatfs_stream_factory.hpp11
-rw-r--r--src/tangara/database/database.cpp6
-rw-r--r--src/tangara/database/database.hpp10
-rw-r--r--src/tangara/system_fsm/service_locator.hpp2
6 files changed, 30 insertions, 14 deletions
diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp
index 8f04c6c1..ad60ab86 100644
--- a/src/tangara/audio/audio_fsm.cpp
+++ b/src/tangara/audio/audio_fsm.cpp
@@ -363,7 +363,8 @@ void Uninitialised::react(const system_fsm::BootComplete& ev) {
sDrainBuffers = std::make_unique<drivers::OutputBuffers>(
kTrackDrainLatencySamples, kSystemDrainLatencySamples);
- sStreamFactory.reset(new FatfsStreamFactory(*sServices));
+ sStreamFactory.reset(
+ new FatfsStreamFactory(sServices->database(), sServices->tag_parser()));
sI2SOutput.reset(new I2SAudioOutput(sServices->gpios(), *sDrainBuffers));
sBtOutput.reset(new BluetoothAudioOutput(
sServices->bluetooth(), *sDrainBuffers, sServices->bg_worker()));
diff --git a/src/tangara/audio/fatfs_stream_factory.cpp b/src/tangara/audio/fatfs_stream_factory.cpp
index 80677b2d..735ec134 100644
--- a/src/tangara/audio/fatfs_stream_factory.cpp
+++ b/src/tangara/audio/fatfs_stream_factory.cpp
@@ -10,7 +10,6 @@
#include <memory>
#include <string>
-#include "database/database.hpp"
#include "esp_log.h"
#include "ff.h"
#include "freertos/portmacro.h"
@@ -19,10 +18,10 @@
#include "audio/audio_source.hpp"
#include "audio/fatfs_source.hpp"
#include "codec.hpp"
+#include "database/database.hpp"
#include "database/tag_parser.hpp"
#include "database/track.hpp"
#include "drivers/spi.hpp"
-#include "system_fsm/service_locator.hpp"
#include "tasks.hpp"
#include "types.hpp"
@@ -30,12 +29,13 @@
namespace audio {
-FatfsStreamFactory::FatfsStreamFactory(system_fsm::ServiceLocator& services)
- : services_(services) {}
+FatfsStreamFactory::FatfsStreamFactory(database::Handle&& handle,
+ database::ITagParser& parser)
+ : db_(handle), tag_parser_(parser) {}
auto FatfsStreamFactory::create(database::TrackId id, uint32_t offset)
-> std::shared_ptr<TaggedStream> {
- auto db = services_.database().lock();
+ auto db = db_.lock();
if (!db) {
return {};
}
@@ -48,7 +48,7 @@ auto FatfsStreamFactory::create(database::TrackId id, uint32_t offset)
auto FatfsStreamFactory::create(std::string path, uint32_t offset)
-> std::shared_ptr<TaggedStream> {
- auto tags = services_.tag_parser().ReadAndParseTags(path);
+ auto tags = tag_parser_.ReadAndParseTags(path);
if (!tags) {
ESP_LOGE(kTag, "failed to read tags");
return {};
diff --git a/src/tangara/audio/fatfs_stream_factory.hpp b/src/tangara/audio/fatfs_stream_factory.hpp
index 858d2131..84073d2d 100644
--- a/src/tangara/audio/fatfs_stream_factory.hpp
+++ b/src/tangara/audio/fatfs_stream_factory.hpp
@@ -6,23 +6,21 @@
#pragma once
-#include <stdint.h>
#include <cstddef>
#include <cstdint>
#include <future>
#include <memory>
#include <string>
-#include "database/database.hpp"
-#include "database/track.hpp"
#include "ff.h"
#include "freertos/portmacro.h"
#include "audio/audio_source.hpp"
#include "codec.hpp"
+#include "database/database.hpp"
#include "database/future_fetcher.hpp"
#include "database/tag_parser.hpp"
-#include "system_fsm/service_locator.hpp"
+#include "database/track.hpp"
#include "tasks.hpp"
#include "types.hpp"
@@ -33,7 +31,7 @@ namespace audio {
*/
class FatfsStreamFactory {
public:
- explicit FatfsStreamFactory(system_fsm::ServiceLocator&);
+ explicit FatfsStreamFactory(database::Handle&&, database::ITagParser&);
auto create(database::TrackId, uint32_t offset = 0)
-> std::shared_ptr<TaggedStream>;
@@ -47,7 +45,8 @@ class FatfsStreamFactory {
auto ContainerToStreamType(database::Container)
-> std::optional<codecs::StreamType>;
- system_fsm::ServiceLocator& services_;
+ database::Handle db_;
+ database::ITagParser& tag_parser_;
};
} // namespace audio
diff --git a/src/tangara/database/database.cpp b/src/tangara/database/database.cpp
index cf1430b3..85700431 100644
--- a/src/tangara/database/database.cpp
+++ b/src/tangara/database/database.cpp
@@ -684,6 +684,12 @@ auto Database::countRecords(const SearchKey& c) -> size_t {
return count;
}
+Handle::Handle(std::shared_ptr<Database>& db) : db_(db) {}
+
+auto Handle::lock() -> std::shared_ptr<Database> {
+ return db_;
+}
+
auto SearchKey::startKey() const -> std::string_view {
if (key) {
return *key;
diff --git a/src/tangara/database/database.hpp b/src/tangara/database/database.hpp
index d2de7c72..c2e72568 100644
--- a/src/tangara/database/database.hpp
+++ b/src/tangara/database/database.hpp
@@ -128,6 +128,16 @@ class Database {
auto countRecords(const SearchKey& c) -> size_t;
};
+class Handle {
+ public:
+ Handle(std::shared_ptr<Database>& db);
+
+ auto lock() -> std::shared_ptr<Database>;
+
+ private:
+ std::shared_ptr<Database>& db_;
+};
+
/*
* Container for the data needed to iterate through database records. This is a
* lower-level type that the higher-level iterators are built from; most users
diff --git a/src/tangara/system_fsm/service_locator.hpp b/src/tangara/system_fsm/service_locator.hpp
index 3d136f3a..d441fa70 100644
--- a/src/tangara/system_fsm/service_locator.hpp
+++ b/src/tangara/system_fsm/service_locator.hpp
@@ -92,7 +92,7 @@ class ServiceLocator {
auto haptics(std::unique_ptr<drivers::Haptics> i) { haptics_ = std::move(i); }
- auto database() -> std::weak_ptr<database::Database> { return database_; }
+ auto database() -> database::Handle { return database_; }
auto database(std::unique_ptr<database::Database> i) {
database_ = std::move(i);