/* * CINELERRA * Copyright (C) 2008 Adam Williams * * 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 * */ #ifndef VIRTUALANODE_H #define VIRTUALANODE_H #include "arender.inc" #include "filethread.inc" // RING_BUFFERS #include "maxchannels.h" #include "plugin.inc" #include "samples.inc" #include "units.h" #include "virtualnode.h" class VirtualANode : public VirtualNode { public: VirtualANode(RenderEngine *renderengine, VirtualConsole *vconsole, Module *real_module, Plugin *real_plugin, Track *track, VirtualNode *parent_module); ~VirtualANode(); VirtualNode* create_module(Plugin *real_plugin, Module *real_module, Track *track); VirtualNode* create_plugin(Plugin *real_plugin); // Called by VirtualAConsole::process_buffer to process exit_nodes. // read_data recurses down the tree. int render(Samples *output_temp, int64_t size, int64_t start_position, int64_t sample_rate); // Read data from whatever comes before this node. // Calls render in either the parent node or the module for the track. int read_data(Samples *output_temp, int64_t size, int64_t start_position, int64_t sample_rate); private: // need *arender for peak updating int render_as_module(Samples **audio_out, Samples *output_temp, int64_t size, int64_t start_position, int64_t sample_rate); void render_as_plugin(Samples *output_temp, int64_t size, int64_t start_position, int64_t sample_rate); int render_fade(double *buffer, int64_t len, int64_t input_position, int64_t sample_rate, Autos *autos, int direction, int use_nudge); int render_pan(double *input, // start of input fragment double *output, // start of output fragment int64_t fragment_len, // fragment length in input scale int64_t input_position, // starting sample of input buffer in project int64_t sample_rate, Autos *autos, int channel, int direction, int use_nudge); void get_pan_automation(double &slope, double &intercept, int64_t input_position, int64_t &slope_len, Autos *autos, int channel, int direction); /* * double* get_module_input(int double_buffer, int64_t fragment_position); * double* get_module_output(int double_buffer, int64_t fragment_position); */ DB db; Auto *pan_before[MAXCHANNELS], *pan_after[MAXCHANNELS]; }; #endif