view sv/filter/FilterStack.cpp @ 84:51a12971e10e

specify the number of channels of the source to the filters
author lbajardsilogic
date Fri, 22 Jun 2007 13:35:26 +0000
parents 8ebc85f6ce4e
children 5060939ca69d
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*	Sound Access	
		EASAIER client application.	
		Silogic 2007. Laure Bajard. 
	
	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.  See the file    
	COPYING included with this distribution for more information.
*/
 
#include "FilterStack.h"

FilterStack::FilterStack() : QObject()
{}

FilterStack::~FilterStack()
{
	std::map<int, Filter *>::iterator iter;

	for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
	{
		Filter * filter = iter->second;
		delete filter;
	}
	m_filters.clear();
}

void FilterStack::addFilter(Filter * filter)
{
	m_filters[m_count] = filter;
	filter->setSourceChannelCount(m_sourceChannelCount);
	m_count++;	
	emit newFilterAdded(filter);
}

void FilterStack::putInput(float **input, size_t samples)
{
	//only process the first filter, should pass in all filters !!!
	std::map<int, Filter *>::iterator iter = m_filters.begin();

	if (iter != m_filters.end())
	{
		Filter * filter = iter->second;
		filter->putInput(input, samples);
	}
}

void FilterStack::getOutput(float **output, size_t samples)
{
	//only process the first filter, should pass in all filters !!!
	std::map<int, Filter *>::iterator iter = m_filters.begin();

	if (iter != m_filters.end())
	{
		Filter * filter = iter->second;
		filter->getOutput(output, samples);
	}
}

QString FilterStack::getUniqueFilterName(QString candidate)
{
    for (int count = 1; ; ++count) {

        QString adjusted =
            (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) :
             candidate);
        
        bool duplicate = false;

        for (std::map<int, Filter *>::iterator i = m_filters.begin(); i != m_filters.end(); ++i) {
			Filter * filter = i->second;
			if (filter->objectName() == adjusted) {
                duplicate = true;
                break;
            }
        }

        if (!duplicate) return adjusted;
    }
}

void FilterStack::removeFilter(QString &name)
{
	std::map<int, Filter *>::iterator iter;

	for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
	{
		Filter * filter = iter->second;
		if (filter->objectName() == name)
		{
			delete filter;
			m_filters.erase(iter);
			emit filterRemoved(name);
			return;
		}
	}
}

void FilterStack::removeAllFilters()
{
	while (!m_filters.empty())
	{
		Filter * filter = m_filters.begin()->second;
		removeFilter(filter->objectName());
	}
}

size_t FilterStack::getRequiredInputSamples(size_t outputSamplesNeeded)
{
	size_t max = 0;

	std::map<int, Filter *>::iterator iter;

	for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
	{
		Filter * filter = iter->second;
		size_t required = filter->getRequiredInputSamples(outputSamplesNeeded);
		if (required > max)
		{
			max = required;
		}
	}
	return max;
}

void FilterStack::setSourceChannelCount(size_t channel)
{
	m_sourceChannelCount = channel;

	std::map<int, Filter *>::iterator iter;

	for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
	{
		Filter * filter = iter->second;
		filter->setSourceChannelCount(m_sourceChannelCount);
	}

}