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:
@@ -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 );
|
||||
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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 )
|
||||
|
||||
Reference in New Issue
Block a user