Mercurial > hg > easaier-soundaccess
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); } }