+++ /dev/null
-
-/*
- * 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());
- }
-}
-
-