41 lines
1.3 KiB
C++
41 lines
1.3 KiB
C++
//
|
|
// Created by WolverinDEV on 27/03/2021.
|
|
//
|
|
|
|
#include <cassert>
|
|
#include "AudioInterleaved.h"
|
|
|
|
using namespace tc;
|
|
|
|
constexpr static auto kMaxChannelCount{32};
|
|
void audio::deinterleave(float *target, const float *source, size_t channel_count, size_t sample_count) {
|
|
assert(channel_count <= kMaxChannelCount);
|
|
assert(source != target);
|
|
|
|
float* target_ptr[kMaxChannelCount];
|
|
for(size_t channel{0}; channel < channel_count; channel++) {
|
|
target_ptr[channel] = target + (channel * sample_count);
|
|
}
|
|
|
|
for(size_t sample{0}; sample < sample_count; sample++) {
|
|
for(size_t channel{0}; channel < channel_count; channel++) {
|
|
*target_ptr[channel]++ = *source++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void audio::interleave(float *target, const float *source, size_t channel_count, size_t sample_count) {
|
|
assert(channel_count <= kMaxChannelCount);
|
|
assert(source != target);
|
|
|
|
const float* source_ptr[kMaxChannelCount];
|
|
for(size_t channel{0}; channel < channel_count; channel++) {
|
|
source_ptr[channel] = source + (channel * sample_count);
|
|
}
|
|
|
|
for(size_t sample{0}; sample < sample_count; sample++) {
|
|
for(size_t channel{0}; channel < channel_count; channel++) {
|
|
*target++ = *source_ptr[channel]++;
|
|
}
|
|
}
|
|
} |