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