Mercurial > hg > svcore
comparison plugin/transform/RealTimeEffectModelTransformer.cpp @ 383:94fc0591ea43 1.2-stable
* merge from trunk (1.2 ended up being tracked from trunk, but we may want
this branch for fixes later)
author | Chris Cannam |
---|---|
date | Wed, 27 Feb 2008 10:32:45 +0000 |
parents | f620ce48c950 |
children |
comparison
equal
deleted
inserted
replaced
349:f39d33b0b265 | 383:94fc0591ea43 |
---|---|
23 #include "data/model/SparseTimeValueModel.h" | 23 #include "data/model/SparseTimeValueModel.h" |
24 #include "data/model/DenseTimeValueModel.h" | 24 #include "data/model/DenseTimeValueModel.h" |
25 #include "data/model/WritableWaveFileModel.h" | 25 #include "data/model/WritableWaveFileModel.h" |
26 #include "data/model/WaveFileModel.h" | 26 #include "data/model/WaveFileModel.h" |
27 | 27 |
28 #include "TransformFactory.h" | |
29 | |
28 #include <iostream> | 30 #include <iostream> |
29 | 31 |
30 RealTimeEffectModelTransformer::RealTimeEffectModelTransformer(Model *inputModel, | 32 RealTimeEffectModelTransformer::RealTimeEffectModelTransformer(Input in, |
31 QString pluginId, | 33 const Transform &transform) : |
32 const ExecutionContext &context, | 34 ModelTransformer(in, transform), |
33 QString configurationXml, | 35 m_plugin(0) |
34 QString units, | 36 { |
35 int output) : | 37 m_units = TransformFactory::getInstance()->getTransformUnits |
36 PluginTransformer(inputModel, context), | 38 (transform.getIdentifier()); |
37 m_pluginId(pluginId), | 39 m_outputNo = |
38 m_configurationXml(configurationXml), | 40 (transform.getOutput() == "A") ? -1 : transform.getOutput().toInt(); |
39 m_units(units), | 41 |
40 m_plugin(0), | 42 QString pluginId = transform.getPluginIdentifier(); |
41 m_outputNo(output) | 43 |
42 { | 44 if (!m_transform.getBlockSize()) m_transform.setBlockSize(1024); |
43 if (!m_context.blockSize) m_context.blockSize = 1024; | |
44 | 45 |
45 // std::cerr << "RealTimeEffectModelTransformer::RealTimeEffectModelTransformer: plugin " << pluginId.toStdString() << ", output " << output << std::endl; | 46 // std::cerr << "RealTimeEffectModelTransformer::RealTimeEffectModelTransformer: plugin " << pluginId.toStdString() << ", output " << output << std::endl; |
46 | 47 |
47 RealTimePluginFactory *factory = | 48 RealTimePluginFactory *factory = |
48 RealTimePluginFactory::instanceFor(pluginId); | 49 RealTimePluginFactory::instanceFor(pluginId); |
51 std::cerr << "RealTimeEffectModelTransformer: No factory available for plugin id \"" | 52 std::cerr << "RealTimeEffectModelTransformer: No factory available for plugin id \"" |
52 << pluginId.toStdString() << "\"" << std::endl; | 53 << pluginId.toStdString() << "\"" << std::endl; |
53 return; | 54 return; |
54 } | 55 } |
55 | 56 |
56 DenseTimeValueModel *input = getInput(); | 57 DenseTimeValueModel *input = getConformingInput(); |
57 if (!input) return; | 58 if (!input) return; |
58 | 59 |
59 m_plugin = factory->instantiatePlugin(pluginId, 0, 0, | 60 m_plugin = factory->instantiatePlugin(pluginId, 0, 0, |
60 m_input->getSampleRate(), | 61 input->getSampleRate(), |
61 m_context.blockSize, | 62 m_transform.getBlockSize(), |
62 input->getChannelCount()); | 63 input->getChannelCount()); |
63 | 64 |
64 if (!m_plugin) { | 65 if (!m_plugin) { |
65 std::cerr << "RealTimeEffectModelTransformer: Failed to instantiate plugin \"" | 66 std::cerr << "RealTimeEffectModelTransformer: Failed to instantiate plugin \"" |
66 << pluginId.toStdString() << "\"" << std::endl; | 67 << pluginId.toStdString() << "\"" << std::endl; |
67 return; | 68 return; |
68 } | 69 } |
69 | 70 |
70 if (configurationXml != "") { | 71 TransformFactory::getInstance()->setPluginParameters(m_transform, m_plugin); |
71 PluginXml(m_plugin).setParametersFromXml(configurationXml); | |
72 } | |
73 | 72 |
74 if (m_outputNo >= 0 && | 73 if (m_outputNo >= 0 && |
75 m_outputNo >= int(m_plugin->getControlOutputCount())) { | 74 m_outputNo >= int(m_plugin->getControlOutputCount())) { |
76 std::cerr << "RealTimeEffectModelTransformer: Plugin has fewer than desired " << m_outputNo << " control outputs" << std::endl; | 75 std::cerr << "RealTimeEffectModelTransformer: Plugin has fewer than desired " << m_outputNo << " control outputs" << std::endl; |
77 return; | 76 return; |
90 m_output = model; | 89 m_output = model; |
91 | 90 |
92 } else { | 91 } else { |
93 | 92 |
94 SparseTimeValueModel *model = new SparseTimeValueModel | 93 SparseTimeValueModel *model = new SparseTimeValueModel |
95 (input->getSampleRate(), m_context.blockSize, 0.0, 0.0, false); | 94 (input->getSampleRate(), m_transform.getBlockSize(), 0.0, 0.0, false); |
96 | 95 |
97 if (units != "") model->setScaleUnits(units); | 96 if (m_units != "") model->setScaleUnits(m_units); |
98 | 97 |
99 m_output = model; | 98 m_output = model; |
100 } | 99 } |
101 } | 100 } |
102 | 101 |
104 { | 103 { |
105 delete m_plugin; | 104 delete m_plugin; |
106 } | 105 } |
107 | 106 |
108 DenseTimeValueModel * | 107 DenseTimeValueModel * |
109 RealTimeEffectModelTransformer::getInput() | 108 RealTimeEffectModelTransformer::getConformingInput() |
110 { | 109 { |
111 DenseTimeValueModel *dtvm = | 110 DenseTimeValueModel *dtvm = |
112 dynamic_cast<DenseTimeValueModel *>(getInputModel()); | 111 dynamic_cast<DenseTimeValueModel *>(getInputModel()); |
113 if (!dtvm) { | 112 if (!dtvm) { |
114 std::cerr << "RealTimeEffectModelTransformer::getInput: WARNING: Input model is not conformable to DenseTimeValueModel" << std::endl; | 113 std::cerr << "RealTimeEffectModelTransformer::getConformingInput: WARNING: Input model is not conformable to DenseTimeValueModel" << std::endl; |
115 } | 114 } |
116 return dtvm; | 115 return dtvm; |
117 } | 116 } |
118 | 117 |
119 void | 118 void |
120 RealTimeEffectModelTransformer::run() | 119 RealTimeEffectModelTransformer::run() |
121 { | 120 { |
122 DenseTimeValueModel *input = getInput(); | 121 DenseTimeValueModel *input = getConformingInput(); |
123 if (!input) return; | 122 if (!input) return; |
124 | 123 |
125 while (!input->isReady()) { | 124 while (!input->isReady()) { |
126 if (dynamic_cast<WaveFileModel *>(input)) break; // no need to wait | 125 if (dynamic_cast<WaveFileModel *>(input)) break; // no need to wait |
127 std::cerr << "RealTimeEffectModelTransformer::run: Waiting for input model to be ready..." << std::endl; | 126 std::cerr << "RealTimeEffectModelTransformer::run: Waiting for input model to be ready..." << std::endl; |
134 | 133 |
135 if (stvm && (m_outputNo >= int(m_plugin->getControlOutputCount()))) return; | 134 if (stvm && (m_outputNo >= int(m_plugin->getControlOutputCount()))) return; |
136 | 135 |
137 size_t sampleRate = input->getSampleRate(); | 136 size_t sampleRate = input->getSampleRate(); |
138 size_t channelCount = input->getChannelCount(); | 137 size_t channelCount = input->getChannelCount(); |
139 if (!wwfm && m_context.channel != -1) channelCount = 1; | 138 if (!wwfm && m_input.getChannel() != -1) channelCount = 1; |
140 | 139 |
141 long blockSize = m_plugin->getBufferSize(); | 140 long blockSize = m_plugin->getBufferSize(); |
142 | 141 |
143 float **inbufs = m_plugin->getAudioInputBuffers(); | 142 float **inbufs = m_plugin->getAudioInputBuffers(); |
144 | 143 |
145 long startFrame = m_input->getStartFrame(); | 144 long startFrame = m_input.getModel()->getStartFrame(); |
146 long endFrame = m_input->getEndFrame(); | 145 long endFrame = m_input.getModel()->getEndFrame(); |
147 | 146 |
148 long contextStart = m_context.startFrame; | 147 RealTime contextStartRT = m_transform.getStartTime(); |
149 long contextDuration = m_context.duration; | 148 RealTime contextDurationRT = m_transform.getDuration(); |
149 | |
150 long contextStart = | |
151 RealTime::realTime2Frame(contextStartRT, sampleRate); | |
152 | |
153 long contextDuration = | |
154 RealTime::realTime2Frame(contextDurationRT, sampleRate); | |
150 | 155 |
151 if (contextStart == 0 || contextStart < startFrame) { | 156 if (contextStart == 0 || contextStart < startFrame) { |
152 contextStart = startFrame; | 157 contextStart = startFrame; |
153 } | 158 } |
154 | 159 |
177 long got = 0; | 182 long got = 0; |
178 | 183 |
179 if (channelCount == 1) { | 184 if (channelCount == 1) { |
180 if (inbufs && inbufs[0]) { | 185 if (inbufs && inbufs[0]) { |
181 got = input->getData | 186 got = input->getData |
182 (m_context.channel, blockFrame, blockSize, inbufs[0]); | 187 (m_input.getChannel(), blockFrame, blockSize, inbufs[0]); |
183 while (got < blockSize) { | 188 while (got < blockSize) { |
184 inbufs[0][got++] = 0.0; | 189 inbufs[0][got++] = 0.0; |
185 } | 190 } |
186 } | 191 } |
187 for (size_t ch = 1; ch < m_plugin->getAudioInputCount(); ++ch) { | 192 for (size_t ch = 1; ch < m_plugin->getAudioInputCount(); ++ch) { |
188 for (long i = 0; i < blockSize; ++i) { | 193 for (long i = 0; i < blockSize; ++i) { |
189 inbufs[ch][i] = inbufs[0][i]; | 194 inbufs[ch][i] = inbufs[0][i]; |
190 } | 195 } |
191 } | 196 } |
192 } else { | 197 } else { |
193 for (size_t ch = 0; ch < channelCount; ++ch) { | 198 got = input->getData(0, channelCount - 1, |
194 if (inbufs && inbufs[ch]) { | 199 blockFrame, blockSize, |
195 got = input->getData | 200 inbufs); |
196 (ch, blockFrame, blockSize, inbufs[ch]); | 201 while (got < blockSize) { |
197 while (got < blockSize) { | 202 for (size_t ch = 0; ch < channelCount; ++ch) { |
198 inbufs[ch][got++] = 0.0; | 203 inbufs[ch][got] = 0.0; |
199 } | 204 } |
200 } | 205 ++got; |
201 } | 206 } |
202 for (size_t ch = channelCount; ch < m_plugin->getAudioInputCount(); ++ch) { | 207 for (size_t ch = channelCount; ch < m_plugin->getAudioInputCount(); ++ch) { |
203 for (long i = 0; i < blockSize; ++i) { | 208 for (long i = 0; i < blockSize; ++i) { |
204 inbufs[ch][i] = inbufs[ch % channelCount][i]; | 209 inbufs[ch][i] = inbufs[ch % channelCount][i]; |
205 } | 210 } |