diff options
Diffstat (limited to 'src/audio/include/stream_event.hpp')
| -rw-r--r-- | src/audio/include/stream_event.hpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/audio/include/stream_event.hpp b/src/audio/include/stream_event.hpp new file mode 100644 index 00000000..4dfdab41 --- /dev/null +++ b/src/audio/include/stream_event.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include <memory> + +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" + +#include "span.hpp" +#include "stream_info.hpp" + +namespace audio { + +struct StreamEvent { + static auto CreateStreamInfo(QueueHandle_t source, + std::unique_ptr<StreamInfo> payload) + -> std::unique_ptr<StreamEvent>; + static auto CreateChunkData(QueueHandle_t source, std::size_t chunk_size) + -> std::unique_ptr<StreamEvent>; + static auto CreateChunkNotification(QueueHandle_t source) + -> std::unique_ptr<StreamEvent>; + + StreamEvent(); + ~StreamEvent(); + StreamEvent(StreamEvent&&); + + QueueHandle_t source; + + enum { + UNINITIALISED, + STREAM_INFO, + CHUNK_DATA, + CHUNK_NOTIFICATION, + } tag; + + union { + std::unique_ptr<StreamInfo> stream_info; + + // Scott Meyers says: + // `About the only situation I can conceive of when a std::unique_ptr<T[]> + // would make sense would be when you’re using a C-like API that returns a + // raw pointer to a heap array that you assume ownership of.` + // :-) + + struct { + std::unique_ptr<std::byte*> raw_bytes; + cpp::span<std::byte> bytes; + } chunk_data; + + // FIXME: It would be nice to also support a pointer to himem data here, to + // save a little ordinary heap space. + }; + + StreamEvent(const StreamEvent&) = delete; + StreamEvent& operator=(const StreamEvent&) = delete; +}; + +} // namespace audio |
