#pragma once #include namespace audio { extern const std::size_t kMaxFrameSize; class IAudioElement { public: virtual ~IAudioElement(); enum CommandType { /* * Sets the sequence number of the most recent byte stream. Any commands * received that have a lower sequence number than this will be discarded. */ SEQUENCE_NUMBER, /* * Instructs this element to read a specific number of bytes from its * input buffer. */ READ_FRAME, /* * Represents an element-specific command. This handling of this is * delegated to element implementations. */ ELEMENT, /* Instructs this element to shut down. */ QUIT, }; struct Command { CommandType type; uint8_t sequence_number; // TODO: tag data's type union { void* data; std::size_t frame_size; }; }; /* * Returns a queue that should be used for all communication with this * element. */ virtual auto InputCommandQueue() -> QueueHandle_t = 0; /* * Returns a buffer that will be used to stream input bytes to this element. * This may be NULL, if this element represents a source, e.g. a FATFS * reader. */ virtual auto InputBuffer() -> StreamBufferHandle_t = 0; enum ProcessResult { OK, OUTPUT_FULL, ERROR, }; /* * Called when an element-specific command has been received. */ virtual auto ProcessElementCommand(void* command) -> ProcessResult = 0; virtual auto SkipElementCommand(void* command) -> void = 0; /* * Called with the result of a read bytes command. */ virtual auto ProcessData(uint8_t* data, uint16_t length) -> ProcessResult = 0; /* * Called periodically when there are no pending commands. */ virtual auto ProcessIdle() -> ProcessResult = 0; }; } // namespace audio