diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/include/audio_output.hpp | 29 | ||||
| -rw-r--r-- | src/drivers/include/audio_playback.hpp | 97 | ||||
| -rw-r--r-- | src/drivers/include/fatfs_audio_input.hpp | 40 |
3 files changed, 40 insertions, 126 deletions
diff --git a/src/drivers/include/audio_output.hpp b/src/drivers/include/audio_output.hpp deleted file mode 100644 index 82dca82d..00000000 --- a/src/drivers/include/audio_output.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include <cstdint> -#include <memory> - -#include "audio_common.h" -#include "audio_element.h" - -namespace drivers { - -class IAudioOutput { - public: - IAudioOutput(audio_element_handle_t element) : element_(element) {} - virtual ~IAudioOutput() { audio_element_deinit(element_); } - - auto GetAudioElement() -> audio_element_handle_t { return element_; } - - virtual auto SetVolume(uint8_t volume) -> void = 0; - virtual auto GetVolume() const -> uint8_t { return volume_; } - - virtual auto Configure(audio_element_info_t& info) -> void = 0; - virtual auto SetSoftMute(bool enabled) -> void = 0; - - protected: - audio_element_handle_t element_; - uint8_t volume_; -}; - -} // namespace drivers diff --git a/src/drivers/include/audio_playback.hpp b/src/drivers/include/audio_playback.hpp deleted file mode 100644 index 41ab46d2..00000000 --- a/src/drivers/include/audio_playback.hpp +++ /dev/null @@ -1,97 +0,0 @@ -#pragma once - -#include <cstdint> -#include <memory> -#include <string> - -#include "audio_common.h" -#include "audio_element.h" -#include "audio_event_iface.h" -#include "audio_pipeline.h" -#include "esp_err.h" -#include "fatfs_stream.h" -#include "i2s_stream.h" -#include "mp3_decoder.h" -#include "result.hpp" - -#include "audio_output.hpp" -#include "dac.hpp" -#include "storage.hpp" - -namespace drivers { - -/* - * Sends an I2S audio stream to the DAC. Includes basic controls for pausing - * and resuming the stream, as well as support for gapless playback of the next - * queued song, but does not implement any kind of sophisticated queing or - * playback control; these should be handled at a higher level. - */ -class AudioPlayback { - public: - enum Error { FATFS_INIT, I2S_INIT, PIPELINE_INIT }; - static auto create(std::unique_ptr<IAudioOutput> output) - -> cpp::result<std::unique_ptr<AudioPlayback>, Error>; - - AudioPlayback(std::unique_ptr<IAudioOutput>& output, - audio_pipeline_handle_t pipeline, - audio_element_handle_t source_element, - audio_event_iface_handle_t event_interface); - ~AudioPlayback(); - - /* - * Replaces any currently playing file with the one given, and begins - * playback. - * - * Any value set in `set_next_file` is cleared by this method. - */ - auto Play(const std::string& filename) -> void; - /* Toogle between resumed and paused. */ - auto Toggle() -> void; - auto Resume() -> void; - auto Pause() -> void; - - enum PlaybackState { PLAYING, PAUSED, STOPPED }; - auto GetPlaybackState() const -> PlaybackState; - - /* - * Handles any pending events from the underlying audio pipeline. This must - * be called regularly in order to handle configuring the I2S stream for - * different audio types (e.g. sample rate, bit depth), and for gapless - * playback. - */ - auto ProcessEvents(uint16_t max_time_ms) -> void; - - /* - * Sets the file that should be played immediately after the current file - * finishes. This is used for gapless playback - */ - auto SetNextFile(const std::string& filename) -> void; - - auto SetVolume(uint8_t volume) -> void; - auto GetVolume() const -> uint8_t; - - // Not copyable or movable. - AudioPlayback(const AudioPlayback&) = delete; - AudioPlayback& operator=(const AudioPlayback&) = delete; - - private: - PlaybackState playback_state_; - - enum Decoder { NONE, MP3, AMR, OPUS, OGG, FLAC, WAV, AAC }; - auto GetDecoderForFilename(std::string filename) const -> Decoder; - auto CreateDecoder(Decoder decoder) const -> audio_element_handle_t; - auto ReconfigurePipeline(Decoder decoder) -> void; - - std::unique_ptr<IAudioOutput> output_; - - std::string next_filename_ = ""; - - audio_pipeline_handle_t pipeline_; - audio_element_handle_t source_element_; - audio_event_iface_handle_t event_interface_; - - audio_element_handle_t decoder_ = nullptr; - Decoder decoder_type_ = NONE; -}; - -} // namespace drivers diff --git a/src/drivers/include/fatfs_audio_input.hpp b/src/drivers/include/fatfs_audio_input.hpp new file mode 100644 index 00000000..3753c136 --- /dev/null +++ b/src/drivers/include/fatfs_audio_input.hpp @@ -0,0 +1,40 @@ +#pragma once + +namespace drivers { + + class FatfsAudioInput { + public: + FatfsAudioInput(std::shared_ptr<SdStorage> storage); + ~FatfsAudioInput(); + + enum Status { + /* + * Successfully read data into the output buffer, and there is still + * data remaining in the file. + */ + OKAY, + + /* + * The ringbuffer was full. No data was read. + */ + RINGBUF_FULL, + + /* + * Some data may have been read into the output buffer, but the file is + * now empty. + */ + FILE_EMPTY, + }; + auto Process() -> Status; + + auto GetOutputBuffer() -> RingbufHandle_t; + + private: + std::shared_ptr<SdStorage> storage_; + RingbufHandle_t output_; + + std::string path_; + + }; + +} // namespace drivers |
