Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / aattachmentpoint.C
diff --git a/cinelerra-5.1/cinelerra/aattachmentpoint.C b/cinelerra-5.1/cinelerra/aattachmentpoint.C
new file mode 100644 (file)
index 0000000..edeba46
--- /dev/null
@@ -0,0 +1,143 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2009 Adam Williams <broadcast at earthling dot net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#include "aattachmentpoint.h"
+#include "bcsignals.h"
+#include "datatype.h"
+#include "edl.h"
+#include "edlsession.h"
+#include "playbackconfig.h"
+#include "plugin.h"
+#include "pluginserver.h"
+#include "renderengine.h"
+#include "samples.h"
+#include "transportque.h"
+
+AAttachmentPoint::AAttachmentPoint(RenderEngine *renderengine, Plugin *plugin)
+: AttachmentPoint(renderengine, plugin, TRACK_AUDIO)
+{
+       buffer_vector = 0;
+       buffer_allocation = 0;
+}
+
+AAttachmentPoint::~AAttachmentPoint()
+{
+       delete_buffer_vector();
+}
+
+void AAttachmentPoint::delete_buffer_vector()
+{
+       if(buffer_vector)
+       {
+               for(int i = 0; i < virtual_plugins.total; i++)
+                       delete buffer_vector[i];
+               delete [] buffer_vector;
+       }
+       buffer_vector = 0;
+       buffer_allocation = 0;
+}
+
+void AAttachmentPoint::new_buffer_vector(int total, int size)
+{
+       if(buffer_vector && size > buffer_allocation)
+               delete_buffer_vector();
+
+       if(!buffer_vector)
+       {
+               buffer_allocation = size;
+               buffer_vector = new Samples*[virtual_plugins.total];
+               for(int i = 0; i < virtual_plugins.total; i++)
+               {
+                       buffer_vector[i] = new Samples(buffer_allocation);
+               }
+       }
+}
+
+int AAttachmentPoint::get_buffer_size()
+{
+       return renderengine->config->aconfig->fragment_size;
+// must be greater than value audio_read_length, calculated in PackageRenderer::create_engine
+// if it is not, plugin's PluginClient::in_buffer_size is below the real maximum and
+// we get a crush on rendering of audio plugins!
+//     int audio_read_length = renderengine->command->get_edl()->session->sample_rate;
+//     int fragment_size = renderengine->config->aconfig->fragment_size;
+//     if(audio_read_length > fragment_size)
+//             return audio_read_length;
+//     else
+//             return fragment_size;
+}
+
+void AAttachmentPoint::render(Samples *output, 
+       int buffer_number,
+       int64_t start_position, 
+       int64_t len,
+       int64_t sample_rate)
+{
+       if(!plugin_server || !plugin->on) return;
+
+       if(plugin_server->multichannel)
+       {
+// Test against previous parameters for reuse of previous data
+               if( !is_processed || this->start_position != start_position || 
+                       this->len != len || this->sample_rate != sample_rate ) {
+// Update status
+                       this->start_position = start_position;
+                       this->len = len;
+                       this->sample_rate = sample_rate;
+                       is_processed = 1;
+
+// Allocate buffer vector
+                       new_buffer_vector(virtual_plugins.total, len);
+
+// Process plugin
+                       plugin_servers.values[0]->process_buffer(
+                               buffer_vector, start_position, len, sample_rate,
+                               plugin->length * sample_rate /
+                                       renderengine->get_edl()->session->sample_rate,
+                               renderengine->command->get_direction());
+               }
+               memcpy(output->get_data(), 
+                       buffer_vector[buffer_number]->get_data(), 
+                       sizeof(double) * len);
+       }
+       else
+       {
+// Process plugin
+               Samples *output_temp[1];
+               output_temp[0] = output;
+
+if(0) printf("AAttachmentPoint::render %d buffer_number=%d renderengine=%p plugin_server=%p\n", 
+__LINE__, 
+buffer_number,
+renderengine,
+plugin_servers.values[buffer_number]);
+               plugin_servers.values[buffer_number]->process_buffer(output_temp,
+                       start_position,
+                       len,
+                       sample_rate,
+                       plugin->length *
+                               sample_rate /
+                               renderengine->get_edl()->session->sample_rate,
+                       renderengine->command->get_direction());
+       }
+}
+
+