#pragma once #include #include #include #include "extern.h" #include class CORE_API audio_buffer { public: static void (*add_func)(audio_buffer& in_buffer, audio_buffer& from_buffer, float percent); static void (*multiple_func)(audio_buffer& in_buffer, float percent); audio_buffer(); audio_buffer(audio_buffer&& in_buffer) noexcept { headers_ = std::move(in_buffer.headers_); frame_size_ = in_buffer.frame_size_; in_buffer.frame_size_ = 0; } audio_buffer& operator=(audio_buffer&& in_buffer) noexcept { if (this != &in_buffer) { headers_ = std::move(in_buffer.headers_); frame_size_ = in_buffer.frame_size_; in_buffer.frame_size_ = 0; } return *this; } ~audio_buffer(); [[nodiscard]] auto get_headers() -> sample_t** { return headers_.data(); } [[nodiscard]] auto get_headers_vector() const -> const std::vector& { return headers_; } [[nodiscard]] auto get_num_channels() const -> uint32_t { return headers_.size(); } [[nodiscard]] auto get_num_samples() const -> uint32_t { return frame_size_; } void resize(uint32_t channel_num, uint32_t frame_size); void clear(); void add(audio_buffer& from_buffer, float percent = 1.f); void multiple(float percent); [[nodiscard]] std::vector get_interleaved_buffer() const; private: void free(); private: std::vector headers_{}; std::mutex lock_{}; uint32_t frame_size_ = 0; };