From c36208016eefcdfdeff045f675f74fdb69dddb52 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 2 Dec 2022 17:25:53 +1100 Subject: better cbor handling --- src/audio/include/audio_decoder.hpp | 7 +++-- src/audio/include/audio_element.hpp | 15 ++++++---- src/audio/include/fatfs_audio_input.hpp | 7 +++-- src/audio/include/stream_info.hpp | 15 ++-------- src/audio/include/stream_message.hpp | 49 +++++++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 25 deletions(-) (limited to 'src/audio/include') 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; + auto ProcessStreamInfo(StreamInfo& info) + -> cpp::result; auto ProcessChunk(uint8_t* data, std::size_t length) - -> cpp::result; - auto ProcessIdle() -> cpp::result; + -> cpp::result; + auto ProcessIdle() -> cpp::result; 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 = 0; + virtual auto ProcessStreamInfo(StreamInfo& info) + -> cpp::result = 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 = 0; + -> cpp::result = 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 = 0; + virtual auto ProcessIdle() -> cpp::result = 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 storage); ~FatfsAudioInput(); - auto ProcessStreamInfo(StreamInfo&& info) -> cpp::result; + auto ProcessStreamInfo(StreamInfo& info) + -> cpp::result; auto ProcessChunk(uint8_t* data, std::size_t length) - -> cpp::result; - auto ProcessIdle() -> cpp::result; + -> cpp::result; + auto ProcessIdle() -> cpp::result; 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(cbor::MapDecoder*); + static auto Parse(CborValue& container) -> cpp::result; StreamInfo() = default; StreamInfo(const StreamInfo&) = default; @@ -38,7 +27,7 @@ class StreamInfo { return sample_rate_; } - auto WriteToMap(cbor::Encoder& encoder) -> cpp::result; + auto Encode(CborEncoder& enc) -> std::optional; private: std::optional 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 + +#include +#include + +#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 +auto WriteMessage(MessageType type, + Writer&& writer, + uint8_t* buffer, + size_t length) -> cpp::result { + 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 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 +auto ReadMessage(Reader&& reader, uint8_t* buffer, size_t length) + -> cpp::result { + 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 -- cgit v1.2.3