| @@ -14,21 +14,18 @@ | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| */ | |||
| // is this still relevant | |||
| // for lrintf() | |||
| #define _ISOC9X_SOURCE 1 | |||
| #define _ISOC99_SOURCE 1 | |||
| #include <math.h> | |||
| #include <sys/types.h> | |||
| #include <stdio.h> | |||
| #include <fcntl.h> | |||
| #include <unistd.h> | |||
| #include <limits.h> | |||
| #include <sys/ioctl.h> | |||
| #include <limits.h> | |||
| //#include <math.h> | |||
| //#include <sys/types.h> | |||
| //#include <sys/ioctl.h> | |||
| //#include <unistd.h> | |||
| //#include <limits.h> | |||
| #include "DiskWriterPlugin.h" | |||
| #include "DiskWriterPluginGUI.h" | |||
| #include <FL/fl_file_chooser.H> | |||
| @@ -46,25 +43,15 @@ using namespace std; | |||
| extern "C" | |||
| { | |||
| SpiralPlugin* SpiralPlugin_CreateInstance() | |||
| { | |||
| return new DiskWriterPlugin; | |||
| } | |||
| char** SpiralPlugin_GetIcon() | |||
| { | |||
| return SpiralIcon_xpm; | |||
| } | |||
| SpiralPlugin* SpiralPlugin_CreateInstance() { return new DiskWriterPlugin; } | |||
| int SpiralPlugin_GetID() | |||
| { | |||
| return 41; | |||
| } | |||
| char** SpiralPlugin_GetIcon() { return SpiralIcon_xpm; } | |||
| int SpiralPlugin_GetID() { return 41; } | |||
| string SpiralPlugin_GetGroupName() { return "InputOutput"; } | |||
| string SpiralPlugin_GetGroupName() | |||
| { | |||
| return "InputOutput"; | |||
| } | |||
| } | |||
| /////////////////////////////////////////////////////// | |||
| @@ -101,17 +88,12 @@ DiskWriterPlugin::~DiskWriterPlugin() | |||
| PluginInfo &DiskWriterPlugin::Initialise(const HostInfo *Host) | |||
| { | |||
| PluginInfo& Info= SpiralPlugin::Initialise(Host); | |||
| //host=Host; | |||
| return Info; | |||
| } | |||
| SpiralGUIType *DiskWriterPlugin::CreateGUI() | |||
| { | |||
| return new DiskWriterPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this, | |||
| m_AudioCH, | |||
| m_HostInfo); | |||
| return new DiskWriterPluginGUI(m_PluginInfo.Width, m_PluginInfo.Height, this, m_AudioCH, m_HostInfo); | |||
| } | |||
| void DiskWriterPlugin::Execute() | |||
| @@ -157,26 +139,26 @@ void DiskWriterPlugin::ExecuteCommands() | |||
| } | |||
| } | |||
| void DiskWriterPlugin::StreamOut (ostream &s) | |||
| void DiskWriterPlugin::StreamOut (ostream &s) | |||
| { | |||
| s << m_Version << " " << m_GUIArgs.BitsPerSample << " " << m_GUIArgs.Stereo << " "; | |||
| } | |||
| void DiskWriterPlugin::StreamIn (istream &s) | |||
| void DiskWriterPlugin::StreamIn (istream &s) | |||
| { | |||
| char Test; | |||
| int Version, BitsPerSample, Stereo; | |||
| //originally DiskWriter had NO streaming code whatsover | |||
| // originally DiskWriter had NO streaming code whatsover | |||
| // so to test if this is an old patch we must | |||
| // read ahead and find out what the first char | |||
| // of the next line is | |||
| s.seekg (2, ios_base::cur );//skip to next line | |||
| Test = s.peek();//peek first char | |||
| s.seekg (-2, ios_base::cur );//jump back to prior line | |||
| //This test works because if the char | |||
| s.seekg (2, ios::cur ); //skip to next line | |||
| Test = s.peek(); //peek first char | |||
| s.seekg (-2, ios::cur ); //jump back to prior line | |||
| // This test works because if the char | |||
| // of the next line isn't a version number | |||
| // it will only be 'D', ' ', #13, or '-' | |||
| if ( (Test >= '0') && (Test <= '9') ) | |||
| @@ -188,7 +170,7 @@ void DiskWriterPlugin::StreamIn (istream &s) | |||
| //No Version, so use Version 1 | |||
| Version = 1; | |||
| } | |||
| switch (Version) | |||
| { | |||
| case 2: | |||
| @@ -198,7 +180,7 @@ void DiskWriterPlugin::StreamIn (istream &s) | |||
| m_GUIArgs.Stereo = Stereo; | |||
| } | |||
| break; | |||
| case 1: | |||
| { | |||
| //use original fixed defaults | |||
| @@ -206,5 +188,5 @@ void DiskWriterPlugin::StreamIn (istream &s) | |||
| m_GUIArgs.Stereo = true; | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| @@ -622,9 +622,9 @@ void JackPlugin::StreamIn (istream &s) | |||
| char Test; | |||
| int Version, NumInputs, NumOutputs; | |||
| s.seekg (2, ios_base::cur );//skip to next line | |||
| Test = s.peek();//peek first char | |||
| s.seekg (-2, ios_base::cur );//jump back to prior line | |||
| s.seekg (2, ios::cur ); //skip to next line | |||
| Test = s.peek(); //peek first char | |||
| s.seekg (-2, ios::cur ); //jump back to prior line | |||
| if ( (Test >= '0') && (Test <= '9') ) | |||
| { | |||
| @@ -45,7 +45,6 @@ m_VUMode (true) | |||
| m_PluginInfo.NumOutputs = 1; | |||
| m_PluginInfo.PortTips.push_back ("Input"); | |||
| m_PluginInfo.PortTips.push_back ("Output"); | |||
| m_Version = 1; | |||
| } | |||
| @@ -68,8 +67,8 @@ void MeterPlugin::Execute() { | |||
| // Just copy the data through. | |||
| if (GetOutputBuf (0)) GetOutputBuf (0)->Zero(); | |||
| if (GetInput (0)) { | |||
| GetOutputBuf (0)->Mix (*GetInput(0), 0); | |||
| memcpy (m_Data, GetInput (0)->GetBuffer (), m_HostInfo->BUFSIZE * sizeof (float)); | |||
| GetOutputBuf (0)->Mix (*GetInput(0), 0); | |||
| memcpy (m_Data, GetInput (0)->GetBuffer (), m_HostInfo->BUFSIZE * sizeof (float)); | |||
| } | |||
| } | |||
| @@ -21,13 +21,16 @@ | |||
| using namespace std; | |||
| char label_buf[10]; | |||
| char label_buf[65]; | |||
| MeterPluginGUI::~MeterPluginGUI () { | |||
| delete m_Data; | |||
| } | |||
| MeterPluginGUI::MeterPluginGUI (int w, int h, MeterPlugin *o, ChannelHandler *ch, const HostInfo *Info) : | |||
| SpiralPluginGUI (w, h, o, ch), | |||
| m_Bypass (false) | |||
| { | |||
| // If I'm only going to use the first value from this, is it worth doing all this | |||
| m_BufSize = Info->BUFSIZE; | |||
| m_Data = new float[m_BufSize]; | |||
| // Create the widgets and stuff! | |||
| @@ -90,18 +93,21 @@ m_Bypass (false) | |||
| void MeterPluginGUI::draw() { | |||
| SpiralGUIType::draw (); | |||
| if (! m_Bypass) { | |||
| float datum = 0.0; | |||
| m_GUICH->GetData ("AudioData", m_Data); | |||
| // The min and max values are based on the whole buffer | |||
| for (int c=0; c<m_BufSize; c++) { | |||
| if (VUMode->value ()) m_Data[c] = fabs (m_Data[c]); | |||
| if (m_Data[c] < m_Min) m_Min=m_Data[c]; | |||
| if (m_Data[c] > m_Max) m_Max=m_Data[c]; | |||
| datum = m_Data[c]; | |||
| if (VUMode->value ()) datum = fabs (datum); | |||
| if (datum < m_Min) m_Min = datum; | |||
| if (datum > m_Max) m_Max = datum; | |||
| } | |||
| SetMinMax (m_Min, m_Max); | |||
| // The meter displays the first datum in the buffer (it's a quick average) | |||
| Meter->value (*m_Data); | |||
| // The meter displays the last datum we touched (it's a quick average) | |||
| Meter->value (datum); | |||
| Meter->redraw(); | |||
| snprintf (label_buf, 64, "%1.5f", *m_Data); | |||
| // Yeuck - have I REALLY used stdio for that - this is supposed to be C++ | |||
| //snprintf (label_buf, 64, "%1.5f", *m_Data); | |||
| char* c = label_buf; | |||
| for (int display=0; display<8; display++) { | |||
| Digits[display] -> dp (off); | |||
| @@ -19,6 +19,7 @@ | |||
| #ifndef METERGUI | |||
| #define METERGUI | |||
| #include <sstream> | |||
| #include <FL/Fl.H> | |||
| #include "../Widgets/Fl_VU_Meter.h" | |||
| #include "../Widgets/Fl_SevenSeg.H" | |||
| @@ -30,6 +31,7 @@ | |||
| class MeterPluginGUI : public SpiralPluginGUI { | |||
| public: | |||
| MeterPluginGUI (int w, int h, MeterPlugin *o, ChannelHandler *ch, const HostInfo *Info); | |||
| ~MeterPluginGUI (); | |||
| virtual void UpdateValues (SpiralPlugin* o); | |||
| virtual void Update (); | |||
| virtual void draw (); | |||
| @@ -14,7 +14,7 @@ | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| */ | |||
| #include "ScopePlugin.h" | |||
| #include "ScopePluginGUI.h" | |||
| #include <FL/Fl_Button.h> | |||
| @@ -24,25 +24,13 @@ using namespace std; | |||
| extern "C" | |||
| { | |||
| SpiralPlugin* SpiralPlugin_CreateInstance() | |||
| { | |||
| return new ScopePlugin; | |||
| } | |||
| SpiralPlugin* SpiralPlugin_CreateInstance() { return new ScopePlugin; } | |||
| char** SpiralPlugin_GetIcon() | |||
| { | |||
| return SpiralIcon_xpm; | |||
| } | |||
| char** SpiralPlugin_GetIcon() { return SpiralIcon_xpm; } | |||
| int SpiralPlugin_GetID() | |||
| { | |||
| return 0x0001; | |||
| } | |||
| int SpiralPlugin_GetID() { return 0x0001; } | |||
| string SpiralPlugin_GetGroupName() | |||
| { | |||
| return "Control"; | |||
| } | |||
| string SpiralPlugin_GetGroupName() { return "Control"; } | |||
| } | |||
| /////////////////////////////////////////////////////// | |||
| @@ -50,9 +38,7 @@ string SpiralPlugin_GetGroupName() | |||
| ScopePlugin::ScopePlugin() | |||
| { | |||
| m_PluginInfo.Name="Scope"; | |||
| //m_PluginInfo.Width=220; | |||
| m_PluginInfo.Width=260; | |||
| //m_PluginInfo.Height=125; | |||
| m_PluginInfo.Height=115; | |||
| m_PluginInfo.NumInputs=1; | |||
| m_PluginInfo.NumOutputs=1; | |||
| @@ -65,8 +51,8 @@ ScopePlugin::~ScopePlugin() | |||
| } | |||
| PluginInfo &ScopePlugin::Initialise(const HostInfo *Host) | |||
| { | |||
| PluginInfo& Info = SpiralPlugin::Initialise(Host); | |||
| { | |||
| PluginInfo& Info = SpiralPlugin::Initialise(Host); | |||
| m_Data = new float[Host->BUFSIZE]; | |||
| m_AudioCH->RegisterData("AudioData",ChannelHandler::OUTPUT,m_Data,Host->BUFSIZE*sizeof(float)); | |||
| return Info; | |||
| @@ -74,22 +60,15 @@ PluginInfo &ScopePlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *ScopePlugin::CreateGUI() | |||
| { | |||
| return new ScopePluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this, | |||
| m_AudioCH, | |||
| m_HostInfo); | |||
| return new ScopePluginGUI(m_PluginInfo.Width, m_PluginInfo.Height, this, m_AudioCH, m_HostInfo); | |||
| } | |||
| void ScopePlugin::Execute() | |||
| { | |||
| // Just copy the data through. | |||
| if (GetOutputBuf(0)) GetOutputBuf(0)->Zero(); | |||
| if (GetInput(0)) GetOutputBuf(0)->Mix(*GetInput(0),0); | |||
| if (GetInput(0)) | |||
| { | |||
| //cerr<<1<<" "<<m_HostInfo->BUFSIZE<<endl; | |||
| memcpy(m_Data,GetInput(0)->GetBuffer(),m_HostInfo->BUFSIZE*sizeof(float)); | |||
| } | |||
| void ScopePlugin::Execute() { | |||
| // Just copy the data through. | |||
| if (GetOutputBuf (0)) GetOutputBuf (0)->Zero(); | |||
| if (GetInput (0)) { | |||
| GetOutputBuf (0)->Mix (*GetInput(0), 0); | |||
| memcpy (m_Data, GetInput (0)->GetBuffer (), m_HostInfo->BUFSIZE * sizeof (float)); | |||
| } | |||
| } | |||
| @@ -60,7 +60,7 @@ SpiralGUIType(0,0,w,h,"") | |||
| SpiralPluginGUI::~SpiralPluginGUI() | |||
| { | |||
| // Needed to properly remove the window. | |||
| Fl::check(); | |||
| Fl::check(); | |||
| } | |||
| void SpiralPluginGUI::Resize (int neww, int newh) { | |||
| @@ -201,31 +201,34 @@ void SynthModular::UpdatePluginGUIs() | |||
| if (i->second->m_DeviceGUI->Killed()) | |||
| { | |||
| PauseAudio(); | |||
| PauseAudio(); | |||
| //Hide Device GUI FIRST | |||
| // Hide Device GUI FIRST | |||
| if (i->second->m_DeviceGUI->GetPluginWindow()) | |||
| { | |||
| i->second->m_DeviceGUI->GetPluginWindow()->hide(); | |||
| } | |||
| //Clear and remove Device GUI from canvas | |||
| // Clear and remove Device GUI from canvas | |||
| i->second->m_DeviceGUI->Clear(); | |||
| m_Canvas->RemoveDevice(i->second->m_DeviceGUI); | |||
| //Delete Device GUI - must delete here or sometimes plugin will randomly crash | |||
| // Delete Device GUI - must delete here or sometimes plugin will randomly crash | |||
| // SOMETIMES AT THIS POINT THE WHOLE THING JUST LOCKS UP | |||
| // In the previous version of this code this next line was commented out | |||
| // with the comment "deleted by Canvas::Remove()? seems to cause random crashes" | |||
| delete i->second->m_DeviceGUI; | |||
| //Delete Device Sometimes deleting audio before GUI causes an odd crash, so do it afterword | |||
| // Delete Device Sometimes deleting audio before GUI causes an odd crash, so do it afterword | |||
| if (i->second->m_Device) | |||
| { | |||
| delete i->second->m_Device; | |||
| i->second->m_Device=NULL; | |||
| } | |||
| //Erase Device from DeviceWinMap | |||
| // Erase Device from DeviceWinMap | |||
| m_DeviceWinMap.erase(i); | |||
| ResumeAudio(); | |||
| break; | |||
| } | |||
| @@ -40,7 +40,7 @@ | |||
| #include "SpiralSound/ChannelHandler.h" | |||
| #include "SettingsWindow.h" | |||
| const static string VER_STRING = "0.2.2rc1"; | |||
| const static string VER_STRING = "0.2.2rc2"; | |||
| typedef Fl_Double_Window SpiralWindowType; | |||
| // typedef Fl_Window SpiralWindowType; | |||