Mercurial > hg > easaier-soundaccess
view sv/filter/FilterStack.cpp @ 282:d9319859a4cf tip
(none)
author | benoitrigolleau |
---|---|
date | Fri, 31 Oct 2008 11:00:24 +0000 |
parents | d2dff2170c7a |
children |
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" #include "MultiRealTimeFilter.h" FilterStack::FilterStack() : QObject(), m_count(0), m_sourceChannelCount(0) {} FilterStack::~FilterStack() { removeAllFilters(); } Filter* FilterStack::findFilter(QString &name) { std::map<int, Filter *>::iterator iter; for ( iter = m_filters.begin(); iter != m_filters.end(); iter++) { Filter * filter = iter->second; if (name.contains(filter->objectName())) { return filter; } } return 0; } void FilterStack::addFilter(Filter * filter) { m_filters[m_count] = filter; filter->setSourceChannelCount(m_sourceChannelCount); m_count++; std::vector<PropertyContainer*> filterCollection = filter->getFilterCollection(); std::vector<PropertyContainer*>::iterator iter; for (iter = filterCollection.begin(); iter != filterCollection.end(); iter++) { PropertyContainer* filterElt = *iter; emit newFilterAdded(filterElt); } connect(filter, SIGNAL(propertyContainerRemoved(QString)), this, SIGNAL(filterRemoved(QString))); } 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; if(filter->isFilterEnabled()){ 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; if(filter->isFilterEnabled()){ 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); filter = 0; return; } } } void FilterStack::removeAllFilters() { while (!m_filters.empty()) { Filter * filter = m_filters.begin()->second; QString filterName(filter->objectName()); removeFilter(filterName); } m_filters.clear(); m_count = 0; } 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) && (filter->isFilterEnabled()) ) { max = required; } } return max; } size_t FilterStack::getRequiredSkipSamples() { size_t skip = 1024; std::map<int, Filter *>::iterator iter; for (iter = m_filters.begin(); iter != m_filters.end(); iter++) { // find the time filter Filter * filter = iter->second; if (filter->objectName() == "DIT Filters") { MultiRealTimeFilter * timefilter = (MultiRealTimeFilter *) filter; if (filter->isFilterEnabled()) { skip = timefilter->getRequiredSkipSamples(); } } } return skip; } 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); } } bool FilterStack::allowOtherFilter(QString &labelType) { Filter* filter = findFilter(labelType); if ( (filter) && (!filter->allowMultiple()) ) { return false; } return true; } QString FilterStack::toEasaierXmlString(QString indent, QString extraAttributes) const { QString s; s += indent + QString("<filters>\n"); std::map<int, Filter *>::const_iterator iter; for (iter = m_filters.begin(); iter != m_filters.end(); iter++) { Filter * filter = iter->second; s += filter->toEasaierXmlString(indent + indent, extraAttributes); } s += indent + "</filters>\n"; return s; }