annotate plugin/FeatureExtractionPluginAdapter.cpp @ 65:e1aad27029e3

* Add stub for item-edit dialog (for editing properties of an item on double- click) -- doesn't actually do anything yet * Add code to invoke said non-working item-edit dialog on double-click in time-value, time-instants and note layers * Add overlay mode (no text, basic text, all text)
author Chris Cannam
date Thu, 30 Mar 2006 15:00:22 +0000
parents 3086ff194ea0
children
rev   line source
Chris@58 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@58 2
Chris@58 3 /*
Chris@60 4 Sonic Visualiser
Chris@60 5 An audio file viewer and annotation editor.
Chris@60 6 Centre for Digital Music, Queen Mary, University of London.
Chris@60 7 This file copyright 2006 Chris Cannam.
Chris@58 8
Chris@60 9 This program is free software; you can redistribute it and/or
Chris@60 10 modify it under the terms of the GNU General Public License as
Chris@60 11 published by the Free Software Foundation; either version 2 of the
Chris@60 12 License, or (at your option) any later version. See the file
Chris@60 13 COPYING included with this distribution for more information.
Chris@58 14 */
Chris@58 15
Chris@58 16 #include "FeatureExtractionPluginAdapter.h"
Chris@58 17
Chris@60 18 FeatureExtractionPluginAdapterBase::FeatureExtractionPluginAdapterBase() :
Chris@60 19 m_populated(false)
Chris@58 20 {
Chris@58 21 }
Chris@58 22
Chris@60 23 const SVPPluginDescriptor *
Chris@60 24 FeatureExtractionPluginAdapterBase::getDescriptor()
Chris@60 25 {
Chris@60 26 if (m_populated) return &m_descriptor;
Chris@60 27
Chris@60 28 FeatureExtractionPlugin *plugin = createPlugin(48000);
Chris@60 29
Chris@60 30 m_parameters = plugin->getParameterDescriptors();
Chris@60 31 m_programs = plugin->getPrograms();
Chris@60 32
Chris@60 33 m_descriptor.name = strdup(plugin->getName().c_str());
Chris@60 34 m_descriptor.description = strdup(plugin->getDescription().c_str());
Chris@60 35 m_descriptor.maker = strdup(plugin->getMaker().c_str());
Chris@60 36 m_descriptor.pluginVersion = plugin->getPluginVersion();
Chris@60 37 m_descriptor.copyright = strdup(plugin->getCopyright().c_str());
Chris@60 38
Chris@60 39 m_descriptor.parameterCount = m_parameters.size();
Chris@60 40 m_descriptor.parameters = (const SVPParameterDescriptor **)
Chris@60 41 malloc(m_parameters.size() * sizeof(SVPParameterDescriptor));
Chris@60 42
Chris@60 43 for (unsigned int i = 0; i < m_parameters.size(); ++i) {
Chris@60 44 SVPParameterDescriptor *desc = (SVPParameterDescriptor *)
Chris@60 45 malloc(sizeof(SVPParameterDescriptor));
Chris@60 46 desc->name = strdup(m_parameters[i].name.c_str());
Chris@60 47 desc->description = strdup(m_parameters[i].description.c_str());
Chris@60 48 desc->unit = strdup(m_parameters[i].unit.c_str());
Chris@60 49 desc->minValue = m_parameters[i].minValue;
Chris@60 50 desc->maxValue = m_parameters[i].maxValue;
Chris@60 51 desc->defaultValue = m_parameters[i].defaultValue;
Chris@60 52 desc->isQuantized = m_parameters[i].isQuantized;
Chris@60 53 desc->quantizeStep = m_parameters[i].quantizeStep;
Chris@60 54 m_descriptor.parameters[i] = desc;
Chris@60 55 }
Chris@60 56
Chris@60 57 m_descriptor.programCount = m_programs.size();
Chris@60 58 m_descriptor.programs = (const char **)
Chris@60 59 malloc(m_programs.size() * sizeof(const char *));
Chris@60 60
Chris@60 61 for (unsigned int i = 0; i < m_programs.size(); ++i) {
Chris@60 62 m_descriptor.programs[i] = strdup(m_programs[i].c_str());
Chris@60 63 }
Chris@60 64
Chris@60 65 m_descriptor.instantiate = svpInstantiate;
Chris@60 66 m_descriptor.cleanup = svpCleanup;
Chris@60 67 m_descriptor.initialise = svpInitialise;
Chris@60 68 m_descriptor.reset = svpReset;
Chris@60 69 m_descriptor.getParameter = svpGetParameter;
Chris@60 70 m_descriptor.setParameter = svpSetParameter;
Chris@60 71 m_descriptor.getCurrentProgram = svpGetCurrentProgram;
Chris@60 72 m_descriptor.selectProgram = svpSelectProgram;
Chris@60 73 m_descriptor.getPreferredStepSize = svpGetPreferredStepSize;
Chris@60 74 m_descriptor.getPreferredBlockSize = svpGetPreferredBlockSize;
Chris@60 75 m_descriptor.getMinChannelCount = svpGetMinChannelCount;
Chris@60 76 m_descriptor.getMaxChannelCount = svpGetMaxChannelCount;
Chris@60 77 m_descriptor.getOutputCount = svpGetOutputCount;
Chris@60 78 m_descriptor.getOutputDescriptor = svpGetOutputDescriptor;
Chris@60 79 m_descriptor.releaseOutputDescriptor = svpReleaseOutputDescriptor;
Chris@60 80 m_descriptor.process = svpProcess;
Chris@60 81 m_descriptor.getRemainingFeatures = svpGetRemainingFeatures;
Chris@60 82 m_descriptor.releaseFeatureSet = svpReleaseFeatureSet;
Chris@60 83
Chris@60 84 m_adapterMap[&m_descriptor] = this;
Chris@60 85
Chris@60 86 delete plugin;
Chris@60 87
Chris@60 88 m_populated = true;
Chris@60 89 return &m_descriptor;
Chris@60 90 }
Chris@60 91
Chris@60 92 FeatureExtractionPluginAdapterBase::~FeatureExtractionPluginAdapterBase()
Chris@60 93 {
Chris@60 94 if (!m_populated) return;
Chris@60 95
Chris@60 96 free((void *)m_descriptor.name);
Chris@60 97 free((void *)m_descriptor.description);
Chris@60 98 free((void *)m_descriptor.maker);
Chris@60 99 free((void *)m_descriptor.copyright);
Chris@60 100
Chris@60 101 for (unsigned int i = 0; i < m_descriptor.parameterCount; ++i) {
Chris@60 102 const SVPParameterDescriptor *desc = m_descriptor.parameters[i];
Chris@60 103 free((void *)desc->name);
Chris@60 104 free((void *)desc->description);
Chris@60 105 free((void *)desc->unit);
Chris@60 106 }
Chris@60 107 free((void *)m_descriptor.parameters);
Chris@60 108
Chris@60 109 for (unsigned int i = 0; i < m_descriptor.programCount; ++i) {
Chris@60 110 free((void *)m_descriptor.programs[i]);
Chris@60 111 }
Chris@60 112 free((void *)m_descriptor.programs);
Chris@60 113
Chris@60 114 m_adapterMap.erase(&m_descriptor);
Chris@60 115 }
Chris@60 116
Chris@60 117 FeatureExtractionPluginAdapterBase *
Chris@60 118 FeatureExtractionPluginAdapterBase::lookupAdapter(SVPPluginHandle handle)
Chris@60 119 {
Chris@60 120 AdapterMap::const_iterator i = m_adapterMap.find(handle);
Chris@60 121 if (i == m_adapterMap.end()) return 0;
Chris@60 122 return i->second;
Chris@60 123 }
Chris@60 124
Chris@60 125 SVPPluginHandle
Chris@60 126 FeatureExtractionPluginAdapterBase::svpInstantiate(const SVPPluginDescriptor *desc,
Chris@60 127 float inputSampleRate)
Chris@60 128 {
Chris@60 129 if (m_adapterMap.find(desc) == m_adapterMap.end()) return 0;
Chris@60 130 FeatureExtractionPluginAdapterBase *adapter = m_adapterMap[desc];
Chris@60 131 if (desc != &adapter->m_descriptor) return 0;
Chris@60 132
Chris@60 133 FeatureExtractionPlugin *plugin = adapter->createPlugin(inputSampleRate);
Chris@60 134 if (plugin) {
Chris@60 135 m_adapterMap[plugin] = adapter;
Chris@60 136 }
Chris@60 137
Chris@60 138 return plugin;
Chris@60 139 }
Chris@60 140
Chris@60 141 void
Chris@60 142 FeatureExtractionPluginAdapterBase::svpCleanup(SVPPluginHandle handle)
Chris@60 143 {
Chris@60 144 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 145 if (!adapter) {
Chris@60 146 delete ((FeatureExtractionPlugin *)handle);
Chris@60 147 return;
Chris@60 148 }
Chris@60 149 adapter->cleanup(((FeatureExtractionPlugin *)handle));
Chris@60 150 }
Chris@60 151
Chris@60 152 int
Chris@60 153 FeatureExtractionPluginAdapterBase::svpInitialise(SVPPluginHandle handle,
Chris@60 154 unsigned int channels,
Chris@60 155 unsigned int stepSize,
Chris@60 156 unsigned int blockSize)
Chris@60 157 {
Chris@60 158 bool result = ((FeatureExtractionPlugin *)handle)->initialise
Chris@60 159 (channels, stepSize, blockSize);
Chris@60 160 return result ? 1 : 0;
Chris@60 161 }
Chris@60 162
Chris@60 163 void
Chris@60 164 FeatureExtractionPluginAdapterBase::svpReset(SVPPluginHandle handle)
Chris@60 165 {
Chris@60 166 ((FeatureExtractionPlugin *)handle)->reset();
Chris@60 167 }
Chris@60 168
Chris@60 169 float
Chris@60 170 FeatureExtractionPluginAdapterBase::svpGetParameter(SVPPluginHandle handle,
Chris@60 171 int param)
Chris@60 172 {
Chris@60 173 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 174 if (!adapter) return 0.0;
Chris@60 175 FeatureExtractionPlugin::ParameterList &list = adapter->m_parameters;
Chris@60 176 return ((FeatureExtractionPlugin *)handle)->getParameter(list[param].name);
Chris@60 177 }
Chris@60 178
Chris@60 179 void
Chris@60 180 FeatureExtractionPluginAdapterBase::svpSetParameter(SVPPluginHandle handle,
Chris@60 181 int param, float value)
Chris@60 182 {
Chris@60 183 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 184 if (!adapter) return;
Chris@60 185 FeatureExtractionPlugin::ParameterList &list = adapter->m_parameters;
Chris@60 186 ((FeatureExtractionPlugin *)handle)->setParameter(list[param].name, value);
Chris@60 187 }
Chris@60 188
Chris@60 189 unsigned int
Chris@60 190 FeatureExtractionPluginAdapterBase::svpGetCurrentProgram(SVPPluginHandle handle)
Chris@60 191 {
Chris@60 192 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 193 if (!adapter) return 0;
Chris@60 194 FeatureExtractionPlugin::ProgramList &list = adapter->m_programs;
Chris@60 195 std::string program = ((FeatureExtractionPlugin *)handle)->getCurrentProgram();
Chris@60 196 for (unsigned int i = 0; i < list.size(); ++i) {
Chris@60 197 if (list[i] == program) return i;
Chris@60 198 }
Chris@60 199 return 0;
Chris@60 200 }
Chris@60 201
Chris@60 202 void
Chris@60 203 FeatureExtractionPluginAdapterBase::svpSelectProgram(SVPPluginHandle handle,
Chris@60 204 unsigned int program)
Chris@60 205 {
Chris@60 206 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 207 if (!adapter) return;
Chris@60 208 FeatureExtractionPlugin::ProgramList &list = adapter->m_programs;
Chris@60 209 ((FeatureExtractionPlugin *)handle)->selectProgram(list[program]);
Chris@60 210 }
Chris@60 211
Chris@60 212 unsigned int
Chris@60 213 FeatureExtractionPluginAdapterBase::svpGetPreferredStepSize(SVPPluginHandle handle)
Chris@60 214 {
Chris@60 215 return ((FeatureExtractionPlugin *)handle)->getPreferredStepSize();
Chris@60 216 }
Chris@60 217
Chris@60 218 unsigned int
Chris@60 219 FeatureExtractionPluginAdapterBase::svpGetPreferredBlockSize(SVPPluginHandle handle)
Chris@60 220 {
Chris@60 221 return ((FeatureExtractionPlugin *)handle)->getPreferredBlockSize();
Chris@60 222 }
Chris@60 223
Chris@60 224 unsigned int
Chris@60 225 FeatureExtractionPluginAdapterBase::svpGetMinChannelCount(SVPPluginHandle handle)
Chris@60 226 {
Chris@60 227 return ((FeatureExtractionPlugin *)handle)->getMinChannelCount();
Chris@60 228 }
Chris@60 229
Chris@60 230 unsigned int
Chris@60 231 FeatureExtractionPluginAdapterBase::svpGetMaxChannelCount(SVPPluginHandle handle)
Chris@60 232 {
Chris@60 233 return ((FeatureExtractionPlugin *)handle)->getMaxChannelCount();
Chris@60 234 }
Chris@60 235
Chris@60 236 unsigned int
Chris@60 237 FeatureExtractionPluginAdapterBase::svpGetOutputCount(SVPPluginHandle handle)
Chris@60 238 {
Chris@60 239 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 240 if (!adapter) return 0;
Chris@60 241 return adapter->getOutputCount((FeatureExtractionPlugin *)handle);
Chris@60 242 }
Chris@60 243
Chris@60 244 SVPOutputDescriptor *
Chris@60 245 FeatureExtractionPluginAdapterBase::svpGetOutputDescriptor(SVPPluginHandle handle,
Chris@60 246 unsigned int i)
Chris@60 247 {
Chris@60 248 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 249 if (!adapter) return 0;
Chris@60 250 return adapter->getOutputDescriptor((FeatureExtractionPlugin *)handle, i);
Chris@60 251 }
Chris@60 252
Chris@60 253 void
Chris@60 254 FeatureExtractionPluginAdapterBase::svpReleaseOutputDescriptor(SVPOutputDescriptor *desc)
Chris@60 255 {
Chris@60 256 if (desc->name) free((void *)desc->name);
Chris@60 257 if (desc->description) free((void *)desc->description);
Chris@60 258 if (desc->unit) free((void *)desc->unit);
Chris@60 259 for (unsigned int i = 0; i < desc->valueCount; ++i) {
Chris@60 260 free((void *)desc->valueNames[i]);
Chris@60 261 }
Chris@60 262 if (desc->valueNames) free((void *)desc->valueNames);
Chris@60 263 free((void *)desc);
Chris@60 264 }
Chris@60 265
Chris@60 266 SVPFeatureList **
Chris@60 267 FeatureExtractionPluginAdapterBase::svpProcess(SVPPluginHandle handle,
Chris@60 268 float **inputBuffers,
Chris@60 269 int sec,
Chris@60 270 int nsec)
Chris@60 271 {
Chris@60 272 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 273 if (!adapter) return 0;
Chris@60 274 return adapter->process((FeatureExtractionPlugin *)handle,
Chris@60 275 inputBuffers, sec, nsec);
Chris@60 276 }
Chris@60 277
Chris@60 278 SVPFeatureList **
Chris@60 279 FeatureExtractionPluginAdapterBase::svpGetRemainingFeatures(SVPPluginHandle handle)
Chris@60 280 {
Chris@60 281 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
Chris@60 282 if (!adapter) return 0;
Chris@60 283 return adapter->getRemainingFeatures((FeatureExtractionPlugin *)handle);
Chris@60 284 }
Chris@60 285
Chris@60 286 void
Chris@60 287 FeatureExtractionPluginAdapterBase::svpReleaseFeatureSet(SVPFeatureList **fs)
Chris@60 288 {
Chris@60 289 if (!fs) return;
Chris@60 290 for (unsigned int i = 0; fs[i]; ++i) {
Chris@60 291 for (unsigned int j = 0; j < fs[i]->featureCount; ++j) {
Chris@60 292 SVPFeature *feature = &fs[i]->features[j];
Chris@60 293 if (feature->values) free((void *)feature->values);
Chris@60 294 if (feature->label) free((void *)feature->label);
Chris@60 295 free((void *)feature);
Chris@60 296 }
Chris@60 297 if (fs[i]->features) free((void *)fs[i]->features);
Chris@60 298 free((void *)fs[i]);
Chris@60 299 }
Chris@60 300 free((void *)fs);
Chris@60 301 }
Chris@60 302
Chris@60 303 void
Chris@60 304 FeatureExtractionPluginAdapterBase::cleanup(FeatureExtractionPlugin *plugin)
Chris@60 305 {
Chris@60 306 if (m_pluginOutputs.find(plugin) != m_pluginOutputs.end()) {
Chris@60 307 delete m_pluginOutputs[plugin];
Chris@60 308 m_pluginOutputs.erase(plugin);
Chris@60 309 }
Chris@60 310 m_adapterMap.erase(plugin);
Chris@60 311 delete ((FeatureExtractionPlugin *)plugin);
Chris@60 312 }
Chris@60 313
Chris@60 314 void
Chris@60 315 FeatureExtractionPluginAdapterBase::checkOutputMap(FeatureExtractionPlugin *plugin)
Chris@60 316 {
Chris@60 317 if (!m_pluginOutputs[plugin]) {
Chris@60 318 m_pluginOutputs[plugin] = new FeatureExtractionPlugin::OutputList
Chris@60 319 (plugin->getOutputDescriptors());
Chris@60 320 }
Chris@60 321 }
Chris@60 322
Chris@60 323 unsigned int
Chris@60 324 FeatureExtractionPluginAdapterBase::getOutputCount(FeatureExtractionPlugin *plugin)
Chris@60 325 {
Chris@60 326 checkOutputMap(plugin);
Chris@60 327 return m_pluginOutputs[plugin]->size();
Chris@60 328 }
Chris@60 329
Chris@60 330 SVPOutputDescriptor *
Chris@60 331 FeatureExtractionPluginAdapterBase::getOutputDescriptor(FeatureExtractionPlugin *plugin,
Chris@60 332 unsigned int i)
Chris@60 333 {
Chris@60 334 checkOutputMap(plugin);
Chris@60 335 FeatureExtractionPlugin::OutputDescriptor &od =
Chris@60 336 (*m_pluginOutputs[plugin])[i];
Chris@60 337
Chris@60 338 SVPOutputDescriptor *desc = (SVPOutputDescriptor *)
Chris@60 339 malloc(sizeof(SVPOutputDescriptor));
Chris@60 340
Chris@60 341 desc->name = strdup(od.name.c_str());
Chris@60 342 desc->description = strdup(od.description.c_str());
Chris@60 343 desc->unit = strdup(od.unit.c_str());
Chris@60 344 desc->hasFixedValueCount = od.hasFixedValueCount;
Chris@60 345 desc->valueCount = od.valueCount;
Chris@60 346
Chris@60 347 desc->valueNames = (const char **)
Chris@60 348 malloc(od.valueCount * sizeof(const char *));
Chris@60 349
Chris@60 350 for (unsigned int i = 0; i < od.valueCount; ++i) {
Chris@60 351 desc->valueNames[i] = strdup(od.valueNames[i].c_str());
Chris@60 352 }
Chris@60 353
Chris@60 354 desc->hasKnownExtents = od.hasKnownExtents;
Chris@60 355 desc->minValue = od.minValue;
Chris@60 356 desc->maxValue = od.maxValue;
Chris@60 357 desc->isQuantized = od.isQuantized;
Chris@60 358 desc->quantizeStep = od.quantizeStep;
Chris@60 359
Chris@60 360 switch (od.sampleType) {
Chris@60 361 case FeatureExtractionPlugin::OutputDescriptor::OneSamplePerStep:
Chris@60 362 desc->sampleType = svpOneSamplePerStep; break;
Chris@60 363 case FeatureExtractionPlugin::OutputDescriptor::FixedSampleRate:
Chris@60 364 desc->sampleType = svpFixedSampleRate; break;
Chris@60 365 case FeatureExtractionPlugin::OutputDescriptor::VariableSampleRate:
Chris@60 366 desc->sampleType = svpVariableSampleRate; break;
Chris@60 367 }
Chris@60 368
Chris@60 369 desc->sampleRate = od.sampleRate;
Chris@60 370
Chris@60 371 return desc;
Chris@60 372 }
Chris@60 373
Chris@60 374 SVPFeatureList **
Chris@60 375 FeatureExtractionPluginAdapterBase::process(FeatureExtractionPlugin *plugin,
Chris@60 376 float **inputBuffers,
Chris@60 377 int sec, int nsec)
Chris@60 378 {
Chris@60 379 RealTime rt(sec, nsec);
Chris@60 380 return convertFeatures(plugin->process(inputBuffers, rt));
Chris@60 381 }
Chris@60 382
Chris@60 383 SVPFeatureList **
Chris@60 384 FeatureExtractionPluginAdapterBase::getRemainingFeatures(FeatureExtractionPlugin *plugin)
Chris@60 385 {
Chris@60 386 return convertFeatures(plugin->getRemainingFeatures());
Chris@60 387 }
Chris@60 388
Chris@60 389 SVPFeatureList **
Chris@60 390 FeatureExtractionPluginAdapterBase::convertFeatures(const FeatureExtractionPlugin::FeatureSet &features)
Chris@60 391 {
Chris@60 392 unsigned int n = 0;
Chris@60 393 if (features.begin() != features.end()) {
Chris@60 394 FeatureExtractionPlugin::FeatureSet::const_iterator i = features.end();
Chris@60 395 --i;
Chris@60 396 n = i->first + 1;
Chris@60 397 }
Chris@60 398
Chris@60 399 if (!n) return 0;
Chris@60 400
Chris@60 401 SVPFeatureList **fs = (SVPFeatureList **)
Chris@60 402 malloc((n + 1) * sizeof(SVPFeatureList *));
Chris@60 403
Chris@60 404 for (unsigned int i = 0; i < n; ++i) {
Chris@60 405 fs[i] = (SVPFeatureList *)malloc(sizeof(SVPFeatureList));
Chris@60 406 if (features.find(i) == features.end()) {
Chris@60 407 fs[i]->featureCount = 0;
Chris@60 408 fs[i]->features = 0;
Chris@60 409 } else {
Chris@60 410 FeatureExtractionPlugin::FeatureSet::const_iterator fi =
Chris@60 411 features.find(i);
Chris@60 412 const FeatureExtractionPlugin::FeatureList &fl = fi->second;
Chris@60 413 fs[i]->featureCount = fl.size();
Chris@60 414 fs[i]->features = (SVPFeature *)malloc(fl.size() *
Chris@60 415 sizeof(SVPFeature));
Chris@60 416 for (unsigned int j = 0; j < fl.size(); ++j) {
Chris@60 417 fs[i]->features[j].hasTimestamp = fl[j].hasTimestamp;
Chris@60 418 fs[i]->features[j].sec = fl[j].timestamp.sec;
Chris@60 419 fs[i]->features[j].nsec = fl[j].timestamp.nsec;
Chris@60 420 fs[i]->features[j].valueCount = fl[j].values.size();
Chris@60 421 fs[i]->features[j].values = (float *)malloc
Chris@60 422 (fs[i]->features[j].valueCount * sizeof(float));
Chris@60 423 for (unsigned int k = 0; k < fs[i]->features[j].valueCount; ++k) {
Chris@60 424 fs[i]->features[j].values[k] = fl[j].values[k];
Chris@60 425 }
Chris@60 426 fs[i]->features[j].label = strdup(fl[j].label.c_str());
Chris@60 427 }
Chris@60 428 }
Chris@60 429 }
Chris@60 430
Chris@60 431 fs[n] = 0;
Chris@60 432
Chris@60 433 return fs;
Chris@60 434 }
Chris@60 435
Chris@60 436 FeatureExtractionPluginAdapterBase::AdapterMap
Chris@60 437 FeatureExtractionPluginAdapterBase::m_adapterMap;
Chris@60 438
Chris@60 439