# HG changeset patch # User Chris Cannam # Date 1138896619 0 # Node ID 24b500216029192dcdea2f582b36070f1775f3ed # Parent 3a41ba527b4a1f95c6f427702095fd3598de2922 * Refactor sparse models. Previously the 1D and time-value models duplicated a lot of code; now there is a base class (SparseModel) templated on the stored point type, and the subclasses define point types with the necessary characteristics. * Add NoteModel, a new SparseModel subclass. * Reorganise local feature description display. Instead of asking the layer to draw its own, just query it for a textual description and draw that in Pane. Greatly simplifies this part of the layer code. * Add local feature descriptions to colour 3D plot and waveform layers. * Add pitch in MIDI-pitch-and-cents to spectrogram layer. * Give AudioGenerator its own mutex to shorten lock times in CallbackPlaySource. * Minor adjustments to layers menu &c diff -r 3a41ba527b4a -r 24b500216029 audioio/AudioCallbackPlaySource.cpp --- a/audioio/AudioCallbackPlaySource.cpp Mon Jan 30 17:51:56 2006 +0000 +++ b/audioio/AudioCallbackPlaySource.cpp Thu Feb 02 16:10:19 2006 +0000 @@ -80,6 +80,8 @@ void AudioCallbackPlaySource::addModel(Model *model) { + m_audioGenerator->addModel(model); + m_mutex.lock(); m_models.insert(model); @@ -116,8 +118,6 @@ m_audioGenerator->setTargetChannelCount(modelChannels); } - m_audioGenerator->addModel(model); - if (!m_writeBuffers || (m_writeBuffers->size() < modelChannels)) { clearRingBuffers(true, modelChannels); buffersChanged = true; @@ -172,10 +172,10 @@ } m_lastModelEndFrame = lastEnd; + m_mutex.unlock(); + m_audioGenerator->removeModel(model); - m_mutex.unlock(); - clearRingBuffers(); } @@ -193,11 +193,11 @@ m_lastModelEndFrame = 0; - m_audioGenerator->clearModels(); - m_sourceSampleRate = 0; m_mutex.unlock(); + + m_audioGenerator->clearModels(); } void @@ -224,7 +224,7 @@ if (!haveLock) { m_mutex.unlock(); - m_condition.wakeAll(); +//!!! m_condition.wakeAll(); } } diff -r 3a41ba527b4a -r 24b500216029 audioio/AudioGenerator.cpp --- a/audioio/AudioGenerator.cpp Mon Jan 30 17:51:56 2006 +0000 +++ b/audioio/AudioGenerator.cpp Thu Feb 02 16:10:19 2006 +0000 @@ -79,6 +79,7 @@ (pluginId, 0, 0, m_sourceSampleRate, m_pluginBlockSize, m_targetChannelCount); if (instance) { + QMutexLocker locker(&m_mutex); m_synthMap[sodm] = instance; for (unsigned int i = 0; i < instance->getParameterCount(); ++i) { instance->setParameterValue(i, instance->getParameterDefault(i)); @@ -102,6 +103,8 @@ dynamic_cast(model); if (!sodm) return; // nothing to do + QMutexLocker locker(&m_mutex); + if (m_synthMap.find(sodm) == m_synthMap.end()) return; RealTimePluginInstance *instance = m_synthMap[sodm]; @@ -112,6 +115,7 @@ void AudioGenerator::clearModels() { + QMutexLocker locker(&m_mutex); while (!m_synthMap.empty()) { RealTimePluginInstance *instance = m_synthMap.begin()->second; m_synthMap.erase(m_synthMap.begin()); @@ -122,6 +126,7 @@ void AudioGenerator::reset() { + QMutexLocker locker(&m_mutex); for (PluginMap::iterator i = m_synthMap.begin(); i != m_synthMap.end(); ++i) { if (i->second) { i->second->silence(); @@ -135,6 +140,7 @@ void AudioGenerator::setTargetChannelCount(size_t targetChannelCount) { + QMutexLocker locker(&m_mutex); m_targetChannelCount = targetChannelCount; for (PluginMap::iterator i = m_synthMap.begin(); i != m_synthMap.end(); ++i) { @@ -157,6 +163,8 @@ return frameCount; } + QMutexLocker locker(&m_mutex); + PlayParameters *parameters = m_viewManager->getPlayParameters(model); if (!parameters) return frameCount; diff -r 3a41ba527b4a -r 24b500216029 audioio/AudioGenerator.h --- a/audioio/AudioGenerator.h Mon Jan 30 17:51:56 2006 +0000 +++ b/audioio/AudioGenerator.h Thu Feb 02 16:10:19 2006 +0000 @@ -16,6 +16,8 @@ class SparseOneDimensionalModel; class RealTimePluginInstance; +#include + #include #include @@ -88,6 +90,7 @@ typedef std::set NoteOffSet; typedef std::map NoteOffMap; + QMutex m_mutex; PluginMap m_synthMap; NoteOffMap m_noteOffs;