
/*
 * CINELERRA
 * Copyright (C) 2008 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
 * 
 */

#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,
        double playhead_position);

// 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,
        double playhead_position);

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,
        double playhead_position);
	void render_as_plugin(Samples *output_temp,
		int64_t size,
		int64_t start_position, 
		int64_t sample_rate,
        double playhead_position);

	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
