diff options
Diffstat (limited to 'src/audio/include')
| -rw-r--r-- | src/audio/include/audio_events.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/audio_fsm.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/fatfs_audio_input.hpp | 9 | ||||
| -rw-r--r-- | src/audio/include/track_queue.hpp | 60 |
4 files changed, 24 insertions, 49 deletions
diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp index 9994a9f6..68efcafb 100644 --- a/src/audio/include/audio_events.hpp +++ b/src/audio/include/audio_events.hpp @@ -42,7 +42,7 @@ struct QueueUpdate : tinyfsm::Event { }; struct PlayFile : tinyfsm::Event { - std::pmr::string filename; + std::string filename; }; struct StepUpVolume : tinyfsm::Event {}; diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp index 256e1430..c9fac08b 100644 --- a/src/audio/include/audio_fsm.hpp +++ b/src/audio/include/audio_fsm.hpp @@ -60,6 +60,8 @@ class AudioState : public tinyfsm::Fsm<AudioState> { virtual void react(const internal::AudioPipelineIdle&) {} protected: + auto playTrack(database::TrackId id) -> void; + static std::shared_ptr<system_fsm::ServiceLocator> sServices; static std::shared_ptr<FatfsAudioInput> sFileSource; diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/audio/include/fatfs_audio_input.hpp index c7d52ca3..f9635b86 100644 --- a/src/audio/include/fatfs_audio_input.hpp +++ b/src/audio/include/fatfs_audio_input.hpp @@ -38,8 +38,8 @@ class FatfsAudioInput : public IAudioSource { * Immediately cease reading any current source, and begin reading from the * given file path. */ - auto SetPath(std::future<std::optional<std::pmr::string>>) -> void; - auto SetPath(const std::pmr::string&) -> void; + auto SetPath(std::optional<std::string>) -> void; + auto SetPath(const std::string&) -> void; auto SetPath() -> void; auto HasNewStream() -> bool override; @@ -49,7 +49,7 @@ class FatfsAudioInput : public IAudioSource { FatfsAudioInput& operator=(const FatfsAudioInput&) = delete; private: - auto OpenFile(const std::pmr::string& path) -> bool; + auto OpenFile(const std::string& path) -> bool; auto ContainerToStreamType(database::Container) -> std::optional<codecs::StreamType>; @@ -61,9 +61,6 @@ class FatfsAudioInput : public IAudioSource { std::shared_ptr<TaggedStream> new_stream_; std::atomic<bool> has_new_stream_; - - std::unique_ptr<database::FutureFetcher<std::optional<std::pmr::string>>> - pending_path_; }; } // namespace audio diff --git a/src/audio/include/track_queue.hpp b/src/audio/include/track_queue.hpp index bec887ae..4a1984c9 100644 --- a/src/audio/include/track_queue.hpp +++ b/src/audio/include/track_queue.hpp @@ -9,10 +9,11 @@ #include <list> #include <memory> #include <mutex> +#include <shared_mutex> #include <vector> #include "database.hpp" -#include "source.hpp" +#include "tasks.hpp" #include "track.hpp" namespace audio { @@ -32,77 +33,52 @@ namespace audio { */ class TrackQueue { public: - TrackQueue(); - - class Editor { - public: - ~Editor(); - - // Cannot be copied or moved. - Editor(const Editor&) = delete; - Editor& operator=(const Editor&) = delete; - - private: - friend TrackQueue; - - Editor(TrackQueue&); - - std::lock_guard<std::recursive_mutex> lock_; - bool has_current_changed_; - }; - - auto Edit() -> Editor; + TrackQueue(tasks::Worker& bg_worker); /* Returns the currently playing track. */ - auto Current() const -> std::optional<database::TrackId>; + auto current() const -> std::optional<database::TrackId>; /* Returns, in order, tracks that have been queued to be played next. */ - auto PeekNext(std::size_t limit) const -> std::vector<database::TrackId>; + auto peekNext(std::size_t limit) const -> std::vector<database::TrackId>; /* * Returns the tracks in the queue that have already been played, ordered * most recently played first. */ - auto PeekPrevious(std::size_t limit) const -> std::vector<database::TrackId>; + auto peekPrevious(std::size_t limit) const -> std::vector<database::TrackId>; - auto GetCurrentPosition() const -> size_t; - auto GetTotalSize() const -> size_t; + auto currentPosition() const -> size_t; + auto totalSize() const -> size_t; using Item = std::variant<database::TrackId, database::TrackIterator>; - auto Insert(Editor&, Item, size_t) -> void; - auto Append(Editor&, Item i) -> void; + auto insert(Item) -> void; + auto append(Item i) -> void; /* * Advances to the next track in the queue, placing the current track at the * front of the 'played' queue. */ - auto Next(Editor&) -> std::optional<database::TrackId>; - auto Previous(Editor&) -> std::optional<database::TrackId>; + auto next() -> void; + auto previous() -> void; - auto SkipTo(Editor&, database::TrackId) -> void; + auto skipTo(database::TrackId) -> void; /* * Removes all tracks from all queues, and stops any currently playing track. */ - auto Clear(Editor&) -> void; - - auto Save(std::weak_ptr<database::Database>) -> void; - auto Load(std::weak_ptr<database::Database>) -> void; + auto clear() -> void; // Cannot be copied or moved. TrackQueue(const TrackQueue&) = delete; TrackQueue& operator=(const TrackQueue&) = delete; private: - // FIXME: Make this a shared_mutex so that multithread reads don't block. - mutable std::recursive_mutex mutex_; + mutable std::shared_mutex mutex_; - std::optional<database::TrackId> current_; + tasks::Worker& bg_worker_; - // Note: stored in reverse order, i.e. most recent played it at the *back* of - // this vector. - std::pmr::vector<database::TrackId> played_; - std::pmr::vector<Item> enqueued_; + size_t pos_; + std::pmr::vector<database::TrackId> tracks_; }; } // namespace audio |
