205 lines
5.5 KiB
C++
205 lines
5.5 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Project : VST SDK
|
|
//
|
|
// Category : Helpers
|
|
// Filename : public.sdk/source/vst/hosting/processdata.cpp
|
|
// Created by : Steinberg, 10/2005
|
|
// Description : VST Hosting Utilities
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
// This file is part of a Steinberg SDK. It is subject to the license terms
|
|
// in the LICENSE file found in the top-level directory of this distribution
|
|
// and at www.steinberg.net/sdklicenses.
|
|
// No part of the SDK, including this file, may be copied, modified, propagated,
|
|
// or distributed except according to the terms contained in the LICENSE file.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "processdata.h"
|
|
|
|
//------------------------------------------------------------------------
|
|
namespace Steinberg {
|
|
namespace Vst {
|
|
|
|
//------------------------------------------------------------------------
|
|
// HostProcessData
|
|
//------------------------------------------------------------------------
|
|
HostProcessData::~HostProcessData () noexcept
|
|
{
|
|
unprepare ();
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
bool HostProcessData::prepare (IComponent& component, int32 bufferSamples,
|
|
int32 _symbolicSampleSize)
|
|
{
|
|
if (checkIfReallocationNeeded (component, bufferSamples, _symbolicSampleSize))
|
|
{
|
|
unprepare ();
|
|
|
|
symbolicSampleSize = _symbolicSampleSize;
|
|
channelBufferOwner = bufferSamples > 0;
|
|
|
|
numInputs = createBuffers (component, inputs, kInput, bufferSamples);
|
|
numOutputs = createBuffers (component, outputs, kOutput, bufferSamples);
|
|
}
|
|
else
|
|
{
|
|
// reset silence flags
|
|
for (int32 i = 0; i < numInputs; i++)
|
|
{
|
|
inputs[i].silenceFlags = 0;
|
|
}
|
|
for (int32 i = 0; i < numOutputs; i++)
|
|
{
|
|
outputs[i].silenceFlags = 0;
|
|
}
|
|
}
|
|
symbolicSampleSize = _symbolicSampleSize;
|
|
|
|
return true;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void HostProcessData::unprepare ()
|
|
{
|
|
destroyBuffers (inputs, numInputs);
|
|
destroyBuffers (outputs, numOutputs);
|
|
|
|
channelBufferOwner = false;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
bool HostProcessData::checkIfReallocationNeeded (IComponent& component, int32 bufferSamples,
|
|
int32 _symbolicSampleSize) const
|
|
{
|
|
if (channelBufferOwner != (bufferSamples > 0))
|
|
return true;
|
|
if (symbolicSampleSize != _symbolicSampleSize)
|
|
return true;
|
|
|
|
int32 inBusCount = component.getBusCount (kAudio, kInput);
|
|
if (inBusCount != numInputs)
|
|
return true;
|
|
|
|
int32 outBusCount = component.getBusCount (kAudio, kOutput);
|
|
if (outBusCount != numOutputs)
|
|
return true;
|
|
|
|
for (int32 i = 0; i < inBusCount; i++)
|
|
{
|
|
BusInfo busInfo = {};
|
|
|
|
if (component.getBusInfo (kAudio, kInput, i, busInfo) == kResultTrue)
|
|
{
|
|
if (inputs[i].numChannels != busInfo.channelCount)
|
|
return true;
|
|
}
|
|
}
|
|
for (int32 i = 0; i < outBusCount; i++)
|
|
{
|
|
BusInfo busInfo = {};
|
|
|
|
if (component.getBusInfo (kAudio, kOutput, i, busInfo) == kResultTrue)
|
|
{
|
|
if (outputs[i].numChannels != busInfo.channelCount)
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
int32 HostProcessData::createBuffers (IComponent& component, AudioBusBuffers*& buffers,
|
|
BusDirection dir, int32 bufferSamples)
|
|
{
|
|
int32 busCount = component.getBusCount (kAudio, dir);
|
|
if (busCount > 0)
|
|
{
|
|
buffers = new AudioBusBuffers[busCount];
|
|
|
|
for (int32 i = 0; i < busCount; i++)
|
|
{
|
|
BusInfo busInfo = {};
|
|
|
|
if (component.getBusInfo (kAudio, dir, i, busInfo) == kResultTrue)
|
|
{
|
|
buffers[i].numChannels = busInfo.channelCount;
|
|
|
|
// allocate for each channel
|
|
if (busInfo.channelCount > 0)
|
|
{
|
|
if (symbolicSampleSize == kSample64)
|
|
buffers[i].channelBuffers64 = new Sample64*[busInfo.channelCount];
|
|
else
|
|
buffers[i].channelBuffers32 = new Sample32*[busInfo.channelCount];
|
|
|
|
for (int32 j = 0; j < busInfo.channelCount; j++)
|
|
{
|
|
if (symbolicSampleSize == kSample64)
|
|
{
|
|
if (bufferSamples > 0)
|
|
buffers[i].channelBuffers64[j] = new Sample64[bufferSamples];
|
|
else
|
|
buffers[i].channelBuffers64[j] = nullptr;
|
|
}
|
|
else
|
|
{
|
|
if (bufferSamples > 0)
|
|
buffers[i].channelBuffers32[j] = new Sample32[bufferSamples];
|
|
else
|
|
buffers[i].channelBuffers32[j] = nullptr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return busCount;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void HostProcessData::destroyBuffers (AudioBusBuffers*& buffers, int32& busCount)
|
|
{
|
|
if (buffers)
|
|
{
|
|
for (int32 i = 0; i < busCount; i++)
|
|
{
|
|
if (channelBufferOwner)
|
|
{
|
|
for (int32 j = 0; j < buffers[i].numChannels; j++)
|
|
{
|
|
if (symbolicSampleSize == kSample64)
|
|
{
|
|
if (buffers[i].channelBuffers64 && buffers[i].channelBuffers64[j])
|
|
delete[] buffers[i].channelBuffers64[j];
|
|
}
|
|
else
|
|
{
|
|
if (buffers[i].channelBuffers32 && buffers[i].channelBuffers32[j])
|
|
delete[] buffers[i].channelBuffers32[j];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (symbolicSampleSize == kSample64)
|
|
{
|
|
if (buffers[i].channelBuffers64)
|
|
delete[] buffers[i].channelBuffers64;
|
|
}
|
|
else
|
|
{
|
|
if (buffers[i].channelBuffers32)
|
|
delete[] buffers[i].channelBuffers32;
|
|
}
|
|
}
|
|
|
|
delete[] buffers;
|
|
buffers = nullptr;
|
|
}
|
|
busCount = 0;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
} // namespace Vst
|
|
} // namespace Steinberg
|