diff --git a/SpiralSound/ChannelHandler.C b/SpiralSound/ChannelHandler.C index 298dc06..a79cc45 100644 --- a/SpiralSound/ChannelHandler.C +++ b/SpiralSound/ChannelHandler.C @@ -214,7 +214,7 @@ void ChannelHandler::GetData(const string &ID, void *data) pthread_mutex_unlock(m_Mutex); } -void ChannelHandler::UpdateDataSize(const std::string &ID, int size) +void ChannelHandler::ReplaceData(const std::string &ID, void *pData, int size) { map::iterator i=m_ChannelMap.find(ID); if (i==m_ChannelMap.end()) @@ -224,6 +224,7 @@ void ChannelHandler::UpdateDataSize(const std::string &ID, int size) } pthread_mutex_lock(m_Mutex); + i->second->data = pData; i->second->size = size; free(i->second->data_buf); i->second->data_buf = malloc(size); diff --git a/SpiralSound/ChannelHandler.h b/SpiralSound/ChannelHandler.h index 6160719..dbbf6e3 100644 --- a/SpiralSound/ChannelHandler.h +++ b/SpiralSound/ChannelHandler.h @@ -79,7 +79,7 @@ public: void Set(const std::string &ID, const float& s) { SetData(ID,(void*)&s); } void Set(const std::string &ID, const double& s) { SetData(ID,(void*)&s); } - void UpdateDataSize(const std::string &ID, int size); + void ReplaceData(const std::string &ID, void *pData, int size); void SetCommand(char command); diff --git a/SpiralSound/Plugins/MeterPlugin/MeterPlugin.C b/SpiralSound/Plugins/MeterPlugin/MeterPlugin.C index 9c99011..d3b8bf3 100644 --- a/SpiralSound/Plugins/MeterPlugin/MeterPlugin.C +++ b/SpiralSound/Plugins/MeterPlugin/MeterPlugin.C @@ -36,6 +36,7 @@ string SpiralPlugin_GetGroupName() { return "InputOutput"; } MeterPlugin::MeterPlugin(): m_Data (NULL), +m_DataSize (0), m_DataReady (false), m_VUMode (true) { @@ -48,6 +49,7 @@ m_VUMode (true) m_PluginInfo.PortTips.push_back ("Output"); m_AudioCH->Register ("DataReady", &m_DataReady, ChannelHandler::OUTPUT); m_AudioCH->Register ("DataSizeChanged", &m_DataSizeChanged, ChannelHandler::OUTPUT); + m_AudioCH->Register ("DataSize", &m_DataSize, ChannelHandler::OUTPUT); m_Version = 1; } @@ -58,8 +60,9 @@ MeterPlugin::~MeterPlugin() { PluginInfo &MeterPlugin::Initialise (const HostInfo *Host) { PluginInfo& Info = SpiralPlugin::Initialise (Host); - m_Data = new float[Host->BUFSIZE]; - m_AudioCH->RegisterData ("AudioData", ChannelHandler::OUTPUT, m_Data, Host->BUFSIZE * sizeof (float)); + m_DataSize = Host->BUFSIZE; + m_Data = new float[m_DataSize]; + m_AudioCH->RegisterData ("AudioData", ChannelHandler::OUTPUT, m_Data, m_DataSize * sizeof (float)); return Info; } @@ -72,7 +75,8 @@ void MeterPlugin::Reset() ResetPorts(); m_DataReady = false; delete m_Data; - m_Data = new float[m_HostInfo->BUFSIZE]; + m_DataSize = m_HostInfo->BUFSIZE; + m_Data = new float[m_DataSize]; m_DataSizeChanged = true; } @@ -82,7 +86,7 @@ void MeterPlugin::Execute() { if (GetOutputBuf (0)) GetOutputBuf (0)->Zero(); if (m_DataReady) { GetOutputBuf (0)->Mix (*GetInput(0), 0); - memcpy (m_Data, GetInput (0)->GetBuffer (), m_HostInfo->BUFSIZE * sizeof (float)); + memcpy (m_Data, GetInput (0)->GetBuffer (), m_DataSize * sizeof (float)); } } @@ -91,7 +95,7 @@ void MeterPlugin::ExecuteCommands () { switch (m_AudioCH->GetCommand()) { case UPDATEDATASIZE : { - m_AudioCH->UpdateDataSize("AudioData",m_HostInfo->BUFSIZE*sizeof(float)); + m_AudioCH->ReplaceData("AudioData", m_Data, m_DataSize*sizeof(float)); m_DataSizeChanged = false; } break; diff --git a/SpiralSound/Plugins/MeterPlugin/MeterPlugin.h b/SpiralSound/Plugins/MeterPlugin/MeterPlugin.h index 2dc0538..3ae973c 100644 --- a/SpiralSound/Plugins/MeterPlugin/MeterPlugin.h +++ b/SpiralSound/Plugins/MeterPlugin/MeterPlugin.h @@ -36,6 +36,7 @@ class MeterPlugin : public SpiralPlugin { enum GUICommands {NONE, SETVU, SETMM, UPDATEDATASIZE}; private: float *m_Data; + int m_DataSize; // m_VUMode isn't USED for anything, it's here so we can save/load it bool m_DataReady, m_VUMode, m_DataSizeChanged; }; diff --git a/SpiralSound/Plugins/MeterPlugin/MeterPluginGUI.C b/SpiralSound/Plugins/MeterPlugin/MeterPluginGUI.C index 0232c06..3d3a06d 100644 --- a/SpiralSound/Plugins/MeterPlugin/MeterPluginGUI.C +++ b/SpiralSound/Plugins/MeterPlugin/MeterPluginGUI.C @@ -98,7 +98,12 @@ void MeterPluginGUI::draw() { { m_GUICH->SetCommand (MeterPlugin::UPDATEDATASIZE); m_GUICH->Wait(); + + m_BufSize = m_GUICH->GetInt("DataSize"); + delete[] m_Data; + m_Data = new float[m_BufSize]; } + if (m_GUICH->GetBool ("DataReady")) m_GUICH->GetData ("AudioData", m_Data); else memset (m_Data, 0, m_BufSize * sizeof (float)); // The min and max values are based on the whole buffer diff --git a/SpiralSound/Plugins/ScopePlugin/ScopePlugin.C b/SpiralSound/Plugins/ScopePlugin/ScopePlugin.C index 56dd8e7..1488b3a 100644 --- a/SpiralSound/Plugins/ScopePlugin/ScopePlugin.C +++ b/SpiralSound/Plugins/ScopePlugin/ScopePlugin.C @@ -36,7 +36,8 @@ string SpiralPlugin_GetGroupName() { return "InputOutput"; } /////////////////////////////////////////////////////// ScopePlugin::ScopePlugin(): -m_DataReady(false) +m_DataReady(false), +m_DataSize(0) { m_PluginInfo.Name = "Scope"; m_PluginInfo.Width = 260; @@ -47,6 +48,7 @@ m_DataReady(false) m_PluginInfo.PortTips.push_back("Output"); m_AudioCH->Register ("DataReady", &m_DataReady, ChannelHandler::OUTPUT); m_AudioCH->Register ("DataSizeChanged", &m_DataSizeChanged, ChannelHandler::OUTPUT); + m_AudioCH->Register ("DataSize", &m_DataSize, ChannelHandler::OUTPUT); } ScopePlugin::~ScopePlugin() @@ -56,8 +58,9 @@ ScopePlugin::~ScopePlugin() PluginInfo &ScopePlugin::Initialise(const HostInfo *Host) { PluginInfo& Info = SpiralPlugin::Initialise(Host); - m_Data = new float[Host->BUFSIZE]; - m_AudioCH->RegisterData("AudioData",ChannelHandler::OUTPUT,m_Data,Host->BUFSIZE*sizeof(float)); + m_DataSize = m_HostInfo->BUFSIZE; + m_Data = new float[m_DataSize]; + m_AudioCH->RegisterData("AudioData",ChannelHandler::OUTPUT,m_Data,m_DataSize*sizeof(float)); return Info; } @@ -71,7 +74,8 @@ void ScopePlugin::Reset() ResetPorts(); m_DataReady = false; delete m_Data; - m_Data = new float[m_HostInfo->BUFSIZE]; + m_DataSize = m_HostInfo->BUFSIZE; + m_Data = new float[m_DataSize]; m_DataSizeChanged = true; } @@ -81,7 +85,7 @@ void ScopePlugin::Execute() { if (GetOutputBuf (0)) GetOutputBuf (0)->Zero(); if (m_DataReady) { GetOutputBuf (0)->Mix (*GetInput(0), 0); - memcpy (m_Data, GetInput (0)->GetBuffer (), m_HostInfo->BUFSIZE * sizeof (float)); + memcpy (m_Data, GetInput (0)->GetBuffer (), m_DataSize * sizeof (float)); } } @@ -92,7 +96,7 @@ void ScopePlugin::ExecuteCommands() switch (m_AudioCH->GetCommand()) { case UPDATEDATASIZE : { - m_AudioCH->UpdateDataSize("AudioData",m_HostInfo->BUFSIZE*sizeof(float)); + m_AudioCH->ReplaceData("AudioData", m_Data, m_DataSize*sizeof(float)); m_DataSizeChanged = false; } break; diff --git a/SpiralSound/Plugins/ScopePlugin/ScopePlugin.h b/SpiralSound/Plugins/ScopePlugin/ScopePlugin.h index eff691d..b7915aa 100644 --- a/SpiralSound/Plugins/ScopePlugin/ScopePlugin.h +++ b/SpiralSound/Plugins/ScopePlugin/ScopePlugin.h @@ -38,6 +38,7 @@ class ScopePlugin : public SpiralPlugin { private: float *m_Data; bool m_DataReady; + int m_DataSize; bool m_DataSizeChanged; }; diff --git a/SpiralSound/Plugins/ScopePlugin/ScopePluginGUI.C b/SpiralSound/Plugins/ScopePlugin/ScopePluginGUI.C index 9c84388..6a717c4 100644 --- a/SpiralSound/Plugins/ScopePlugin/ScopePluginGUI.C +++ b/SpiralSound/Plugins/ScopePlugin/ScopePluginGUI.C @@ -106,9 +106,14 @@ void ScopePluginGUI::draw() //cerr<<"getting and drawing..."<GetBool ("DataSizeChanged")) { - m_GUICH->SetCommand (ScopePlugin::UPDATEDATASIZE); + m_GUICH->SetCommand(ScopePlugin::UPDATEDATASIZE); m_GUICH->Wait(); + + m_BufSize = m_GUICH->GetInt("DataSize"); + delete[] m_Scope->m_Data; + m_Scope->m_Data = new float[m_BufSize]; } + if (m_GUICH->GetBool ("DataReady")) m_GUICH->GetData ("AudioData", (void*)m_Scope->m_Data); else memset ((void*)m_Scope->m_Data, 0, m_BufSize * sizeof (float)); if (!m_Bypass) m_Scope->redraw();