summaryrefslogtreecommitdiff
path: root/src/audio/include/chunk.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/include/chunk.hpp')
-rw-r--r--src/audio/include/chunk.hpp70
1 files changed, 7 insertions, 63 deletions
diff --git a/src/audio/include/chunk.hpp b/src/audio/include/chunk.hpp
index 5c7e73dd..6154ab25 100644
--- a/src/audio/include/chunk.hpp
+++ b/src/audio/include/chunk.hpp
@@ -2,6 +2,7 @@
#include <cstddef>
#include <cstdint>
+#include <memory>
#include <optional>
#include <string>
@@ -17,68 +18,12 @@
namespace audio {
-enum ChunkWriteResult {
- // Returned when the callback does not write any data.
- CHUNK_WRITE_OKAY,
- // 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,
-};
-
-class ChunkWriter {
- public:
- explicit ChunkWriter(StreamBuffer* buffer);
- ~ChunkWriter();
-
- auto Reset() -> void;
-
- auto GetLastMessage() -> cpp::span<std::byte>;
-
- /*
- * 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 WriteChunkToStream(std::function<size_t(cpp::span<std::byte>)> callback,
- TickType_t max_wait) -> ChunkWriteResult;
-
- private:
- StreamBuffer* stream_;
- std::size_t leftover_bytes_ = 0;
-};
-
-enum ChunkReadResult {
- CHUNK_READ_OKAY,
- // Returned when the chunk was read successfully, but the consumer did not
- // use all of the data.
- CHUNK_LEFTOVER_DATA,
- // 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,
- // Returned when the processing callback does not return a value.
- CHUNK_PROCESSING_ERROR,
-};
-
class ChunkReader {
public:
- explicit ChunkReader(StreamBuffer* buffer);
+ explicit ChunkReader(std::size_t chunk_size);
~ChunkReader();
- auto Reset() -> void;
-
- auto GetLastMessage() -> cpp::span<std::byte>;
+ auto HandleLeftovers(std::size_t bytes_used) -> void;
/*
* Reads chunks of data from the given input stream, and invokes the given
@@ -92,14 +37,13 @@ class ChunkReader {
* 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 ReadChunkFromStream(
- std::function<std::optional<std::size_t>(cpp::span<std::byte>)> callback,
- TickType_t max_wait) -> ChunkReadResult;
+ auto HandleNewData(cpp::span<std::byte> data) -> cpp::span<std::byte>;
private:
- StreamBuffer* stream_;
+ std::byte* raw_working_buffer_;
+ cpp::span<std::byte> working_buffer_;
+ cpp::span<std::byte> last_data_in_working_buffer_;
std::size_t leftover_bytes_ = 0;
- std::size_t last_message_size_ = 0;
};
} // namespace audio