summaryrefslogtreecommitdiff
path: root/src/audio/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/include')
-rw-r--r--src/audio/include/audio_events.hpp2
-rw-r--r--src/audio/include/audio_fsm.hpp2
-rw-r--r--src/audio/include/fatfs_audio_input.hpp9
-rw-r--r--src/audio/include/track_queue.hpp60
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