77 bool open(
const std::string& filepath,
80 AVCodecID explicit_codec);
94 std::future<bool> close();
99 [[nodiscard]]
bool is_open()
const {
return m_open.load(std::memory_order_acquire); }
112 void write(std::span<const double> interleaved, uint32_t num_frames = 0);
122 void write(
const std::vector<Kakshya::DataVariant>& planar);
127 void write(
const std::shared_ptr<Buffers::AudioBuffer>& buffer);
134 void write(
const std::shared_ptr<Kakshya::SoundStreamContainer>& container);
140 [[nodiscard]] std::string last_error()
const;
159 using WorkItem = std::variant<FrameChunk, PlanarChunk, CloseCmd>;
165 static constexpr size_t k_queue_capacity = 4096;
166 std::unique_ptr<Memory::LockFreeQueue<WorkItem, k_queue_capacity>>
m_queue;
173 std::atomic<bool> m_open {
false };
174 std::atomic<bool> m_closing {
false };
181 uint32_t m_channels {};
183 void worker_loop(
const std::string& filepath, uint32_t channels, uint32_t sample_rate,
186 void set_error(std::string msg);
187 bool post(
const WorkItem& item);