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_element.hpp | 15 | ||||
| -rw-r--r-- | src/audio/include/fatfs_audio_input.hpp | 7 | ||||
| -rw-r--r-- | src/audio/include/stream_info.hpp | 15 | ||||
| -rw-r--r-- | src/audio/include/stream_message.hpp | 49 |
5 files changed, 68 insertions, 25 deletions
diff --git a/src/audio/include/audio_decoder.hpp b/src/audio/include/audio_decoder.hpp index a4508c3e..4d2fd5f3 100644 --- a/src/audio/include/audio_decoder.hpp +++ b/src/audio/include/audio_decoder.hpp @@ -21,10 +21,11 @@ class AudioDecoder : public IAudioElement { auto SetInputBuffer(MessageBufferHandle_t*) -> void; auto SetOutputBuffer(MessageBufferHandle_t*) -> void; - auto ProcessStreamInfo(StreamInfo&& info) -> cpp::result<void, StreamError>; + auto ProcessStreamInfo(StreamInfo& info) + -> cpp::result<void, AudioProcessingError>; auto ProcessChunk(uint8_t* data, std::size_t length) - -> cpp::result<size_t, StreamError>; - auto ProcessIdle() -> cpp::result<void, StreamError>; + -> cpp::result<size_t, AudioProcessingError>; + auto ProcessIdle() -> cpp::result<void, AudioProcessingError>; AudioDecoder(const AudioDecoder&) = delete; AudioDecoder& operator=(const AudioDecoder&) = delete; diff --git a/src/audio/include/audio_element.hpp b/src/audio/include/audio_element.hpp index 13a48590..5b697784 100644 --- a/src/audio/include/audio_element.hpp +++ b/src/audio/include/audio_element.hpp @@ -15,8 +15,11 @@ namespace audio { -/* Errors that may be returned by any of the Process* methods. */ -enum StreamError { +/* + * Errors that may be returned by any of the Process* methods of an audio + * element. + */ +enum AudioProcessingError { // Indicates that this element is unable to handle the upcoming chunks. UNSUPPORTED_STREAM, // Indicates an error with reading or writing stream data. @@ -65,8 +68,8 @@ class IAudioElement { * Called when a StreamInfo message is received. Used to configure this * element in preperation for incoming chunks. */ - virtual auto ProcessStreamInfo(StreamInfo&& info) - -> cpp::result<void, StreamError> = 0; + virtual auto ProcessStreamInfo(StreamInfo& info) + -> cpp::result<void, AudioProcessingError> = 0; /* * Called when a ChunkHeader message is received. Includes the data associated @@ -75,14 +78,14 @@ class IAudioElement { * prepended to the next call. */ virtual auto ProcessChunk(uint8_t* data, std::size_t length) - -> cpp::result<size_t, StreamError> = 0; + -> cpp::result<size_t, AudioProcessingError> = 0; /* * Called when there has been no data received over the input buffer for some * time. This could be used to synthesize output, or to save memory by * releasing unused resources. */ - virtual auto ProcessIdle() -> cpp::result<void, StreamError> = 0; + virtual auto ProcessIdle() -> cpp::result<void, AudioProcessingError> = 0; protected: MessageBufferHandle_t* input_buffer_; diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/audio/include/fatfs_audio_input.hpp index 6fe178ab..c54b32bd 100644 --- a/src/audio/include/fatfs_audio_input.hpp +++ b/src/audio/include/fatfs_audio_input.hpp @@ -19,10 +19,11 @@ class FatfsAudioInput : public IAudioElement { FatfsAudioInput(std::shared_ptr<drivers::SdStorage> storage); ~FatfsAudioInput(); - auto ProcessStreamInfo(StreamInfo&& info) -> cpp::result<void, StreamError>; + auto ProcessStreamInfo(StreamInfo& info) + -> cpp::result<void, AudioProcessingError>; auto ProcessChunk(uint8_t* data, std::size_t length) - -> cpp::result<size_t, StreamError>; - auto ProcessIdle() -> cpp::result<void, StreamError>; + -> cpp::result<size_t, AudioProcessingError>; + auto ProcessIdle() -> cpp::result<void, AudioProcessingError>; auto SendChunk(uint8_t* buffer, size_t size) -> size_t; diff --git a/src/audio/include/stream_info.hpp b/src/audio/include/stream_info.hpp index ca28dd4e..47bcaa45 100644 --- a/src/audio/include/stream_info.hpp +++ b/src/audio/include/stream_info.hpp @@ -7,22 +7,11 @@ #include "cbor.h" #include "result.hpp" -#include "cbor_decoder.hpp" -#include "cbor_encoder.hpp" - namespace audio { class StreamInfo { public: - enum ParseError { - WRONG_TYPE, - MISSING_MAP, - CBOR_ERROR, - }; - - static auto Create(const uint8_t* buffer, size_t length) - -> cpp::result<StreamInfo, ParseError>; - StreamInfo(cbor::MapDecoder*); + static auto Parse(CborValue& container) -> cpp::result<StreamInfo, CborError>; StreamInfo() = default; StreamInfo(const StreamInfo&) = default; @@ -38,7 +27,7 @@ class StreamInfo { return sample_rate_; } - auto WriteToMap(cbor::Encoder& encoder) -> cpp::result<size_t, CborError>; + auto Encode(CborEncoder& enc) -> std::optional<CborError>; private: std::optional<std::string> path_; diff --git a/src/audio/include/stream_message.hpp b/src/audio/include/stream_message.hpp index 2791dcd8..cbd7c733 100644 --- a/src/audio/include/stream_message.hpp +++ b/src/audio/include/stream_message.hpp @@ -1,11 +1,60 @@ #pragma once +#include <stdint.h> + +#include <functional> +#include <optional> + +#include "cbor.h" +#include "result.hpp" + namespace audio { +extern const int kEncoderFlags; +extern const int kDecoderFlags; + enum MessageType { TYPE_UNKNOWN, TYPE_CHUNK_HEADER, TYPE_STREAM_INFO, }; +template <typename Writer> +auto WriteMessage(MessageType type, + Writer&& writer, + uint8_t* buffer, + size_t length) -> cpp::result<size_t, CborError> { + CborEncoder root; + CborEncoder container; + + cbor_encoder_init(&root, buffer, length, kEncoderFlags); + cbor_encoder_create_array(&root, &container, 2); + cbor_encode_uint(&container, type); + + std::optional<CborError> inner_err = std::invoke(writer, container); + if (inner_err) { + return cpp::fail(inner_err.value()); + } + + cbor_encoder_close_container(&root, &container); + return cbor_encoder_get_buffer_size(&root, buffer); +} + +template <typename Result, typename Reader> +auto ReadMessage(Reader&& reader, uint8_t* buffer, size_t length) + -> cpp::result<Result, CborError> { + CborParser parser; + CborValue root; + CborValue container; + + cbor_parser_init(buffer, length, kDecoderFlags, &parser, &root); + cbor_value_enter_container(&root, &container); + // Skip the type header + cbor_value_advance_fixed(&container); + + return std::invoke(reader, container); +} + +auto ReadMessageType(uint8_t* buffer, size_t length) -> MessageType; + } // namespace audio |
