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 } |