annotate sv/filter/FilterStack.cpp @ 97:486e44e12a5d

this version use only one servlet. Data is provide by stream capacity.
author benoitrigolleau
date Tue, 10 Jul 2007 16:01:13 +0000
parents 5060939ca69d
children d94ee3e8dfe1
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@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 }