Fork of Tangara with customizations
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
tangara-fw/src/audio/include/stream_event.hpp

57 lines
1.4 KiB

#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