Skip to content
Snippets Groups Projects
  • jsiegle's avatar
    e36119a1
    Change copyright year to 2013 · e36119a1
    jsiegle authored
    Use the following command to update the copyright year in all files,
    starting in the Source/ directory:
    
    find . -type f -print0 | xargs -0
       sed -i 's/Copyright (C) 2012/Copyright (C) 2013/g'
    
    Works like a charm!
    e36119a1
    History
    Change copyright year to 2013
    jsiegle authored
    Use the following command to update the copyright year in all files,
    starting in the Source/ directory:
    
    find . -type f -print0 | xargs -0
       sed -i 's/Copyright (C) 2012/Copyright (C) 2013/g'
    
    Works like a charm!
AudioNode.cpp 4.58 KiB
/*
    ------------------------------------------------------------------

    This file is part of the Open Ephys GUI
    Copyright (C) 2013 Open Ephys

    ------------------------------------------------------------------

    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 3 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, see <http://www.gnu.org/licenses/>.

*/


#include "AudioNode.h"
#include "Channel.h"

AudioNode::AudioNode()
	: GenericProcessor("Audio Node"), audioEditor(0), volume(0.00001f)
{

	settings.numInputs = 128;
	settings.numOutputs = 2;

	// 128 inputs, 2 outputs (left and right channel)
	setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128);

	//leftChan.clear();
	//rightChan.clear();

	nextAvailableChannel = 2; // keep first two channels empty


}


AudioNode::~AudioNode() {



}

AudioProcessorEditor* AudioNode::createEditor()
{
	
	audioEditor = new AudioEditor(this);

	//setEditor(editor);
	
	return audioEditor; 

}

void AudioNode::resetConnections()
{

	nextAvailableChannel = 2; // start connections at channel 2
	wasConnected = false;

	channelPointers.clear();

}

void AudioNode::setChannel(Channel* ch)
{

	int channelNum = channelPointers.indexOf(ch);

	std::cout << "Audio node setting channel to " << channelNum << std::endl;

	setCurrentChannel(channelNum);
}

void AudioNode::setChannelStatus(Channel* chan, bool status)
{

	setChannel(chan); // add 2 to account for 2 output channels

	enableCurrentChannel(status);

}

void AudioNode::enableCurrentChannel(bool state)
{

	//setCurrentChannel(nextAvailableChannel);

	if (state)
	{
		setParameter(100, 0.0f);
	} else {
		setParameter(-100, 0.0f);
	}
}


void AudioNode::addInputChannel(GenericProcessor* sourceNode, int chan)
{

	//if (chan != getProcessorGraph()->midiChannelIndex)
	//{
        
		int channelIndex = getNextChannel(false);

        setPlayConfigDetails(channelIndex+1,0,44100.0,128);

        channelPointers.add(sourceNode->channels[chan]);
		
	//} else {

		// Can't monitor events at the moment!
//	}

}

void AudioNode::setParameter (int parameterIndex, float newValue)
{
	// change left channel, right channel, or volume
	if (parameterIndex == 1) 
	{
		// volume level
		volume = newValue*0.1f;

	} else if (parameterIndex == 100) 
	{

		channelPointers[currentChannel]->isMonitored = true;

		// add current channel
		// if (!leftChan.contains(currentChannel))
		// {
		// 	leftChan.add(currentChannel);
		// 	rightChan.add(currentChannel);
		// } 
	} else if (parameterIndex == -100)
	{

		channelPointers[currentChannel]->isMonitored = false;
		// remove current channel
		// if (leftChan.contains(currentChannel))
		// {
		// 	leftChan.remove(leftChan.indexOf(currentChannel));
		// 	rightChan.remove(rightChan.indexOf(currentChannel));
		// }
	}

}

void AudioNode::process(AudioSampleBuffer &buffer, 
                            MidiBuffer &midiMessages,
                            int& nSamples)
{
	float gain;
	//std::cout << "Audio node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl;

	// clear the left and right channels
	buffer.clear(0,0,buffer.getNumSamples());
	buffer.clear(1,0,buffer.getNumSamples());
	
	if (channelPointers.size() > 0) 
	{
		for (int i = 2; i < buffer.getNumChannels(); i++)
		{

			if (channelPointers[i-2]->isMonitored)
			{
				gain=volume/( float(0x7fff) * channelPointers[i-2]->bitVolts );
				buffer.addFrom(0,  		// destination channel
					0,  			// destination start sample
					buffer,      // source
					i, 			// source channel
					0,           // source start sample
					buffer.getNumSamples(), //  number of samples
					gain       // gain to apply
					);

				buffer.addFrom(1,  		// destination channel
					0,  			// destination start sample
					buffer,      // source
					i, 			// source channel
					0,           // source start sample
					buffer.getNumSamples(), //  number of samples
					gain       // gain to apply
					);

			}

		}
	}

}