summaryrefslogtreecommitdiff
path: root/src/drivers/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/include')
-rw-r--r--src/drivers/include/audio_output.hpp29
-rw-r--r--src/drivers/include/audio_playback.hpp97
-rw-r--r--src/drivers/include/fatfs_audio_input.hpp40
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