annotate sv/filter/FilterStack.cpp @ 107:c3ac34b2e45b

correct bugs after DAN review
author lbajardsilogic
date Thu, 13 Sep 2007 12:42:44 +0000
parents d94ee3e8dfe1
children b3df8b8185db
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@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 }