summaryrefslogtreecommitdiff
path: root/src/audio/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/include')
-rw-r--r--src/audio/include/audio_decoder.hpp7
-rw-r--r--src/audio/include/audio_element.hpp15
-rw-r--r--src/audio/include/fatfs_audio_input.hpp7
-rw-r--r--src/audio/include/stream_info.hpp15
-rw-r--r--src/audio/include/stream_message.hpp49
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