comparison vamp-sdk/hostext/PluginBufferingAdapter.cpp @ 133:92ca8e401044

* PluginBufferingAdapter: Rewrite OneSamplePerStep to FixedSampleRate, not VariableSampleRate (so result is still dense); do not change FixedSampleRate to VariableSampleRate either; do not do the work of rewriting outputs that don't need to be rewritten
author cannam
date Thu, 20 Mar 2008 13:22:02 +0000
parents 08d8c8ee6097
children c1dce0b033cb
comparison
equal deleted inserted replaced
132:f5fff1c6f06d 133:92ca8e401044
227 vector<RingBuffer *> m_queue; 227 vector<RingBuffer *> m_queue;
228 float **m_buffers; 228 float **m_buffers;
229 float m_inputSampleRate; 229 float m_inputSampleRate;
230 RealTime m_timestamp; 230 RealTime m_timestamp;
231 bool m_unrun; 231 bool m_unrun;
232 OutputList m_outputs; 232 mutable OutputList m_outputs;
233 mutable std::map<int, bool> m_rewriteOutputTimes;
233 234
234 void processBlock(FeatureSet& allFeatureSets, RealTime timestamp); 235 void processBlock(FeatureSet& allFeatureSets, RealTime timestamp);
235 }; 236 };
236 237
237 PluginBufferingAdapter::PluginBufferingAdapter(Plugin *plugin) : 238 PluginBufferingAdapter::PluginBufferingAdapter(Plugin *plugin) :
287 m_buffers(0), 288 m_buffers(0),
288 m_inputSampleRate(inputSampleRate), 289 m_inputSampleRate(inputSampleRate),
289 m_timestamp(RealTime::zeroTime), 290 m_timestamp(RealTime::zeroTime),
290 m_unrun(true) 291 m_unrun(true)
291 { 292 {
292 m_outputs = plugin->getOutputDescriptors(); 293 (void)getOutputDescriptors(); // set up m_outputs and m_rewriteOutputTimes
293 } 294 }
294 295
295 PluginBufferingAdapter::Impl::~Impl() 296 PluginBufferingAdapter::Impl::~Impl()
296 { 297 {
297 // the adapter will delete the plugin 298 // the adapter will delete the plugin
363 } 364 }
364 365
365 PluginBufferingAdapter::OutputList 366 PluginBufferingAdapter::OutputList
366 PluginBufferingAdapter::Impl::getOutputDescriptors() const 367 PluginBufferingAdapter::Impl::getOutputDescriptors() const
367 { 368 {
368 OutputList outs = m_plugin->getOutputDescriptors(); 369 if (m_outputs.empty()) {
370 m_outputs = m_plugin->getOutputDescriptors();
371 }
372
373 PluginBufferingAdapter::OutputList outs;
374
369 for (size_t i = 0; i < outs.size(); ++i) { 375 for (size_t i = 0; i < outs.size(); ++i) {
370 if (outs[i].sampleType == OutputDescriptor::OneSamplePerStep) { 376
377 switch (outs[i].sampleType) {
378
379 case OutputDescriptor::OneSamplePerStep:
380 outs[i].sampleType = OutputDescriptor::FixedSampleRate;
371 outs[i].sampleRate = 1.f / m_stepSize; 381 outs[i].sampleRate = 1.f / m_stepSize;
372 } 382 m_rewriteOutputTimes[i] = true;
373 outs[i].sampleType = OutputDescriptor::VariableSampleRate; 383 break;
374 } 384
385 case OutputDescriptor::FixedSampleRate:
386 if (outs[i].sampleRate == 0.f) {
387 outs[i].sampleRate = 1.f / m_stepSize;
388 }
389 // We actually only need to rewrite output times for
390 // features that don't have timestamps already, but we
391 // can't tell from here whether our features will have
392 // timestamps or not
393 m_rewriteOutputTimes[i] = true;
394 break;
395
396 case OutputDescriptor::VariableSampleRate:
397 m_rewriteOutputTimes[i] = false;
398 break;
399 }
400 }
401
375 return outs; 402 return outs;
376 } 403 }
377 404
378 void 405 void
379 PluginBufferingAdapter::Impl::reset() 406 PluginBufferingAdapter::Impl::reset()
461 m_queue[i]->peek(m_buffers[i], m_blockSize); 488 m_queue[i]->peek(m_buffers[i], m_blockSize);
462 } 489 }
463 490
464 FeatureSet featureSet = m_plugin->process(m_buffers, m_timestamp); 491 FeatureSet featureSet = m_plugin->process(m_buffers, m_timestamp);
465 492
466 for (map<int, FeatureList>::iterator iter = featureSet.begin(); 493 for (FeatureSet::iterator iter = featureSet.begin();
467 iter != featureSet.end(); ++iter) { 494 iter != featureSet.end(); ++iter) {
495
496 int outputNo = iter->first;
497
498 if (m_rewriteOutputTimes[outputNo]) {
499
500 // Make sure the timestamp is always set
468 501
469 FeatureList featureList = iter->second; 502 FeatureList featureList = iter->second;
470 int outputNo = iter->first;
471 503
472 for (size_t i = 0; i < featureList.size(); ++i) { 504 for (size_t i = 0; i < featureList.size(); ++i) {
473 505
474 // make sure the timestamp is set 506 switch (m_outputs[outputNo].sampleType) {
475 switch (m_outputs[outputNo].sampleType) { 507
476 508 case OutputDescriptor::OneSamplePerStep:
477 case OutputDescriptor::OneSamplePerStep: 509 // use our internal timestamp, always
478 // use our internal timestamp - OK???? 510 featureList[i].timestamp = m_timestamp;
479 featureList[i].timestamp = m_timestamp; 511 featureList[i].hasTimestamp = true;
480 break; 512 break;
481 513
482 case OutputDescriptor::FixedSampleRate: 514 case OutputDescriptor::FixedSampleRate:
483 // use our internal timestamp 515 // use our internal timestamp if feature lacks one
484 featureList[i].timestamp = m_timestamp; 516 if (!featureList[i].hasTimestamp) {
485 break; 517 featureList[i].timestamp = m_timestamp;
486 518 featureList[i].hasTimestamp = true;
487 case OutputDescriptor::VariableSampleRate: 519 }
488 break; // plugin must set timestamp 520 break;
489 521
490 default: 522 case OutputDescriptor::VariableSampleRate:
491 break; 523 break; // plugin must set timestamp
492 } 524
493 525 default:
494 allFeatureSets[outputNo].push_back(featureList[i]); 526 break;
527 }
528
529 allFeatureSets[outputNo].push_back(featureList[i]);
530 }
531 } else {
532 for (size_t i = 0; i < iter->second.size(); ++i) {
533 allFeatureSets[outputNo].push_back(iter->second[i]);
534 }
495 } 535 }
496 } 536 }
497 537
498 // step forward 538 // step forward
499 539