diff options
Diffstat (limited to 'src/audio/include/chunk.hpp')
| -rw-r--r-- | src/audio/include/chunk.hpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/audio/include/chunk.hpp b/src/audio/include/chunk.hpp new file mode 100644 index 00000000..1351ecfb --- /dev/null +++ b/src/audio/include/chunk.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include <cstddef> +#include <cstdint> +#include <optional> +#include <string> +#include "esp-idf/components/cbor/tinycbor/src/cbor.h" +#include "freertos/portmacro.h" +#include "result.hpp" + +namespace audio { + +enum ChunkWriteResult { + // Returned when the callback does not write any data. + CHUNK_OUT_OF_DATA, + // Returned when there is an error encoding a chunk header using cbor. + CHUNK_ENCODING_ERROR, + // Returned when max_wait expires without room in the stream buffer becoming + // available. + CHUNK_WRITE_TIMEOUT, +}; + +/* + * Invokes the given callback to receive data, breaks the received data up into + * chunks with headers, and writes those chunks to the given output stream. + * + * The callback will be invoked with a byte buffer and its size. The callback + * should write as much data as it can to this buffer, and then return the + * number of bytes it wrote. Return a value of 0 to indicate that there is no + * more input to read. + */ +auto WriteChunksToStream(MessageBufferHandle_t *stream, uint8_t *working_buffer, size_t working_buffer_length, std::function<size_t(uint8_t*,size_t)> callback, TickType_t max_wait) -> EncodeWriteResult; + + enum ChunkReadResult { + // Returned an error in parsing the cbor-encoded header. + CHUNK_DECODING_ERROR, + // Returned when max_wait expired before any data was read. + CHUNK_READ_TIMEOUT, + // Returned when a non-chunk message is received. + CHUNK_STREAM_ENDED, + }; + +/* + * Reads chunks of data from the given input stream, and invokes the given + * callback to process each of them in turn. + * + * The callback will be invoked with a byte buffer and its size. The callback + * should process as much data as it can from this buffer, and then return the + * number of bytes it was able to read. Any leftover bytes will be added as a + * prefix to the next chunk. + * + * If this function encounters a message in the stream that is not a chunk, it + * will place the message at the start of the working_buffer and then return. + */ +auto ReadChunksFromStream(MessageBufferHandle_t *stream, uint8_t *working_buffer, size_t working_buffer_length, std::function<size_t(uint8_t*,size_t)> callback, TickType_t max_wait) -> EncodeReadResult; + +} // namespace audio |
