annotate sv/filter/FilterStack.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents d2dff2170c7a
children
rev   line source
lbajardsilogic@79 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@79 2
lbajardsilogic@79 3 /* Sound Access
lbajardsilogic@79 4 EASAIER client application.
lbajardsilogic@79 5 Silogic 2007. Laure Bajard.
lbajardsilogic@79 6
lbajardsilogic@79 7 This program is free software; you can redistribute it and/or
lbajardsilogic@79 8 modify it under the terms of the GNU General Public License as
lbajardsilogic@79 9 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@79 10 License, or (at your option) any later version. See the file
lbajardsilogic@79 11 COPYING included with this distribution for more information.
lbajardsilogic@79 12 */
lbajardsilogic@79 13
lbajardsilogic@79 14 #include "FilterStack.h"
lbajardsilogic@79 15
lbajardsilogic@223 16 #include "MultiRealTimeFilter.h"
lbajardsilogic@106 17
lbajardsilogic@179 18 FilterStack::FilterStack() : QObject(),
lbajardsilogic@179 19 m_count(0),
lbajardsilogic@179 20 m_sourceChannelCount(0)
lbajardsilogic@79 21 {}
lbajardsilogic@79 22
lbajardsilogic@79 23 FilterStack::~FilterStack()
lbajardsilogic@79 24 {
lbajardsilogic@174 25 removeAllFilters();
lbajardsilogic@79 26 }
lbajardsilogic@79 27
lbajardsilogic@181 28 Filter* FilterStack::findFilter(QString &name)
lbajardsilogic@181 29 {
lbajardsilogic@181 30 std::map<int, Filter *>::iterator iter;
lbajardsilogic@181 31
lbajardsilogic@191 32 for ( iter = m_filters.begin(); iter != m_filters.end(); iter++)
lbajardsilogic@191 33 {
lbajardsilogic@191 34 Filter * filter = iter->second;
lbajardsilogic@191 35 if (name.contains(filter->objectName()))
lbajardsilogic@191 36 {
lbajardsilogic@191 37 return filter;
lbajardsilogic@191 38 }
lbajardsilogic@181 39 }
lbajardsilogic@181 40 return 0;
lbajardsilogic@181 41 }
lbajardsilogic@181 42
lbajardsilogic@79 43 void FilterStack::addFilter(Filter * filter)
lbajardsilogic@79 44 {
lbajardsilogic@79 45 m_filters[m_count] = filter;
lbajardsilogic@84 46 filter->setSourceChannelCount(m_sourceChannelCount);
lbajardsilogic@79 47 m_count++;
lbajardsilogic@223 48
lbajardsilogic@223 49 std::vector<PropertyContainer*> filterCollection = filter->getFilterCollection();
lbajardsilogic@223 50 std::vector<PropertyContainer*>::iterator iter;
lbajardsilogic@223 51 for (iter = filterCollection.begin(); iter != filterCollection.end(); iter++)
lbajardsilogic@223 52 {
lbajardsilogic@223 53 PropertyContainer* filterElt = *iter;
lbajardsilogic@223 54 emit newFilterAdded(filterElt);
lbajardsilogic@223 55 }
lbajardsilogic@224 56
lbajardsilogic@224 57 connect(filter, SIGNAL(propertyContainerRemoved(QString)),
lbajardsilogic@224 58 this, SIGNAL(filterRemoved(QString)));
lbajardsilogic@79 59 }
lbajardsilogic@79 60
lbajardsilogic@191 61 void FilterStack::putInput(float **input, size_t samples)
lbajardsilogic@191 62 {
lbajardsilogic@191 63 //only process the first filter, should pass in all filters !!!
lbajardsilogic@191 64 std::map<int, Filter *>::iterator iter = m_filters.begin();
lbajardsilogic@191 65
lbajardsilogic@191 66 if (iter != m_filters.end())
lbajardsilogic@191 67 {
lbajardsilogic@191 68 Filter * filter = iter->second;
lbajardsilogic@191 69 if(filter->isFilterEnabled()){
lbajardsilogic@191 70 filter->putInput(input, samples);
lbajardsilogic@191 71 }
lbajardsilogic@191 72 }
lbajardsilogic@191 73 }
lbajardsilogic@191 74
lbajardsilogic@191 75 void FilterStack::getOutput(float **output, size_t samples)
lbajardsilogic@191 76 {
lbajardsilogic@191 77 //only process the first filter, should pass in all filters !!!
lbajardsilogic@191 78 std::map<int, Filter *>::iterator iter = m_filters.begin();
lbajardsilogic@191 79
lbajardsilogic@191 80 if (iter != m_filters.end())
lbajardsilogic@191 81 {
lbajardsilogic@191 82 Filter * filter = iter->second;
lbajardsilogic@191 83 if(filter->isFilterEnabled()){
lbajardsilogic@191 84 filter->getOutput(output, samples);
lbajardsilogic@191 85 }
lbajardsilogic@191 86 }
lbajardsilogic@191 87 }
lbajardsilogic@191 88
lbajardsilogic@191 89 QString FilterStack::getUniqueFilterName(QString candidate)
lbajardsilogic@191 90 {
lbajardsilogic@191 91 for (int count = 1; ; ++count) {
lbajardsilogic@191 92
lbajardsilogic@191 93 QString adjusted =
lbajardsilogic@191 94 (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) :
lbajardsilogic@191 95 candidate);
lbajardsilogic@191 96
lbajardsilogic@191 97 bool duplicate = false;
lbajardsilogic@191 98
lbajardsilogic@191 99 for (std::map<int, Filter *>::iterator i = m_filters.begin(); i != m_filters.end(); ++i) {
lbajardsilogic@191 100 Filter * filter = i->second;
lbajardsilogic@191 101 if (filter->objectName() == adjusted) {
lbajardsilogic@191 102 duplicate = true;
lbajardsilogic@191 103 break;
lbajardsilogic@191 104 }
lbajardsilogic@191 105 }
lbajardsilogic@191 106
lbajardsilogic@191 107 if (!duplicate) return adjusted;
lbajardsilogic@191 108 }
lbajardsilogic@191 109 }
lbajardsilogic@191 110
lbajardsilogic@191 111 void FilterStack::removeFilter(QString &name)
lbajardsilogic@191 112 {
lbajardsilogic@191 113 std::map<int, Filter *>::iterator iter;
lbajardsilogic@191 114
lbajardsilogic@191 115 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
lbajardsilogic@191 116 {
lbajardsilogic@191 117 Filter * filter = iter->second;
lbajardsilogic@191 118 if (filter->objectName() == name)
lbajardsilogic@191 119 {
lbajardsilogic@191 120 delete filter;
lbajardsilogic@191 121 m_filters.erase(iter);
lbajardsilogic@191 122 emit filterRemoved(name);
lbajardsilogic@191 123 filter = 0;
lbajardsilogic@191 124 return;
lbajardsilogic@191 125 }
lbajardsilogic@191 126 }
lbajardsilogic@191 127 }
lbajardsilogic@191 128
lbajardsilogic@191 129 void FilterStack::removeAllFilters()
lbajardsilogic@191 130 {
lbajardsilogic@191 131 while (!m_filters.empty())
lbajardsilogic@191 132 {
lbajardsilogic@191 133 Filter * filter = m_filters.begin()->second;
lbajardsilogic@191 134 QString filterName(filter->objectName());
lbajardsilogic@191 135 removeFilter(filterName);
lbajardsilogic@191 136 }
lbajardsilogic@191 137 m_filters.clear();
lbajardsilogic@191 138 m_count = 0;
lbajardsilogic@191 139 }
lbajardsilogic@191 140
lbajardsilogic@191 141 size_t FilterStack::getRequiredInputSamples(size_t outputSamplesNeeded)
lbajardsilogic@191 142 {
lbajardsilogic@191 143 size_t max = 0;
lbajardsilogic@191 144
lbajardsilogic@191 145 std::map<int, Filter *>::iterator iter;
lbajardsilogic@191 146
lbajardsilogic@191 147 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
lbajardsilogic@191 148 {
lbajardsilogic@191 149 Filter * filter = iter->second;
lbajardsilogic@191 150 size_t required = filter->getRequiredInputSamples(outputSamplesNeeded);
lbajardsilogic@191 151 if ( (required > max) && (filter->isFilterEnabled()) )
lbajardsilogic@191 152 {
lbajardsilogic@191 153 max = required;
lbajardsilogic@191 154 }
lbajardsilogic@191 155 }
lbajardsilogic@191 156 return max;
lbajardsilogic@191 157 }
lbajardsilogic@191 158
lbajardsilogic@191 159 size_t FilterStack::getRequiredSkipSamples()
lbajardsilogic@191 160 {
lbajardsilogic@191 161 size_t skip = 1024;
lbajardsilogic@191 162
lbajardsilogic@191 163 std::map<int, Filter *>::iterator iter;
lbajardsilogic@191 164
lbajardsilogic@191 165 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
lbajardsilogic@191 166 {
lbajardsilogic@191 167 // find the time filter
lbajardsilogic@191 168 Filter * filter = iter->second;
lbajardsilogic@223 169 if (filter->objectName() == "DIT Filters")
lbajardsilogic@191 170 {
lbajardsilogic@223 171 MultiRealTimeFilter * timefilter = (MultiRealTimeFilter *) filter;
lbajardsilogic@191 172 if (filter->isFilterEnabled()) {
lbajardsilogic@191 173 skip = timefilter->getRequiredSkipSamples();
lbajardsilogic@191 174 }
lbajardsilogic@191 175 }
lbajardsilogic@191 176 }
lbajardsilogic@191 177 return skip;
lbajardsilogic@191 178 }
lbajardsilogic@191 179
lbajardsilogic@191 180 void FilterStack::setSourceChannelCount(size_t channel)
lbajardsilogic@191 181 {
lbajardsilogic@191 182 m_sourceChannelCount = channel;
lbajardsilogic@191 183
lbajardsilogic@191 184 std::map<int, Filter *>::iterator iter;
lbajardsilogic@191 185
lbajardsilogic@191 186 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
lbajardsilogic@191 187 {
lbajardsilogic@191 188 Filter * filter = iter->second;
lbajardsilogic@191 189 filter->setSourceChannelCount(m_sourceChannelCount);
lbajardsilogic@191 190 }
lbajardsilogic@191 191
lbajardsilogic@191 192 }
lbajardsilogic@191 193
lbajardsilogic@191 194 bool FilterStack::allowOtherFilter(QString &labelType)
lbajardsilogic@191 195 {
lbajardsilogic@191 196 Filter* filter = findFilter(labelType);
lbajardsilogic@191 197 if ( (filter) && (!filter->allowMultiple()) )
lbajardsilogic@191 198 {
lbajardsilogic@191 199 return false;
lbajardsilogic@191 200 }
lbajardsilogic@191 201
lbajardsilogic@191 202 return true;
lbajardsilogic@203 203 }
lbajardsilogic@203 204
lbajardsilogic@203 205 QString FilterStack::toEasaierXmlString(QString indent, QString extraAttributes) const
lbajardsilogic@203 206 {
lbajardsilogic@203 207 QString s;
lbajardsilogic@203 208
lbajardsilogic@203 209 s += indent + QString("<filters>\n");
lbajardsilogic@203 210
lbajardsilogic@203 211 std::map<int, Filter *>::const_iterator iter;
lbajardsilogic@203 212 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
lbajardsilogic@203 213 {
lbajardsilogic@203 214 Filter * filter = iter->second;
lbajardsilogic@203 215 s += filter->toEasaierXmlString(indent + indent, extraAttributes);
lbajardsilogic@203 216 }
lbajardsilogic@203 217
lbajardsilogic@203 218 s += indent + "</filters>\n";
lbajardsilogic@203 219
lbajardsilogic@203 220 return s;
lbajardsilogic@79 221 }