Implement YaProcessData reading

This commit is contained in:
Robbert van der Helm
2020-12-15 23:11:59 +01:00
parent d6b7ef38e2
commit d1c5d4c4ac
2 changed files with 48 additions and 22 deletions
+39 -11
View File
@@ -20,10 +20,9 @@
YaAudioBusBuffers::YaAudioBusBuffers() {}
YaAudioBusBuffers::YaAudioBusBuffers(
Steinberg::Vst::SymbolicSampleSizes sample_size,
size_t num_channels,
size_t num_samples)
YaAudioBusBuffers::YaAudioBusBuffers(int32 sample_size,
size_t num_channels,
size_t num_samples)
: buffers(sample_size == Steinberg::Vst::SymbolicSampleSizes::kSample64
? decltype(buffers)(std::vector<std::vector<double>>(
num_channels,
@@ -33,7 +32,7 @@ YaAudioBusBuffers::YaAudioBusBuffers(
std::vector<float>(num_samples, 0.0)))) {}
YaAudioBusBuffers::YaAudioBusBuffers(
Steinberg::Vst::SymbolicSampleSizes sample_size,
int32 sample_size,
int32 num_samples,
const Steinberg::Vst::AudioBusBuffers& data)
: silence_flags(data.silenceFlags) {
@@ -67,27 +66,56 @@ Steinberg::Vst::AudioBusBuffers& YaAudioBusBuffers::get() {
reconstructed_buffers.silenceFlags = silence_flags;
std::visit(overload{
[&](std::vector<std::vector<double>>& buffers) {
double_buffer_pointers.clear();
buffer_pointers.clear();
for (auto& buffer : buffers) {
double_buffer_pointers.push_back(buffer.data());
buffer_pointers.push_back(buffer.data());
}
reconstructed_buffers.numChannels = buffers.size();
reconstructed_buffers.channelBuffers64 =
double_buffer_pointers.data();
reinterpret_cast<double**>(buffer_pointers.data());
},
[&](std::vector<std::vector<float>>& buffers) {
float_buffer_pointers.clear();
buffer_pointers.clear();
for (auto& buffer : buffers) {
float_buffer_pointers.push_back(buffer.data());
buffer_pointers.push_back(buffer.data());
}
reconstructed_buffers.numChannels = buffers.size();
reconstructed_buffers.channelBuffers32 =
float_buffer_pointers.data();
reinterpret_cast<float**>(buffer_pointers.data());
},
},
buffers);
return reconstructed_buffers;
}
YaProcessData::YaProcessData() {}
YaProcessData::YaProcessData(const Steinberg::Vst::ProcessData& process_data)
: process_mode(process_data.processMode),
symbolic_sample_size(process_data.symbolicSampleSize),
num_samples(process_data.numSamples),
outputs_num_channels(process_data.numOutputs),
input_parameter_changes(*process_data.inputParameterChanges),
input_events(process_data.inputEvents ? std::make_optional<YaEventList>(
*process_data.inputEvents)
: std::nullopt),
process_context(process_data.processContext
? std::make_optional<Steinberg::Vst::ProcessContext>(
*process_data.processContext)
: std::nullopt) {
for (int i = 0; i < process_data.numInputs; i++) {
inputs.emplace_back(symbolic_sample_size, num_samples,
process_data.inputs[i]);
}
// Fetch the number of channels for each output so we can recreate these
// buffers in the Wine plugin host
for (int i = 0; i < process_data.numOutputs; i++) {
outputs_num_channels[i] = process_data.outputs[i].numChannels;
}
}
// TODO: Reconstruction