Mercurial > hg > svcore
view plugin/transform/PluginTransformer.cpp @ 328:21bd032ae791
* Introduce new Transform class which contains data necessary to describe the
context for a plugin -- the plugin's name and output, the step/block size
etc (formerly spread across ExecutionContext and TransformFactory). Other
code hasn't been updated to use this yet.
* Rename existing Transform stuff to Transformers (because they run Transforms)
I'm still not 100% sure about this change, don't rely on it.
author | Chris Cannam |
---|---|
date | Mon, 05 Nov 2007 15:31:06 +0000 |
parents | plugin/transform/PluginTransform.cpp@32e50b620a6c |
children | f620ce48c950 |
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "PluginTransformer.h" #include "vamp-sdk/PluginHostAdapter.h" #include "vamp-sdk/hostext/PluginWrapper.h" PluginTransformer::PluginTransformer(Model *inputModel, const ExecutionContext &context) : Transformer(inputModel), m_context(context) { } PluginTransformer::ExecutionContext::ExecutionContext(int _c, size_t _bs) : channel(_c), domain(Vamp::Plugin::TimeDomain), stepSize(_bs ? _bs : 1024), blockSize(_bs ? _bs : 1024), windowType(HanningWindow), startFrame(0), duration(0), sampleRate(0) { } PluginTransformer::ExecutionContext::ExecutionContext(int _c, size_t _ss, size_t _bs, WindowType _wt) : channel(_c), domain(Vamp::Plugin::FrequencyDomain), stepSize(_ss ? _ss : (_bs ? _bs / 2 : 512)), blockSize(_bs ? _bs : 1024), windowType(_wt), startFrame(0), duration(0), sampleRate(0) { } PluginTransformer::ExecutionContext::ExecutionContext(int _c, const Vamp::PluginBase *_plugin) : channel(_c), domain(Vamp::Plugin::TimeDomain), stepSize(0), blockSize(0), windowType(HanningWindow), startFrame(0), duration(0), sampleRate(0) { makeConsistentWithPlugin(_plugin); } bool PluginTransformer::ExecutionContext::operator==(const ExecutionContext &c) { return (c.channel == channel && c.domain == domain && c.stepSize == stepSize && c.blockSize == blockSize && c.windowType == windowType && c.startFrame == startFrame && c.duration == duration && c.sampleRate == sampleRate); } void PluginTransformer::ExecutionContext::makeConsistentWithPlugin(const Vamp::PluginBase *_plugin) { const Vamp::Plugin *vp = dynamic_cast<const Vamp::Plugin *>(_plugin); if (!vp) { // std::cerr << "makeConsistentWithPlugin: not a Vamp::Plugin" << std::endl; vp = dynamic_cast<const Vamp::PluginHostAdapter *>(_plugin); //!!! why? } if (!vp) { // std::cerr << "makeConsistentWithPlugin: not a Vamp::PluginHostAdapter" << std::endl; vp = dynamic_cast<const Vamp::HostExt::PluginWrapper *>(_plugin); //!!! no, I mean really why? } if (!vp) { // std::cerr << "makeConsistentWithPlugin: not a Vamp::HostExt::PluginWrapper" << std::endl; } if (!vp) { domain = Vamp::Plugin::TimeDomain; if (!stepSize) { if (!blockSize) blockSize = 1024; stepSize = blockSize; } else { if (!blockSize) blockSize = stepSize; } } else { domain = vp->getInputDomain(); if (!stepSize) stepSize = vp->getPreferredStepSize(); if (!blockSize) blockSize = vp->getPreferredBlockSize(); if (!blockSize) blockSize = 1024; if (!stepSize) { if (domain == Vamp::Plugin::FrequencyDomain) { // std::cerr << "frequency domain, step = " << blockSize/2 << std::endl; stepSize = blockSize/2; } else { // std::cerr << "time domain, step = " << blockSize/2 << std::endl; stepSize = blockSize; } } } }