lbajardsilogic@79: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@79: lbajardsilogic@79: /* Sound Access lbajardsilogic@79: EASAIER client application. lbajardsilogic@79: Silogic 2007. Laure Bajard. lbajardsilogic@79: lbajardsilogic@79: This program is free software; you can redistribute it and/or lbajardsilogic@79: modify it under the terms of the GNU General Public License as lbajardsilogic@79: published by the Free Software Foundation; either version 2 of the lbajardsilogic@79: License, or (at your option) any later version. See the file lbajardsilogic@79: COPYING included with this distribution for more information. lbajardsilogic@79: */ lbajardsilogic@79: lbajardsilogic@79: #include "FilterStack.h" lbajardsilogic@79: lbajardsilogic@223: #include "MultiRealTimeFilter.h" lbajardsilogic@106: lbajardsilogic@179: FilterStack::FilterStack() : QObject(), lbajardsilogic@179: m_count(0), lbajardsilogic@179: m_sourceChannelCount(0) lbajardsilogic@79: {} lbajardsilogic@79: lbajardsilogic@79: FilterStack::~FilterStack() lbajardsilogic@79: { lbajardsilogic@174: removeAllFilters(); lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@181: Filter* FilterStack::findFilter(QString &name) lbajardsilogic@181: { lbajardsilogic@181: std::map::iterator iter; lbajardsilogic@181: lbajardsilogic@191: for ( iter = m_filters.begin(); iter != m_filters.end(); iter++) lbajardsilogic@191: { lbajardsilogic@191: Filter * filter = iter->second; lbajardsilogic@191: if (name.contains(filter->objectName())) lbajardsilogic@191: { lbajardsilogic@191: return filter; lbajardsilogic@191: } lbajardsilogic@181: } lbajardsilogic@181: return 0; lbajardsilogic@181: } lbajardsilogic@181: lbajardsilogic@79: void FilterStack::addFilter(Filter * filter) lbajardsilogic@79: { lbajardsilogic@79: m_filters[m_count] = filter; lbajardsilogic@84: filter->setSourceChannelCount(m_sourceChannelCount); lbajardsilogic@79: m_count++; lbajardsilogic@223: lbajardsilogic@223: std::vector filterCollection = filter->getFilterCollection(); lbajardsilogic@223: std::vector::iterator iter; lbajardsilogic@223: for (iter = filterCollection.begin(); iter != filterCollection.end(); iter++) lbajardsilogic@223: { lbajardsilogic@223: PropertyContainer* filterElt = *iter; lbajardsilogic@223: emit newFilterAdded(filterElt); lbajardsilogic@223: } lbajardsilogic@224: lbajardsilogic@224: connect(filter, SIGNAL(propertyContainerRemoved(QString)), lbajardsilogic@224: this, SIGNAL(filterRemoved(QString))); lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@191: void FilterStack::putInput(float **input, size_t samples) lbajardsilogic@191: { lbajardsilogic@191: //only process the first filter, should pass in all filters !!! lbajardsilogic@191: std::map::iterator iter = m_filters.begin(); lbajardsilogic@191: lbajardsilogic@191: if (iter != m_filters.end()) lbajardsilogic@191: { lbajardsilogic@191: Filter * filter = iter->second; lbajardsilogic@191: if(filter->isFilterEnabled()){ lbajardsilogic@191: filter->putInput(input, samples); lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: void FilterStack::getOutput(float **output, size_t samples) lbajardsilogic@191: { lbajardsilogic@191: //only process the first filter, should pass in all filters !!! lbajardsilogic@191: std::map::iterator iter = m_filters.begin(); lbajardsilogic@191: lbajardsilogic@191: if (iter != m_filters.end()) lbajardsilogic@191: { lbajardsilogic@191: Filter * filter = iter->second; lbajardsilogic@191: if(filter->isFilterEnabled()){ lbajardsilogic@191: filter->getOutput(output, samples); lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: QString FilterStack::getUniqueFilterName(QString candidate) lbajardsilogic@191: { lbajardsilogic@191: for (int count = 1; ; ++count) { lbajardsilogic@191: lbajardsilogic@191: QString adjusted = lbajardsilogic@191: (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) : lbajardsilogic@191: candidate); lbajardsilogic@191: lbajardsilogic@191: bool duplicate = false; lbajardsilogic@191: lbajardsilogic@191: for (std::map::iterator i = m_filters.begin(); i != m_filters.end(); ++i) { lbajardsilogic@191: Filter * filter = i->second; lbajardsilogic@191: if (filter->objectName() == adjusted) { lbajardsilogic@191: duplicate = true; lbajardsilogic@191: break; lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: if (!duplicate) return adjusted; lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: void FilterStack::removeFilter(QString &name) lbajardsilogic@191: { lbajardsilogic@191: std::map::iterator iter; lbajardsilogic@191: lbajardsilogic@191: for (iter = m_filters.begin(); iter != m_filters.end(); iter++) lbajardsilogic@191: { lbajardsilogic@191: Filter * filter = iter->second; lbajardsilogic@191: if (filter->objectName() == name) lbajardsilogic@191: { lbajardsilogic@191: delete filter; lbajardsilogic@191: m_filters.erase(iter); lbajardsilogic@191: emit filterRemoved(name); lbajardsilogic@191: filter = 0; lbajardsilogic@191: return; lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: void FilterStack::removeAllFilters() lbajardsilogic@191: { lbajardsilogic@191: while (!m_filters.empty()) lbajardsilogic@191: { lbajardsilogic@191: Filter * filter = m_filters.begin()->second; lbajardsilogic@191: QString filterName(filter->objectName()); lbajardsilogic@191: removeFilter(filterName); lbajardsilogic@191: } lbajardsilogic@191: m_filters.clear(); lbajardsilogic@191: m_count = 0; lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: size_t FilterStack::getRequiredInputSamples(size_t outputSamplesNeeded) lbajardsilogic@191: { lbajardsilogic@191: size_t max = 0; lbajardsilogic@191: lbajardsilogic@191: std::map::iterator iter; lbajardsilogic@191: lbajardsilogic@191: for (iter = m_filters.begin(); iter != m_filters.end(); iter++) lbajardsilogic@191: { lbajardsilogic@191: Filter * filter = iter->second; lbajardsilogic@191: size_t required = filter->getRequiredInputSamples(outputSamplesNeeded); lbajardsilogic@191: if ( (required > max) && (filter->isFilterEnabled()) ) lbajardsilogic@191: { lbajardsilogic@191: max = required; lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: return max; lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: size_t FilterStack::getRequiredSkipSamples() lbajardsilogic@191: { lbajardsilogic@191: size_t skip = 1024; lbajardsilogic@191: lbajardsilogic@191: std::map::iterator iter; lbajardsilogic@191: lbajardsilogic@191: for (iter = m_filters.begin(); iter != m_filters.end(); iter++) lbajardsilogic@191: { lbajardsilogic@191: // find the time filter lbajardsilogic@191: Filter * filter = iter->second; lbajardsilogic@223: if (filter->objectName() == "DIT Filters") lbajardsilogic@191: { lbajardsilogic@223: MultiRealTimeFilter * timefilter = (MultiRealTimeFilter *) filter; lbajardsilogic@191: if (filter->isFilterEnabled()) { lbajardsilogic@191: skip = timefilter->getRequiredSkipSamples(); lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: } lbajardsilogic@191: return skip; lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: void FilterStack::setSourceChannelCount(size_t channel) lbajardsilogic@191: { lbajardsilogic@191: m_sourceChannelCount = channel; lbajardsilogic@191: lbajardsilogic@191: std::map::iterator iter; lbajardsilogic@191: lbajardsilogic@191: for (iter = m_filters.begin(); iter != m_filters.end(); iter++) lbajardsilogic@191: { lbajardsilogic@191: Filter * filter = iter->second; lbajardsilogic@191: filter->setSourceChannelCount(m_sourceChannelCount); lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: bool FilterStack::allowOtherFilter(QString &labelType) lbajardsilogic@191: { lbajardsilogic@191: Filter* filter = findFilter(labelType); lbajardsilogic@191: if ( (filter) && (!filter->allowMultiple()) ) lbajardsilogic@191: { lbajardsilogic@191: return false; lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: return true; lbajardsilogic@203: } lbajardsilogic@203: lbajardsilogic@203: QString FilterStack::toEasaierXmlString(QString indent, QString extraAttributes) const lbajardsilogic@203: { lbajardsilogic@203: QString s; lbajardsilogic@203: lbajardsilogic@203: s += indent + QString("\n"); lbajardsilogic@203: lbajardsilogic@203: std::map::const_iterator iter; lbajardsilogic@203: for (iter = m_filters.begin(); iter != m_filters.end(); iter++) lbajardsilogic@203: { lbajardsilogic@203: Filter * filter = iter->second; lbajardsilogic@203: s += filter->toEasaierXmlString(indent + indent, extraAttributes); lbajardsilogic@203: } lbajardsilogic@203: lbajardsilogic@203: s += indent + "\n"; lbajardsilogic@203: lbajardsilogic@203: return s; lbajardsilogic@79: }