#pragma once #include "./frame_stream2.hpp" #include #include #include #include // raw audio // channels make samples interleaved, // planar channels are not supported // s16 only stopgap audio frame (simplified) struct AudioFrame2 { // samples per second uint32_t sample_rate {48'000}; // only >0 is valid size_t channels {0}; std::variant< std::vector, // S16, platform endianess Span // non owning variant, for direct consumption > buffer; AudioFrame2(void) = default; AudioFrame2(const AudioFrame2&) = default; AudioFrame2(AudioFrame2&& other) : sample_rate(other.sample_rate), channels(other.channels), buffer(std::move(other.buffer)) {} AudioFrame2(uint32_t sample_rate_, size_t channels_, const std::variant, Span>& buffer_) : sample_rate(sample_rate_), channels(channels_), buffer(buffer_) {} AudioFrame2(uint32_t sample_rate_, size_t channels_, std::variant, Span>&& buffer_) : sample_rate(sample_rate_), channels(channels_), buffer(std::move(buffer_)) {} // helpers Span getSpan(void) const { if (std::holds_alternative>(buffer)) { return Span{std::get>(buffer)}; } else { return std::get>(buffer); } return {}; } }; template<> constexpr bool frameHasBytes(void) { return true; } template<> inline uint64_t frameGetBytes(const AudioFrame2& frame) { return frame.getSpan().size * sizeof(int16_t); } using AudioFrame2Stream2I = FrameStream2I;