summaryrefslogtreecommitdiff
path: root/libs/ardour/plugin_insert.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/plugin_insert.cc')
-rw-r--r--libs/ardour/plugin_insert.cc65
1 files changed, 62 insertions, 3 deletions
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 2c08473b54..7ed35dd1a7 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -57,7 +57,9 @@ using namespace PBD;
const string PluginInsert::port_automation_node_name = "PortAutomation";
PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug, Placement placement)
- : Processor (s, plug->name(), placement)
+ : Processor (s, plug->name(), placement),
+ _signal_analysis_collected_nframes(0),
+ _signal_analysis_collect_nframes_max(0)
{
/* the first is the master */
@@ -74,7 +76,9 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug, Placemen
}
PluginInsert::PluginInsert (Session& s, const XMLNode& node)
- : Processor (s, "unnamed plugin insert", PreFader)
+ : Processor (s, "unnamed plugin insert", PreFader),
+ _signal_analysis_collected_nframes(0),
+ _signal_analysis_collect_nframes_max(0)
{
if (set_state (node)) {
throw failed_constructor();
@@ -92,7 +96,9 @@ PluginInsert::PluginInsert (Session& s, const XMLNode& node)
}
PluginInsert::PluginInsert (const PluginInsert& other)
- : Processor (other._session, other._name, other.placement())
+ : Processor (other._session, other._name, other.placement()),
+ _signal_analysis_collected_nframes(0),
+ _signal_analysis_collect_nframes_max(0)
{
uint32_t count = other._plugins.size();
@@ -282,6 +288,13 @@ PluginInsert::deactivate ()
void
PluginInsert::connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now)
{
+ // Calculate if, and how many frames we need to collect for analysis
+ nframes_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
+ _signal_analysis_collected_nframes);
+ if (nframes < collect_signal_nframes) { // we might not get all frames now
+ collect_signal_nframes = nframes;
+ }
+
uint32_t in_index = 0;
uint32_t out_index = 0;
@@ -311,10 +324,45 @@ PluginInsert::connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t off
}
}
+ if (collect_signal_nframes > 0) {
+ // collect input
+ //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
+ //std::cerr << " streams " << input_streams().n_audio() << std::endl;
+ //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
+ for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
+ _signal_analysis_input_bufferset.get_audio(i).read_from(
+ bufs.get_audio(i),
+ collect_signal_nframes,
+ _signal_analysis_collected_nframes); // offset is for target buffer
+ }
+ }
+
for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
(*i)->connect_and_run (bufs, in_index, out_index, nframes, offset);
}
+ if (collect_signal_nframes > 0) {
+ // collect output
+ //std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
+ //std::cerr << " streams " << output_streams().n_audio() << std::endl;
+ for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
+ _signal_analysis_output_bufferset.get_audio(i).read_from(
+ bufs.get_audio(i),
+ collect_signal_nframes,
+ _signal_analysis_collected_nframes); // offset is for target buffer
+ }
+
+ _signal_analysis_collected_nframes += collect_signal_nframes;
+ assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
+
+ if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
+ _signal_analysis_collect_nframes_max = 0;
+ _signal_analysis_collected_nframes = 0;
+
+ AnalysisDataGathered(&_signal_analysis_input_bufferset,
+ &_signal_analysis_output_bufferset);
+ }
+ }
/* leave remaining channel buffers alone */
}
@@ -508,6 +556,17 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
return false;
}
+ // we don't know the analysis window size, so we must work with the
+ // current buffer size here. each request for data fills in these
+ // buffers and the analyser makes sure it gets enough data for the
+ // analysis window
+ _signal_analysis_input_bufferset.ensure_buffers (in, session().engine().frames_per_cycle());
+ _signal_analysis_input_bufferset.set_count(in);
+
+ _signal_analysis_output_bufferset.ensure_buffers(out, session().engine().frames_per_cycle());
+ _signal_analysis_output_bufferset.set_count(out);
+
+
return Processor::configure_io (in, out);
}