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@79
|
16 FilterStack::FilterStack() : QObject()
|
lbajardsilogic@79
|
17 {}
|
lbajardsilogic@79
|
18
|
lbajardsilogic@79
|
19 FilterStack::~FilterStack()
|
lbajardsilogic@79
|
20 {
|
lbajardsilogic@79
|
21 std::map<int, Filter *>::iterator iter;
|
lbajardsilogic@79
|
22
|
lbajardsilogic@79
|
23 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
|
lbajardsilogic@79
|
24 {
|
lbajardsilogic@79
|
25 Filter * filter = iter->second;
|
lbajardsilogic@79
|
26 delete filter;
|
lbajardsilogic@79
|
27 }
|
lbajardsilogic@79
|
28 m_filters.clear();
|
lbajardsilogic@79
|
29 }
|
lbajardsilogic@79
|
30
|
lbajardsilogic@79
|
31 void FilterStack::addFilter(Filter * filter)
|
lbajardsilogic@79
|
32 {
|
lbajardsilogic@79
|
33 m_filters[m_count] = filter;
|
lbajardsilogic@84
|
34 filter->setSourceChannelCount(m_sourceChannelCount);
|
lbajardsilogic@79
|
35 m_count++;
|
lbajardsilogic@79
|
36 emit newFilterAdded(filter);
|
lbajardsilogic@79
|
37 }
|
lbajardsilogic@79
|
38
|
lbajardsilogic@79
|
39 void FilterStack::putInput(float **input, size_t samples)
|
lbajardsilogic@79
|
40 {
|
lbajardsilogic@79
|
41 //only process the first filter, should pass in all filters !!!
|
lbajardsilogic@79
|
42 std::map<int, Filter *>::iterator iter = m_filters.begin();
|
lbajardsilogic@79
|
43
|
lbajardsilogic@79
|
44 if (iter != m_filters.end())
|
lbajardsilogic@79
|
45 {
|
lbajardsilogic@79
|
46 Filter * filter = iter->second;
|
benoitrigolleau@88
|
47 if(filter->isFilterEnabled()){
|
benoitrigolleau@88
|
48 filter->putInput(input, samples);
|
benoitrigolleau@88
|
49 }
|
lbajardsilogic@79
|
50 }
|
lbajardsilogic@79
|
51 }
|
lbajardsilogic@79
|
52
|
lbajardsilogic@79
|
53 void FilterStack::getOutput(float **output, size_t samples)
|
lbajardsilogic@79
|
54 {
|
lbajardsilogic@79
|
55 //only process the first filter, should pass in all filters !!!
|
lbajardsilogic@79
|
56 std::map<int, Filter *>::iterator iter = m_filters.begin();
|
lbajardsilogic@79
|
57
|
lbajardsilogic@79
|
58 if (iter != m_filters.end())
|
lbajardsilogic@79
|
59 {
|
lbajardsilogic@79
|
60 Filter * filter = iter->second;
|
benoitrigolleau@88
|
61 if(filter->isFilterEnabled()){
|
benoitrigolleau@88
|
62 filter->getOutput(output, samples);
|
benoitrigolleau@88
|
63 }
|
lbajardsilogic@79
|
64 }
|
lbajardsilogic@79
|
65 }
|
lbajardsilogic@79
|
66
|
lbajardsilogic@79
|
67 QString FilterStack::getUniqueFilterName(QString candidate)
|
lbajardsilogic@79
|
68 {
|
lbajardsilogic@79
|
69 for (int count = 1; ; ++count) {
|
lbajardsilogic@79
|
70
|
lbajardsilogic@79
|
71 QString adjusted =
|
lbajardsilogic@79
|
72 (count > 1 ? QString("%1 <%2>").arg(candidate).arg(count) :
|
lbajardsilogic@79
|
73 candidate);
|
lbajardsilogic@79
|
74
|
lbajardsilogic@79
|
75 bool duplicate = false;
|
lbajardsilogic@79
|
76
|
lbajardsilogic@79
|
77 for (std::map<int, Filter *>::iterator i = m_filters.begin(); i != m_filters.end(); ++i) {
|
lbajardsilogic@79
|
78 Filter * filter = i->second;
|
lbajardsilogic@79
|
79 if (filter->objectName() == adjusted) {
|
lbajardsilogic@79
|
80 duplicate = true;
|
lbajardsilogic@79
|
81 break;
|
lbajardsilogic@79
|
82 }
|
lbajardsilogic@79
|
83 }
|
lbajardsilogic@79
|
84
|
lbajardsilogic@79
|
85 if (!duplicate) return adjusted;
|
lbajardsilogic@79
|
86 }
|
lbajardsilogic@79
|
87 }
|
lbajardsilogic@79
|
88
|
lbajardsilogic@79
|
89 void FilterStack::removeFilter(QString &name)
|
lbajardsilogic@79
|
90 {
|
lbajardsilogic@79
|
91 std::map<int, Filter *>::iterator iter;
|
lbajardsilogic@79
|
92
|
lbajardsilogic@79
|
93 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
|
lbajardsilogic@79
|
94 {
|
lbajardsilogic@79
|
95 Filter * filter = iter->second;
|
lbajardsilogic@79
|
96 if (filter->objectName() == name)
|
lbajardsilogic@79
|
97 {
|
lbajardsilogic@79
|
98 delete filter;
|
lbajardsilogic@79
|
99 m_filters.erase(iter);
|
lbajardsilogic@79
|
100 emit filterRemoved(name);
|
lbajardsilogic@79
|
101 return;
|
lbajardsilogic@79
|
102 }
|
lbajardsilogic@79
|
103 }
|
lbajardsilogic@79
|
104 }
|
lbajardsilogic@79
|
105
|
lbajardsilogic@79
|
106 void FilterStack::removeAllFilters()
|
lbajardsilogic@79
|
107 {
|
lbajardsilogic@79
|
108 while (!m_filters.empty())
|
lbajardsilogic@79
|
109 {
|
lbajardsilogic@79
|
110 Filter * filter = m_filters.begin()->second;
|
lbajardsilogic@79
|
111 removeFilter(filter->objectName());
|
lbajardsilogic@79
|
112 }
|
lbajardsilogic@82
|
113 }
|
lbajardsilogic@82
|
114
|
lbajardsilogic@82
|
115 size_t FilterStack::getRequiredInputSamples(size_t outputSamplesNeeded)
|
lbajardsilogic@82
|
116 {
|
lbajardsilogic@82
|
117 size_t max = 0;
|
lbajardsilogic@82
|
118
|
lbajardsilogic@82
|
119 std::map<int, Filter *>::iterator iter;
|
lbajardsilogic@82
|
120
|
lbajardsilogic@82
|
121 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
|
lbajardsilogic@82
|
122 {
|
lbajardsilogic@82
|
123 Filter * filter = iter->second;
|
lbajardsilogic@82
|
124 size_t required = filter->getRequiredInputSamples(outputSamplesNeeded);
|
lbajardsilogic@82
|
125 if (required > max)
|
lbajardsilogic@82
|
126 {
|
lbajardsilogic@82
|
127 max = required;
|
lbajardsilogic@82
|
128 }
|
lbajardsilogic@82
|
129 }
|
lbajardsilogic@82
|
130 return max;
|
lbajardsilogic@84
|
131 }
|
lbajardsilogic@84
|
132
|
lbajardsilogic@84
|
133 void FilterStack::setSourceChannelCount(size_t channel)
|
lbajardsilogic@84
|
134 {
|
lbajardsilogic@84
|
135 m_sourceChannelCount = channel;
|
lbajardsilogic@84
|
136
|
lbajardsilogic@84
|
137 std::map<int, Filter *>::iterator iter;
|
lbajardsilogic@84
|
138
|
lbajardsilogic@84
|
139 for (iter = m_filters.begin(); iter != m_filters.end(); iter++)
|
lbajardsilogic@84
|
140 {
|
lbajardsilogic@84
|
141 Filter * filter = iter->second;
|
lbajardsilogic@84
|
142 filter->setSourceChannelCount(m_sourceChannelCount);
|
lbajardsilogic@84
|
143 }
|
lbajardsilogic@84
|
144
|
lbajardsilogic@79
|
145 } |