You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
6.8KB

  1. /* SpiralSynthModular
  2. * Copyleft (C) 2002 David Griffiths <dave@pawfal.org>
  3. *
  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.
  8. *
  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.
  13. *
  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.
  17. */
  18. #ifndef SPIRALSYNTHMODULAR
  19. #define SPIRALSYNTHMODULAR
  20. #include <FL/Fl.H>
  21. #include <FL/x.H>
  22. #include <FL/Fl_Double_Window.H>
  23. #include <FL/Fl_Group.H>
  24. #include <FL/Fl_Box.H>
  25. #include <FL/Fl_Button.H>
  26. #include <FL/Fl_Pixmap.H>
  27. #include <FL/Fl_Scroll.H>
  28. #include <FL/Fl_Pack.H>
  29. #include <FL/Fl_Tile.H>
  30. #include <FL/Fl_Tabs.H>
  31. #include <FL/Fl_Menu_Bar.H>
  32. #include <sstream>
  33. #include <iostream>
  34. #include <fstream>
  35. #include <map>
  36. #include "GUI/Widgets/Fl_DeviceGUI.h"
  37. #include "GUI/Widgets/Fl_CommentGUI.h"
  38. #include "GUI/Widgets/Fl_Canvas.h"
  39. #include "SpiralSound/Plugins/SpiralPlugin.h"
  40. #include "SpiralSound/ChannelHandler.h"
  41. #include "SettingsWindow.h"
  42. const static string VER_STRING = "0.2.3.cvs";
  43. typedef Fl_Double_Window SpiralWindowType;
  44. // typedef Fl_Window SpiralWindowType;
  45. class SettingsWindow;
  46. class DeviceWin
  47. {
  48. public:
  49. DeviceWin() : m_DeviceGUI(NULL) {}
  50. ~DeviceWin();
  51. int m_PluginID;
  52. SpiralPlugin* m_Device;
  53. Fl_DeviceGUI* m_DeviceGUI;
  54. };
  55. class Fl_ToolButton : public Fl_Button
  56. {
  57. public:
  58. Fl_ToolButton(int x, int y, int w, int h, const char *n=NULL) :
  59. Fl_Button(x,y,w,h,n) {}
  60. virtual void draw() { draw_label(); }
  61. };
  62. class DeviceGroup
  63. {
  64. public:
  65. DeviceGroup() { devicecount = 0; }
  66. int devicecount;
  67. fstream devices;
  68. map<int,int> m_DeviceIds;//old ID, new ID
  69. };
  70. class SynthModular
  71. {
  72. public:
  73. SynthModular();
  74. ~SynthModular();
  75. SpiralWindowType * CreateWindow();
  76. void LoadPlugins(string pluginPath);
  77. void Update();
  78. void AddDevice(int n, int x, int y);
  79. void AddComment(int n);
  80. void ClearUp();
  81. void UpdateHostInfo();
  82. bool CallbackMode() { return m_CallbackUpdateMode; }
  83. bool IsBlockingOutputPluginReady() { return m_BlockingOutputPluginIsReady; }
  84. void UpdatePluginGUIs();
  85. void LoadPatch(const char *fn);
  86. void FreezeAll()
  87. {
  88. m_CH.Set("Frozen",true);
  89. m_CH.Wait();
  90. }
  91. void ThawAll()
  92. {
  93. m_CH.Set("Frozen",false);
  94. }
  95. void PauseAudio()
  96. {
  97. m_Info.PAUSED = true;
  98. }
  99. void ResumeAudio()
  100. {
  101. m_Info.PAUSED = false;
  102. }
  103. void ResetAudio()
  104. {
  105. if (! m_ResetingAudioThread)
  106. {
  107. FreezeAll();
  108. m_ResetingAudioThread = true;
  109. ThawAll();
  110. }
  111. }
  112. // only for audio thread
  113. bool IsFrozen() { return m_Frozen; }
  114. iostream &StreamPatchIn(iostream &s, bool paste, bool merge);
  115. private:
  116. vector<string> BuildPluginList(const string &Path);
  117. DeviceWin* NewDeviceWin(int n, int x, int y);
  118. DeviceWin* NewComment(int n, int x, int y);
  119. HostInfo m_Info;
  120. bool m_ResetingAudioThread, m_HostNeedsUpdate, m_Frozen;
  121. static DeviceGUIInfo BuildDeviceGUIInfo(PluginInfo &PInfo);
  122. // currently static, to allow the callback
  123. // cb_UpdatePluginInfo to access the map.
  124. static map<int,DeviceWin*> m_DeviceWinMap;
  125. int m_NextID;
  126. static bool m_CallbackUpdateMode;
  127. static bool m_BlockingOutputPluginIsReady;
  128. string m_FilePath, m_MergeFilePath;
  129. // Main GUI stuff
  130. void CreateGUI (int xoff=0, int yoff=0, char *name="");
  131. Fl_Menu_Bar *m_MainMenu;
  132. Fl_Pack *m_Topbar, *m_ToolbarPanel, *m_Toolbar;
  133. Fl_Group *m_GroupFiller;
  134. Fl_Button *m_Load, *m_Save, *m_New, *m_Options, *m_NewComment;
  135. Fl_Pack *m_PlayResetGroup;
  136. Fl_Button *m_PlayPause, *m_Reset;
  137. Fl_Tabs *m_GroupTab;
  138. Fl_Canvas *m_Canvas;
  139. Fl_Scroll *m_CanvasScroll;
  140. map<string,Fl_Pack*> m_PluginGroupMap;
  141. SettingsWindow *m_SettingsWindow;
  142. SpiralWindowType* m_TopWindow;
  143. vector<Fl_Button*> m_DeviceVec;
  144. ChannelHandler m_CH; // used for threadsafe communication
  145. DeviceGroup m_Copied;
  146. inline void cb_NewComment_i(Fl_Button* o, void* v);
  147. static void cb_NewComment(Fl_Button* o, void* v);
  148. // File menu - and associated buttons, etc.
  149. inline void cb_New_i (Fl_Widget *o, void *v);
  150. static void cb_New (Fl_Widget *o, void *v);
  151. inline void cb_Load_i (Fl_Widget *o, void *v);
  152. static void cb_Load (Fl_Widget *o, void *v);
  153. inline void cb_Save_i (Fl_Widget *o, void *v);
  154. static void cb_Save (Fl_Widget *o, void *v);
  155. inline void cb_Merge_i (Fl_Widget *o, void *v);
  156. static void cb_Merge (Fl_Widget *o, void *v);
  157. inline void cb_Close_i (Fl_Widget *o, void *v);
  158. static void cb_Close (Fl_Widget *o, void *v);
  159. // Edit menu
  160. inline void cb_Cut_i (Fl_Widget *o, void *v);
  161. static void cb_Cut (Fl_Widget *o, void *v);
  162. inline void cb_Copy_i (Fl_Widget *o, void *v);
  163. static void cb_Copy (Fl_Widget *o, void *v);
  164. inline void cb_Paste_i (Fl_Widget *o, void *v);
  165. static void cb_Paste (Fl_Widget *o, void *v);
  166. inline void cb_Delete_i (Fl_Widget *o, void *v);
  167. static void cb_Delete (Fl_Widget *o, void *v);
  168. inline void cb_Options_i (Fl_Widget *o, void *v);
  169. static void cb_Options (Fl_Widget *o, void *v);
  170. // Plugin Menu
  171. inline void cb_NewDevice_i (Fl_Button *o, void *v);
  172. static void cb_NewDevice (Fl_Button *o, void *v);
  173. inline void cb_NewDeviceFromMenu_i (Fl_Widget *o, void *v);
  174. static void cb_NewDeviceFromMenu (Fl_Widget *o, void *v);
  175. inline void cb_NewDeviceFromCanvasMenu_i (Fl_Canvas *o, void *v);
  176. static void cb_NewDeviceFromCanvasMenu (Fl_Canvas *o, void *v);
  177. // Audio Menu
  178. inline void cb_PlayPause_i (Fl_Widget *o, void *v);
  179. static void cb_PlayPause (Fl_Widget *o, void *v);
  180. inline void cb_Reset_i (Fl_Widget *o, void *v);
  181. static void cb_Reset (Fl_Widget *o, void *v);
  182. inline void cb_Connection_i(Fl_Canvas* o, void* v);
  183. static void cb_Connection(Fl_Canvas* o, void* v);
  184. inline void cb_Unconnect_i(Fl_Canvas* o, void* v);
  185. static void cb_Unconnect(Fl_Canvas* o, void* v);
  186. inline void cb_GroupTab_i(Fl_Tabs* o, void* v);
  187. static void cb_GroupTab(Fl_Tabs* o, void* v);
  188. static void cb_Update(void* o, bool Mode);
  189. static void cb_Blocking(void* o, bool Mode);
  190. static void cb_UpdatePluginInfo(int ID, void *PluginInfo);
  191. inline void cb_ChangeBufferAndSampleRate_i(long int NewBufferSize, long int NewSamplerate);
  192. static void cb_ChangeBufferAndSampleRate(long unsigned int NewBufferSize, long unsigned int NewSamplerate, void *o)
  193. {
  194. ((SynthModular*)o)->cb_ChangeBufferAndSampleRate_i(NewBufferSize, NewSamplerate);
  195. }
  196. friend istream &operator>>(istream &s, SynthModular &o);
  197. friend ostream &operator<<(ostream &s, SynthModular &o);
  198. };
  199. iostream &operator>>(iostream &s, SynthModular &o);
  200. ostream &operator<<(ostream &s, SynthModular &o);
  201. #endif