Files
AronaCore/core/audio/misc/audio_buffer.h
Nanako e65c44899a 1. 优化内存池
2. 延迟补偿功能完成
3. 优化内存布局
2024-07-12 07:55:12 +08:00

57 lines
1.5 KiB
C++

#pragma once
#include <cstdint>
#include <mutex>
#include <vector>
#include "extern.h"
#include <functional>
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<sample_t*>& { 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<sample_t> get_interleaved_buffer() const;
private:
void free();
private:
std::vector<sample_t*> headers_{};
std::mutex lock_{};
uint32_t frame_size_ = 0;
};