2 * Copyleft (C) 2002 David Griffiths <dave@pawfal.org>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 #ifndef SPIRALSYNTHMODULAR
20 #define SPIRALSYNTHMODULAR
24 #include <FL/Fl_Double_Window.H>
25 #include <FL/Fl_Group.H>
26 #include <FL/Fl_Box.H>
27 #include <FL/Fl_Button.H>
28 #include <FL/Fl_Pixmap.H>
29 #include <FL/Fl_Scroll.H>
30 #include <FL/Fl_Pack.H>
31 #include <FL/Fl_Tile.H>
32 #include <FL/Fl_Tabs.H>
33 #include <FL/Fl_Menu_Bar.H>
38 #include "GUI/Widgets/Fl_DeviceGUI.h"
39 #include "GUI/Widgets/Fl_CommentGUI.h"
40 #include "GUI/Widgets/Fl_Canvas.h"
41 #include "SpiralSound/Plugins/SpiralPlugin.h"
42 #include "SpiralSound/ChannelHandler.h"
43 #include "SettingsWindow.h"
45 const static string VER_STRING
= "0.2.3.cvs";
47 typedef Fl_Double_Window SpiralWindowType
;
48 // typedef Fl_Window SpiralWindowType;
55 DeviceWin() : m_DeviceGUI(NULL
) {}
59 SpiralPlugin
* m_Device
;
60 Fl_DeviceGUI
* m_DeviceGUI
;
63 class Fl_ToolButton
: public Fl_Button
66 Fl_ToolButton(int x
, int y
, int w
, int h
, const char *n
=NULL
) :
67 Fl_Button(x
,y
,w
,h
,n
) {}
68 virtual void draw() { draw_label(); }
74 DeviceGroup() { devicecount
= 0; }
78 map
<int,int> m_DeviceIds
;//old ID, new ID
87 SpiralWindowType
* CreateWindow();
88 void LoadPlugins(string pluginPath
);
90 void AddDevice(int n
, int x
, int y
);
91 void AddComment(int n
);
93 void UpdateHostInfo();
94 bool CallbackMode() { return m_CallbackUpdateMode
; }
95 bool IsBlockingOutputPluginReady() { return m_BlockingOutputPluginIsReady
; }
96 void UpdatePluginGUIs();
97 void LoadPatch(const char *fn
);
101 m_CH
.Set("Frozen",true);
107 m_CH
.Set("Frozen",false);
112 m_Info
.PAUSED
= true;
117 m_Info
.PAUSED
= false;
122 if (! m_ResetingAudioThread
)
126 m_ResetingAudioThread
= true;
132 // only for audio thread
133 bool IsFrozen() { return m_Frozen
; }
135 iostream
&StreamPatchIn(iostream
&s
, bool paste
, bool merge
);
138 vector
<string
> BuildPluginList(const string
&Path
);
140 DeviceWin
* NewDeviceWin(int n
, int x
, int y
);
141 DeviceWin
* NewComment(int n
, int x
, int y
);
144 bool m_ResetingAudioThread
, m_HostNeedsUpdate
, m_Frozen
;
147 static DeviceGUIInfo
BuildDeviceGUIInfo(PluginInfo
&PInfo
);
149 // currently static, to allow the callback
150 // cb_UpdatePluginInfo to access the map.
151 static map
<int,DeviceWin
*> m_DeviceWinMap
;
154 static bool m_CallbackUpdateMode
;
155 static bool m_BlockingOutputPluginIsReady
;
156 string m_FilePath
, m_MergeFilePath
;
159 void CreateGUI (int xoff
=0, int yoff
=0, char *name
="");
160 Fl_Menu_Bar
*m_MainMenu
;
161 Fl_Pack
*m_Topbar
, *m_ToolbarPanel
, *m_Toolbar
;
162 Fl_Group
*m_GroupFiller
;
163 Fl_Button
*m_Load
, *m_Save
, *m_New
, *m_Options
, *m_NewComment
;
164 Fl_Pack
*m_PlayResetGroup
;
165 Fl_Button
*m_PlayPause
, *m_Reset
;
168 Fl_Scroll
*m_CanvasScroll
;
169 map
<string
,Fl_Pack
*> m_PluginGroupMap
;
170 SettingsWindow
*m_SettingsWindow
;
171 SpiralWindowType
* m_TopWindow
;
172 vector
<Fl_Button
*> m_DeviceVec
;
173 ChannelHandler m_CH
; // used for threadsafe communication
174 DeviceGroup m_Copied
;
176 inline void cb_NewComment_i(Fl_Button
* o
, void* v
);
177 static void cb_NewComment(Fl_Button
* o
, void* v
);
178 // File menu - and associated buttons, etc.
179 inline void cb_New_i (Fl_Widget
*o
, void *v
);
180 static void cb_New (Fl_Widget
*o
, void *v
);
181 inline void cb_Load_i (Fl_Widget
*o
, void *v
);
182 static void cb_Load (Fl_Widget
*o
, void *v
);
183 inline void cb_Save_i (Fl_Widget
*o
, void *v
);
184 static void cb_Save (Fl_Widget
*o
, void *v
);
185 inline void cb_Merge_i (Fl_Widget
*o
, void *v
);
186 static void cb_Merge (Fl_Widget
*o
, void *v
);
187 inline void cb_Close_i (Fl_Widget
*o
, void *v
);
188 static void cb_Close (Fl_Widget
*o
, void *v
);
190 inline void cb_Cut_i (Fl_Widget
*o
, void *v
);
191 static void cb_Cut (Fl_Widget
*o
, void *v
);
192 inline void cb_Copy_i (Fl_Widget
*o
, void *v
);
193 static void cb_Copy (Fl_Widget
*o
, void *v
);
194 inline void cb_Paste_i (Fl_Widget
*o
, void *v
);
195 static void cb_Paste (Fl_Widget
*o
, void *v
);
196 inline void cb_Delete_i (Fl_Widget
*o
, void *v
);
197 static void cb_Delete (Fl_Widget
*o
, void *v
);
198 inline void cb_Options_i (Fl_Widget
*o
, void *v
);
199 static void cb_Options (Fl_Widget
*o
, void *v
);
201 inline void cb_NewDevice_i (Fl_Button
*o
, void *v
);
202 static void cb_NewDevice (Fl_Button
*o
, void *v
);
203 inline void cb_NewDeviceFromMenu_i (Fl_Widget
*o
, void *v
);
204 static void cb_NewDeviceFromMenu (Fl_Widget
*o
, void *v
);
205 inline void cb_NewDeviceFromCanvasMenu_i (Fl_Canvas
*o
, void *v
);
206 static void cb_NewDeviceFromCanvasMenu (Fl_Canvas
*o
, void *v
);
208 inline void cb_PlayPause_i (Fl_Widget
*o
, void *v
);
209 static void cb_PlayPause (Fl_Widget
*o
, void *v
);
210 inline void cb_Reset_i (Fl_Widget
*o
, void *v
);
211 static void cb_Reset (Fl_Widget
*o
, void *v
);
213 inline void cb_Connection_i(Fl_Canvas
* o
, void* v
);
214 static void cb_Connection(Fl_Canvas
* o
, void* v
);
215 inline void cb_Unconnect_i(Fl_Canvas
* o
, void* v
);
216 static void cb_Unconnect(Fl_Canvas
* o
, void* v
);
217 inline void cb_GroupTab_i(Fl_Tabs
* o
, void* v
);
218 static void cb_GroupTab(Fl_Tabs
* o
, void* v
);
219 static void cb_Update(void* o
, bool Mode
);
220 static void cb_Blocking(void* o
, bool Mode
);
221 static void cb_UpdatePluginInfo(int ID
, void *PluginInfo
);
222 inline void cb_ChangeBufferAndSampleRate_i(long int NewBufferSize
, long int NewSamplerate
);
223 static void cb_ChangeBufferAndSampleRate(long unsigned int NewBufferSize
, long unsigned int NewSamplerate
, void *o
)
225 ((SynthModular
*)o
)->cb_ChangeBufferAndSampleRate_i(NewBufferSize
, NewSamplerate
);
227 friend istream
&operator>>(istream
&s
, SynthModular
&o
);
228 friend ostream
&operator<<(ostream
&s
, SynthModular
&o
);
231 iostream
&operator>>(iostream
&s
, SynthModular
&o
);
232 ostream
&operator<<(ostream
&s
, SynthModular
&o
);