diff options
Diffstat (limited to 'src/audio/include')
| -rw-r--r-- | src/audio/include/audio_decoder.hpp | 7 | ||||
| -rw-r--r-- | src/audio/include/audio_events.hpp | 13 | ||||
| -rw-r--r-- | src/audio/include/audio_source.hpp | 27 | ||||
| -rw-r--r-- | src/audio/include/fatfs_audio_input.hpp | 4 | ||||
| -rw-r--r-- | src/audio/include/track_queue.hpp | 3 |
5 files changed, 48 insertions, 6 deletions
diff --git a/src/audio/include/audio_decoder.hpp b/src/audio/include/audio_decoder.hpp index 1759f6e4..318e6fd4 100644 --- a/src/audio/include/audio_decoder.hpp +++ b/src/audio/include/audio_decoder.hpp @@ -10,6 +10,7 @@ #include <memory> #include "audio_converter.hpp" +#include "audio_events.hpp" #include "audio_sink.hpp" #include "audio_source.hpp" #include "codec.hpp" @@ -23,11 +24,13 @@ namespace audio { */ class Timer { public: - Timer(const codecs::ICodec::OutputFormat& format); + Timer(std::shared_ptr<Track>, const codecs::ICodec::OutputFormat& format); auto AddSamples(std::size_t) -> void; private: + std::shared_ptr<Track> track_; + uint32_t current_seconds_; uint32_t current_sample_in_second_; uint32_t samples_per_second_; @@ -54,7 +57,7 @@ class Decoder { Decoder(std::shared_ptr<IAudioSource> source, std::shared_ptr<SampleConverter> converter); - auto BeginDecoding(std::shared_ptr<codecs::IStream>) -> bool; + auto BeginDecoding(std::shared_ptr<TaggedStream>) -> bool; auto ContinueDecoding() -> bool; std::shared_ptr<IAudioSource> source_; diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp index b130938c..9994a9f6 100644 --- a/src/audio/include/audio_events.hpp +++ b/src/audio/include/audio_events.hpp @@ -8,20 +8,31 @@ #include <stdint.h> #include <cstdint> +#include <memory> #include <string> #include "tinyfsm.hpp" #include "track.hpp" #include "track_queue.hpp" +#include "types.hpp" namespace audio { +struct Track { + std::shared_ptr<database::TrackTags> tags; + std::shared_ptr<database::TrackData> db_info; + + uint32_t duration; + uint32_t bitrate_kbps; + codecs::StreamType encoding; +}; + struct PlaybackStarted : tinyfsm::Event {}; struct PlaybackUpdate : tinyfsm::Event { uint32_t seconds_elapsed; - uint32_t seconds_total; + std::shared_ptr<Track> track; }; struct PlaybackFinished : tinyfsm::Event {}; diff --git a/src/audio/include/audio_source.hpp b/src/audio/include/audio_source.hpp index a0d690a6..a54cb260 100644 --- a/src/audio/include/audio_source.hpp +++ b/src/audio/include/audio_source.hpp @@ -6,16 +6,41 @@ #pragma once +#include <memory> #include "codec.hpp" +#include "track.hpp" +#include "types.hpp" namespace audio { +class TaggedStream : public codecs::IStream { + public: + TaggedStream(std::shared_ptr<database::TrackTags>, + std::unique_ptr<codecs::IStream> wrapped); + + auto tags() -> std::shared_ptr<database::TrackTags>; + + auto Read(cpp::span<std::byte> dest) -> ssize_t override; + + auto CanSeek() -> bool override; + + auto SeekTo(int64_t destination, SeekFrom from) -> void override; + + auto CurrentPosition() -> int64_t override; + + auto SetPreambleFinished() -> void override; + + private: + std::shared_ptr<database::TrackTags> tags_; + std::unique_ptr<codecs::IStream> wrapped_; +}; + class IAudioSource { public: virtual ~IAudioSource() {} virtual auto HasNewStream() -> bool = 0; - virtual auto NextStream() -> std::shared_ptr<codecs::IStream> = 0; + virtual auto NextStream() -> std::shared_ptr<TaggedStream> = 0; }; } // namespace audio diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/audio/include/fatfs_audio_input.hpp index 9b516478..c7d52ca3 100644 --- a/src/audio/include/fatfs_audio_input.hpp +++ b/src/audio/include/fatfs_audio_input.hpp @@ -43,7 +43,7 @@ class FatfsAudioInput : public IAudioSource { auto SetPath() -> void; auto HasNewStream() -> bool override; - auto NextStream() -> std::shared_ptr<codecs::IStream> override; + auto NextStream() -> std::shared_ptr<TaggedStream> override; FatfsAudioInput(const FatfsAudioInput&) = delete; FatfsAudioInput& operator=(const FatfsAudioInput&) = delete; @@ -58,7 +58,7 @@ class FatfsAudioInput : public IAudioSource { tasks::Worker& bg_worker_; std::mutex new_stream_mutex_; - std::shared_ptr<codecs::IStream> new_stream_; + std::shared_ptr<TaggedStream> new_stream_; std::atomic<bool> has_new_stream_; diff --git a/src/audio/include/track_queue.hpp b/src/audio/include/track_queue.hpp index 49c0d61b..0be2384a 100644 --- a/src/audio/include/track_queue.hpp +++ b/src/audio/include/track_queue.hpp @@ -72,6 +72,9 @@ class TrackQueue { */ auto Clear() -> void; + auto Position() -> size_t; + auto Size() -> size_t; + TrackQueue(const TrackQueue&) = delete; TrackQueue& operator=(const TrackQueue&) = delete; |
