Make it possible to use sample-exact controls in LADSPA plugins

I don't think we currently have any that would support this functionality, but in case someone has a LADSPA plugin that has audiorate control ports, this allows them to be used with the new sample-exact models
Again... not strictly related to memory management, but since I was in that part of the codebase already...
This commit is contained in:
Vesa
2014-08-24 20:29:43 +03:00
parent daa5f6c26d
commit af60402078
3 changed files with 41 additions and 9 deletions

View File

@@ -30,6 +30,7 @@
#include "AutomatableModel.h"
#include "TempoSyncKnobModel.h"
#include "ValueBuffer.h"
typedef struct PortDescription port_desc_t;
@@ -44,6 +45,7 @@ public:
~LadspaControl();
LADSPA_Data value();
ValueBuffer * valueBuffer();
void setValue( LADSPA_Data _value );
void setLink( bool _state );

View File

@@ -38,6 +38,7 @@
#include "AutomationPattern.h"
#include "ControllerConnection.h"
#include "MemoryManager.h"
#include "ValueBuffer.h"
#include "embed.cpp"
@@ -175,18 +176,28 @@ bool LadspaEffect::processAudioBuffer( sampleFrame * _buf,
++channel;
break;
case AUDIO_RATE_INPUT:
pp->value = static_cast<LADSPA_Data>(
pp->control->value() / pp->scale );
// This only supports control rate ports, so the audio rates are
// treated as though they were control rate by setting the
// port buffer to all the same value.
for( fpp_t frame = 0;
frame < frames; ++frame )
{
ValueBuffer * vb = pp->control->valueBuffer();
if( vb )
{
pp->buffer[frame] =
pp->value;
memcpy( pp->buffer, vb->values(), frames * sizeof(float) );
}
else
{
pp->value = static_cast<LADSPA_Data>(
pp->control->value() / pp->scale );
// This only supports control rate ports, so the audio rates are
// treated as though they were control rate by setting the
// port buffer to all the same value.
for( fpp_t frame = 0;
frame < frames; ++frame )
{
pp->buffer[frame] =
pp->value;
}
}
break;
}
case CONTROL_RATE_INPUT:
if( pp->control == NULL )
{

View File

@@ -130,6 +130,25 @@ LADSPA_Data LadspaControl::value()
}
ValueBuffer * LadspaControl::valueBuffer()
{
switch( m_port->data_type )
{
case TOGGLED:
case INTEGER:
return NULL;
case FLOATING:
return m_knobModel.valueBuffer();
case TIME:
return m_tempoSyncKnobModel.valueBuffer();
default:
qWarning( "LadspaControl::valueBuffer(): BAD BAD BAD\n" );
break;
}
return NULL;
}
void LadspaControl::setValue( LADSPA_Data _value )