diff options
Diffstat (limited to 'src/audio/include/audio_events.hpp')
| -rw-r--r-- | src/audio/include/audio_events.hpp | 106 |
1 files changed, 87 insertions, 19 deletions
diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp index 03584062..b8a0dba6 100644 --- a/src/audio/include/audio_events.hpp +++ b/src/audio/include/audio_events.hpp @@ -9,40 +9,104 @@ #include <stdint.h> #include <cstdint> #include <memory> +#include <optional> #include <string> +#include "audio_sink.hpp" #include "tinyfsm.hpp" #include "track.hpp" -#include "track_queue.hpp" #include "types.hpp" namespace audio { -struct Track { +/* + * Struct encapsulating information about the decoder's current track. + */ +struct TrackInfo { + /* + * Audio tags extracted from the file. May be absent for files without any + * parseable tags. + */ std::shared_ptr<database::TrackTags> tags; - std::shared_ptr<database::TrackData> db_info; - uint32_t duration; - uint32_t bitrate_kbps; + /* + * URI that the current track was retrieved from. This is currently always a + * file path on the SD card. + */ + std::string uri; + + /* + * The length of this track in seconds. This is either retrieved from the + * track's tags, or sometimes computed. It may therefore sometimes be + * inaccurate or missing. + */ + std::optional<uint32_t> duration; + + /* The offset in seconds that this file's decoding started from. */ + std::optional<uint32_t> start_offset; + + /* The approximate bitrate of this track in its original encoded form. */ + std::optional<uint32_t> bitrate_kbps; + + /* The encoded format of the this track. */ codecs::StreamType encoding; -}; -struct PlaybackStarted : tinyfsm::Event {}; + IAudioOutput::Format format; +}; +/* + * Event emitted by the audio FSM when the state of the audio pipeline has + * changed. This is usually once per second while a track is playing, plus one + * event each when a track starts or finishes. + */ struct PlaybackUpdate : tinyfsm::Event { - uint32_t seconds_elapsed; - std::shared_ptr<Track> track; + /* + * The track that is currently being decoded by the audio pipeline. May be + * absent if there is no current track. + */ + std::shared_ptr<TrackInfo> current_track; + + /* + * How long the current track has been playing for, in seconds. Will always + * be present if current_track is present. + */ + std::optional<uint32_t> track_position; + + /* Whether or not the current track is currently being output to a sink. */ + bool paused; }; -struct PlaybackStopped : tinyfsm::Event {}; +/* + * Sets a new track to be decoded by the audio pipeline, replacing any + * currently playing track. + */ +struct SetTrack : tinyfsm::Event { + std::variant<std::string, database::TrackId, std::monostate> new_track; + std::optional<uint32_t> seek_to_second; + + enum Transition { + kHardCut, + kGapless, + // TODO: kCrossFade + }; + Transition transition; +}; + +struct TogglePlayPause : tinyfsm::Event { + std::optional<bool> set_to; +}; struct QueueUpdate : tinyfsm::Event { bool current_changed; -}; -struct PlayFile : tinyfsm::Event { - std::string filename; + enum Reason { + kExplicitUpdate, + kRepeatingLastTrack, + kTrackFinished, + kDeserialised, + }; + Reason reason; }; struct StepUpVolume : tinyfsm::Event {}; @@ -70,17 +134,21 @@ struct SetVolumeLimit : tinyfsm::Event { int limit_db; }; -struct TogglePlayPause : tinyfsm::Event {}; - struct OutputModeChanged : tinyfsm::Event {}; namespace internal { -struct InputFileOpened : tinyfsm::Event {}; -struct InputFileClosed : tinyfsm::Event {}; -struct InputFileFinished : tinyfsm::Event {}; +struct StreamStarted : tinyfsm::Event { + std::shared_ptr<TrackInfo> track; + IAudioOutput::Format src_format; + IAudioOutput::Format dst_format; +}; + +struct StreamUpdate : tinyfsm::Event { + uint32_t samples_sunk; +}; -struct AudioPipelineIdle : tinyfsm::Event {}; +struct StreamEnded : tinyfsm::Event {}; } // namespace internal |
