55 lines
1.7 KiB
C++
55 lines
1.7 KiB
C++
#include "audio_buffer.h"
|
|
|
|
#include <cstring>
|
|
|
|
void audio_buffer::resize(uint32_t channel_num, uint32_t block_size) {
|
|
std::scoped_lock lock(lock_);
|
|
buffer_.resize(channel_num);
|
|
headers_.resize(channel_num);
|
|
for (uint32_t i = 0; i < channel_num; i++) {
|
|
buffer_[i].resize(block_size);
|
|
headers_[i] = buffer_[i].data();
|
|
}
|
|
}
|
|
|
|
void audio_buffer::clear() {
|
|
std::scoped_lock lock(lock_);
|
|
for (auto& channel : buffer_) {
|
|
std::memset(channel.data(), 0, channel.size() * sizeof(sample_t));
|
|
}
|
|
}
|
|
|
|
void audio_buffer::mix(audio_buffer& in_buffer, float percent) {
|
|
std::scoped_lock lock(lock_);
|
|
// will be optimized by compiler
|
|
for (uint32_t channel_index = 0; channel_index < buffer_.size(); channel_index++) {
|
|
auto& channel = buffer_[channel_index];
|
|
auto& in_channel = in_buffer.buffer_[channel_index];
|
|
for (uint32_t sample_index = 0; sample_index < channel.size(); sample_index++) {
|
|
channel[sample_index] += in_channel[sample_index] * percent;
|
|
}
|
|
}
|
|
}
|
|
|
|
void audio_buffer::multiple(float percent) {
|
|
std::scoped_lock lock(lock_);
|
|
// will be optimized by compiler
|
|
for (auto& channel : buffer_) {
|
|
for (auto& sample : channel) {
|
|
sample *= percent;
|
|
}
|
|
}
|
|
}
|
|
|
|
std::vector<sample_t> audio_buffer::get_interleaved_buffer() {
|
|
std::scoped_lock lock(lock_);
|
|
std::vector<sample_t> result;
|
|
result.reserve(buffer_[0].size() * buffer_.size());
|
|
for (uint32_t sample_index = 0; sample_index < buffer_[0].size(); sample_index++) {
|
|
for (uint32_t channel_index = 0; channel_index < buffer_.size(); channel_index++) {
|
|
result.push_back(buffer_[channel_index][sample_index]);
|
|
}
|
|
}
|
|
return result;
|
|
}
|