@@ -336,38 +336,31 @@ inline void Fl_Canvas::cb_OnDrag_i(Fl_Widget* widget, int xoffset,int yoffset) | |||||
o->position(o->x() + xoffset, o->y() + yoffset); | o->position(o->x() + xoffset, o->y() + yoffset); | ||||
} | } | ||||
} | } | ||||
} | |||||
} | |||||
} | } | ||||
return; | return; | ||||
} | } | ||||
inline void Fl_Canvas::cb_DeleteDeviceGroup_i() | |||||
{ | |||||
if (! m_HaveSelection) | |||||
return; | |||||
//show some warning here | |||||
for (unsigned int i=0; i<m_Selection.m_DeviceIds.size(); i++) | |||||
{ | |||||
int ID = m_Selection.m_DeviceIds[i]; | |||||
Fl_DeviceGUI* o = FindDevice(ID); | |||||
if (o) | |||||
{ | |||||
Fl_DeviceGUI::Kill(o); | |||||
} | |||||
} | |||||
m_HaveSelection=false; | |||||
m_Selection.Clear(); | |||||
redraw(); | |||||
void Fl_Canvas::DeleteSelection (void) { | |||||
if (! m_HaveSelection) return; | |||||
// show some warning here | |||||
for (unsigned int i=0; i<m_Selection.m_DeviceIds.size(); i++) { | |||||
int ID = m_Selection.m_DeviceIds[i]; | |||||
Fl_DeviceGUI* o = FindDevice(ID); | |||||
if (o) Fl_DeviceGUI::Kill(o); | |||||
} | |||||
m_HaveSelection = false; | |||||
m_Selection.Clear(); | |||||
redraw(); | |||||
} | } | ||||
inline void Fl_Canvas::cb_DeleteDeviceGroup_i() { | |||||
DeleteSelection (); | |||||
} | |||||
void Fl_Canvas::PopupEditMenu(Fl_Group *group) | void Fl_Canvas::PopupEditMenu(Fl_Group *group) | ||||
{ | { | ||||
if (! (m_Menu)) | |||||
if (! (m_Menu)) | |||||
{ | { | ||||
m_Menu = new Fl_Menu_Button(Fl::event_x(),Fl::event_x(),4,4,"Edit"); | m_Menu = new Fl_Menu_Button(Fl::event_x(),Fl::event_x(),4,4,"Edit"); | ||||
m_Menu->type(Fl_Menu_Button::POPUP123); | m_Menu->type(Fl_Menu_Button::POPUP123); | ||||
@@ -61,12 +61,12 @@ class CanvasGroup | |||||
{ | { | ||||
public: | public: | ||||
CanvasGroup() { Clear(); } | CanvasGroup() { Clear(); } | ||||
void Clear() | |||||
void Clear() | |||||
{ | { | ||||
m_DeviceIds.clear(); | m_DeviceIds.clear(); | ||||
} | } | ||||
vector<int> m_DeviceIds; | vector<int> m_DeviceIds; | ||||
}; | }; | ||||
@@ -76,7 +76,7 @@ public: | |||||
Fl_Canvas(int x, int y, int w, int h, char *name); | Fl_Canvas(int x, int y, int w, int h, char *name); | ||||
~Fl_Canvas(); | ~Fl_Canvas(); | ||||
Fl_Menu_Button *m_Menu; | Fl_Menu_Button *m_Menu; | ||||
virtual void draw(); | virtual void draw(); | ||||
virtual int handle(int event); | virtual int handle(int event); | ||||
int globalhandle(int event); | int globalhandle(int event); | ||||
@@ -88,20 +88,19 @@ public: | |||||
void SetUnconnectCallback(Fl_Callback* s) { cb_Unconnect=s; } | void SetUnconnectCallback(Fl_Callback* s) { cb_Unconnect=s; } | ||||
void SetAddDeviceCallback(Fl_Callback* s) { cb_AddDevice=s; } | void SetAddDeviceCallback(Fl_Callback* s) { cb_AddDevice=s; } | ||||
void SetRenameCallback(Fl_Callback* s) { cb_Rename=s; } | void SetRenameCallback(Fl_Callback* s) { cb_Rename=s; } | ||||
void SetCutDeviceGroupCallback(Fl_Callback* s) { cb_CutDeviceGroup=s; } | void SetCutDeviceGroupCallback(Fl_Callback* s) { cb_CutDeviceGroup=s; } | ||||
void SetCopyDeviceGroupCallback(Fl_Callback* s) { cb_CopyDeviceGroup=s; } | void SetCopyDeviceGroupCallback(Fl_Callback* s) { cb_CopyDeviceGroup=s; } | ||||
void SetPasteDeviceGroupCallback(Fl_Callback* s) { cb_PasteDeviceGroup=s; } | void SetPasteDeviceGroupCallback(Fl_Callback* s) { cb_PasteDeviceGroup=s; } | ||||
void SetMergePatchCallback (Fl_Callback* s) { cb_MergePatch=s; } | |||||
void SetMergePatchCallback(Fl_Callback* s) { cb_MergePatch=s; } | |||||
void DeleteSelection (void); | |||||
void ClearConnections(Fl_DeviceGUI* Device); | void ClearConnections(Fl_DeviceGUI* Device); | ||||
void RemoveDevice(Fl_DeviceGUI* Device); | void RemoveDevice(Fl_DeviceGUI* Device); | ||||
void Clear(); | void Clear(); | ||||
void AddPluginName(const string &s, int ID) | |||||
void AddPluginName(const string &s, int ID) | |||||
{ m_PluginNameList.push_back(pair<string,int>(s,ID)); } | { m_PluginNameList.push_back(pair<string,int>(s,ID)); } | ||||
GraphSort* GetGraph() { return &m_Graph; } | GraphSort* GetGraph() { return &m_Graph; } | ||||
void Poll(); | void Poll(); | ||||
void ToTop(Fl_DeviceGUI *o); | void ToTop(Fl_DeviceGUI *o); | ||||
@@ -113,38 +112,38 @@ public: | |||||
void StreamWiresIn(istream &s, bool merge, bool paste); | void StreamWiresIn(istream &s, bool merge, bool paste); | ||||
static void AppendSelection(int DeviceId, Fl_Canvas *data) | static void AppendSelection(int DeviceId, Fl_Canvas *data) | ||||
{ | |||||
{ | |||||
Fl_DeviceGUI *o = data->FindDevice(DeviceId); | Fl_DeviceGUI *o = data->FindDevice(DeviceId); | ||||
if (o) | if (o) | ||||
{ | { | ||||
data->m_HaveSelection = true; | |||||
data->m_HaveSelection = true; | |||||
data->m_Selection.m_DeviceIds.push_back(DeviceId); | data->m_Selection.m_DeviceIds.push_back(DeviceId); | ||||
o->SetOnDragCallback(Fl_Canvas::cb_OnDrag_s, data); | o->SetOnDragCallback(Fl_Canvas::cb_OnDrag_s, data); | ||||
data->redraw(); | |||||
} | |||||
data->redraw(); | |||||
} | |||||
} | } | ||||
static void ClearSelection(Fl_Canvas *data) | |||||
{ | |||||
data->m_HaveSelection=false; | |||||
data->m_Selection.Clear(); | |||||
static void ClearSelection(Fl_Canvas *data) | |||||
{ | |||||
data->m_HaveSelection=false; | |||||
data->m_Selection.Clear(); | |||||
data->redraw(); | data->redraw(); | ||||
} | } | ||||
static void EnablePaste(Fl_Canvas *data) | |||||
{ | |||||
data->m_CanPaste=true; | |||||
static void EnablePaste(Fl_Canvas *data) | |||||
{ | |||||
data->m_CanPaste=true; | |||||
} | } | ||||
bool HaveSelection() {return m_HaveSelection; } | bool HaveSelection() {return m_HaveSelection; } | ||||
CanvasGroup Selection() { return m_Selection; } | CanvasGroup Selection() { return m_Selection; } | ||||
static void SetDeviceCallbacks(Fl_DeviceGUI *device, Fl_Canvas *data) | static void SetDeviceCallbacks(Fl_DeviceGUI *device, Fl_Canvas *data) | ||||
{ | |||||
{ | |||||
device->SetOnDragCallback(Fl_Canvas::cb_OnDrag_s, data); | device->SetOnDragCallback(Fl_Canvas::cb_OnDrag_s, data); | ||||
device->SetOnClickCallback(Fl_Canvas::cb_OnDragClick_s, data); | device->SetOnClickCallback(Fl_Canvas::cb_OnDragClick_s, data); | ||||
} | |||||
} | |||||
private: | private: | ||||
void DrawSelection(); | void DrawSelection(); | ||||
@@ -158,22 +157,22 @@ private: | |||||
Fl_Image *m_BG; | Fl_Image *m_BG; | ||||
char *m_BGData; | char *m_BGData; | ||||
void (*cb_Connection)(Fl_Widget*, void*); | void (*cb_Connection)(Fl_Widget*, void*); | ||||
void (*cb_Unconnect)(Fl_Widget*, void*); | void (*cb_Unconnect)(Fl_Widget*, void*); | ||||
void (*cb_AddDevice)(Fl_Widget*, void*); | void (*cb_AddDevice)(Fl_Widget*, void*); | ||||
void (*cb_Rename)(Fl_Widget*, void*); | void (*cb_Rename)(Fl_Widget*, void*); | ||||
void (*cb_CutDeviceGroup)(Fl_Widget*, void*); | void (*cb_CutDeviceGroup)(Fl_Widget*, void*); | ||||
void (*cb_CopyDeviceGroup)(Fl_Widget*, void*); | void (*cb_CopyDeviceGroup)(Fl_Widget*, void*); | ||||
void (*cb_PasteDeviceGroup)(Fl_Widget*, void*); | void (*cb_PasteDeviceGroup)(Fl_Widget*, void*); | ||||
void (*cb_MergePatch)(Fl_Widget*, void*); | void (*cb_MergePatch)(Fl_Widget*, void*); | ||||
map<int,int> MapNewDeviceIds; | map<int,int> MapNewDeviceIds; | ||||
vector<CanvasWire> m_WireVec; | vector<CanvasWire> m_WireVec; | ||||
CanvasWire m_IncompleteWire; | CanvasWire m_IncompleteWire; | ||||
bool m_ToolMenu, m_ButtonDown; | bool m_ToolMenu, m_ButtonDown; | ||||
int m_x,m_y,m_Selected; | int m_x,m_y,m_Selected; | ||||
vector< pair<string,int> > m_PluginNameList; | vector< pair<string,int> > m_PluginNameList; | ||||
@@ -181,17 +180,17 @@ private: | |||||
GraphSort m_Graph; | GraphSort m_Graph; | ||||
int m_UpdateTimer; | int m_UpdateTimer; | ||||
int m_DragX,m_DragY; | int m_DragX,m_DragY; | ||||
bool m_HaveSelection, m_Selecting; | bool m_HaveSelection, m_Selecting; | ||||
int m_StartSelectX,m_StartSelectY; | int m_StartSelectX,m_StartSelectY; | ||||
int m_EndSelectX,m_EndSelectY; | int m_EndSelectX,m_EndSelectY; | ||||
CanvasGroup m_Selection; | CanvasGroup m_Selection; | ||||
bool m_CanPaste; | bool m_CanPaste; | ||||
friend istream &operator>>(istream &s, Fl_Canvas &o); | friend istream &operator>>(istream &s, Fl_Canvas &o); | ||||
friend ostream &operator<<(ostream &s, Fl_Canvas &o); | |||||
friend ostream &operator<<(ostream &s, Fl_Canvas &o); | |||||
void PopupEditMenu(Fl_Group *group); | void PopupEditMenu(Fl_Group *group); | ||||
@@ -200,24 +199,24 @@ private: | |||||
inline void cb_OnDragClick_i(Fl_Widget* widget, int button,int shift_state) | inline void cb_OnDragClick_i(Fl_Widget* widget, int button,int shift_state) | ||||
{ | { | ||||
if ((button==3) && ((shift_state & FL_CTRL) != 0)) | if ((button==3) && ((shift_state & FL_CTRL) != 0)) | ||||
{ | |||||
{ | |||||
PopupEditMenu(widget->parent()); | PopupEditMenu(widget->parent()); | ||||
} | } | ||||
if ((widget) && (button==1)) | if ((widget) && (button==1)) | ||||
{ | { | ||||
int ID = ((Fl_DeviceGUI*)(widget->parent()))->GetID(); | int ID = ((Fl_DeviceGUI*)(widget->parent()))->GetID(); | ||||
std::vector<int>::iterator device_iter = std::find(m_Selection.m_DeviceIds.begin(), m_Selection.m_DeviceIds.end(), ID); | std::vector<int>::iterator device_iter = std::find(m_Selection.m_DeviceIds.begin(), m_Selection.m_DeviceIds.end(), ID); | ||||
if (((shift_state & FL_SHIFT) != 0) || ((shift_state & FL_CTRL) != 0)) | if (((shift_state & FL_SHIFT) != 0) || ((shift_state & FL_CTRL) != 0)) | ||||
{ | |||||
{ | |||||
if (m_HaveSelection) | if (m_HaveSelection) | ||||
{ | { | ||||
if (device_iter != m_Selection.m_DeviceIds.end()) | if (device_iter != m_Selection.m_DeviceIds.end()) | ||||
m_Selection.m_DeviceIds.erase(device_iter); | |||||
m_Selection.m_DeviceIds.erase(device_iter); | |||||
else | else | ||||
m_Selection.m_DeviceIds.push_back(ID); | |||||
} | |||||
m_Selection.m_DeviceIds.push_back(ID); | |||||
} | |||||
else | else | ||||
{ | { | ||||
m_Selection.Clear(); | m_Selection.Clear(); | ||||
@@ -232,7 +231,7 @@ private: | |||||
m_Selection.m_DeviceIds.push_back(ID); | m_Selection.m_DeviceIds.push_back(ID); | ||||
} | } | ||||
redraw(); | redraw(); | ||||
} | |||||
} | |||||
} | } | ||||
inline void cb_DeleteDeviceGroup_i(); | inline void cb_DeleteDeviceGroup_i(); | ||||
@@ -30,6 +30,7 @@ | |||||
#include <FL/Fl_Pack.H> | #include <FL/Fl_Pack.H> | ||||
#include <FL/Fl_Tile.H> | #include <FL/Fl_Tile.H> | ||||
#include <FL/Fl_Tabs.H> | #include <FL/Fl_Tabs.H> | ||||
#include <FL/Fl_Menu_Bar.H> | |||||
#include <sstream> | #include <sstream> | ||||
#include <iostream> | #include <iostream> | ||||
#include <fstream> | #include <fstream> | ||||
@@ -124,8 +125,8 @@ public: | |||||
m_ResetingAudioThread = true; | m_ResetingAudioThread = true; | ||||
ThawAll(); | |||||
} | |||||
ThawAll(); | |||||
} | |||||
} | } | ||||
// only for audio thread | // only for audio thread | ||||
@@ -140,8 +141,8 @@ private: | |||||
DeviceWin* NewComment(int n, int x, int y); | DeviceWin* NewComment(int n, int x, int y); | ||||
HostInfo m_Info; | HostInfo m_Info; | ||||
bool m_ResetingAudioThread; | |||||
bool m_HostNeedsUpdate; | |||||
bool m_ResetingAudioThread, m_HostNeedsUpdate, m_Frozen; | |||||
static DeviceGUIInfo BuildDeviceGUIInfo(PluginInfo &PInfo); | static DeviceGUIInfo BuildDeviceGUIInfo(PluginInfo &PInfo); | ||||
@@ -150,98 +151,80 @@ private: | |||||
static map<int,DeviceWin*> m_DeviceWinMap; | static map<int,DeviceWin*> m_DeviceWinMap; | ||||
int m_NextID; | int m_NextID; | ||||
static bool m_CallbackUpdateMode; | static bool m_CallbackUpdateMode; | ||||
static bool m_BlockingOutputPluginIsReady; | static bool m_BlockingOutputPluginIsReady; | ||||
string m_FilePath; | |||||
string m_MergeFilePath; | |||||
// Main GUI stuff | |||||
void CreateGUI(int xoff=0, int yoff=0, char *name=""); | |||||
Fl_Pack *m_Topbar, *m_ToolbarPanel, *m_Toolbar; | |||||
Fl_Group *m_GroupFiller; | |||||
Fl_Button *m_Load; | |||||
Fl_Button *m_Save; | |||||
Fl_Button *m_New; | |||||
Fl_Button *m_Options; | |||||
Fl_Button *m_NewComment; | |||||
Fl_Pack *m_PlayResetGroup; | |||||
Fl_Button *m_PlayPause; | |||||
Fl_Button *m_Reset; | |||||
string m_FilePath, m_MergeFilePath; | |||||
// Main GUI stuff | |||||
void CreateGUI (int xoff=0, int yoff=0, char *name=""); | |||||
Fl_Menu_Bar *m_MainMenu; | |||||
Fl_Pack *m_Topbar, *m_ToolbarPanel, *m_Toolbar; | |||||
Fl_Group *m_GroupFiller; | |||||
Fl_Button *m_Load, *m_Save, *m_New, *m_Options, *m_NewComment; | |||||
Fl_Pack *m_PlayResetGroup; | |||||
Fl_Button *m_PlayPause, *m_Reset; | |||||
Fl_Tabs *m_GroupTab; | Fl_Tabs *m_GroupTab; | ||||
Fl_Canvas *m_Canvas; | Fl_Canvas *m_Canvas; | ||||
Fl_Scroll *m_CanvasScroll; | Fl_Scroll *m_CanvasScroll; | ||||
map<string,Fl_Pack*> m_PluginGroupMap; | map<string,Fl_Pack*> m_PluginGroupMap; | ||||
SettingsWindow *m_SettingsWindow; | SettingsWindow *m_SettingsWindow; | ||||
SpiralWindowType* m_TopWindow; | SpiralWindowType* m_TopWindow; | ||||
vector<Fl_Button*> m_DeviceVec; | vector<Fl_Button*> m_DeviceVec; | ||||
ChannelHandler m_CH; // used for threadsafe communication | ChannelHandler m_CH; // used for threadsafe communication | ||||
bool m_Frozen; | |||||
DeviceGroup m_Copied; | |||||
inline void cb_NewDevice_i(Fl_Button* o, void* v); | |||||
static void cb_NewDevice(Fl_Button* o, void* v); | |||||
inline void cb_NewDeviceFromMenu_i(Fl_Canvas* o, void* v); | |||||
static void cb_NewDeviceFromMenu(Fl_Canvas* o, void* v); | |||||
inline void cb_NewComment_i(Fl_Button* o, void* v); | inline void cb_NewComment_i(Fl_Button* o, void* v); | ||||
static void cb_NewComment(Fl_Button* o, void* v); | static void cb_NewComment(Fl_Button* o, void* v); | ||||
inline void cb_Load_i(Fl_Button* o, void* v); | |||||
static void cb_Load(Fl_Button* o, void* v); | |||||
inline void cb_Save_i(Fl_Button* o, void* v); | |||||
static void cb_Save(Fl_Button* o, void* v); | |||||
inline void cb_New_i(Fl_Button* o, void* v); | |||||
static void cb_New(Fl_Button* o, void* v); | |||||
inline void cb_PlayPause_i(Fl_Button* o, void* v); | |||||
static void cb_PlayPause(Fl_Button* o, void* v); | |||||
inline void cb_Reset_i(Fl_Button* o, void* v); | |||||
static void cb_Reset(Fl_Button* o, void* v); | |||||
inline void cb_MergePatch_i(); | |||||
static void cb_MergePatch(Fl_Canvas* o, SynthModular*v) { v->cb_MergePatch_i(); }; | |||||
// File menu - and associated buttons, etc. | |||||
inline void cb_New_i (Fl_Widget *o, void *v); | |||||
static void cb_New (Fl_Widget *o, void *v); | |||||
inline void cb_Load_i (Fl_Widget *o, void *v); | |||||
static void cb_Load (Fl_Widget *o, void *v); | |||||
inline void cb_Save_i (Fl_Widget *o, void *v); | |||||
static void cb_Save (Fl_Widget *o, void *v); | |||||
inline void cb_Merge_i (Fl_Widget *o, void *v); | |||||
static void cb_Merge (Fl_Widget *o, void *v); | |||||
inline void cb_Close_i (Fl_Widget *o, void *v); | |||||
static void cb_Close (Fl_Widget *o, void *v); | |||||
// Edit menu | |||||
inline void cb_Cut_i (Fl_Widget *o, void *v); | |||||
static void cb_Cut (Fl_Widget *o, void *v); | |||||
inline void cb_Copy_i (Fl_Widget *o, void *v); | |||||
static void cb_Copy (Fl_Widget *o, void *v); | |||||
inline void cb_Paste_i (Fl_Widget *o, void *v); | |||||
static void cb_Paste (Fl_Widget *o, void *v); | |||||
inline void cb_Delete_i (Fl_Widget *o, void *v); | |||||
static void cb_Delete (Fl_Widget *o, void *v); | |||||
inline void cb_Options_i (Fl_Widget *o, void *v); | |||||
static void cb_Options (Fl_Widget *o, void *v); | |||||
// Plugin Menu | |||||
inline void cb_NewDevice_i (Fl_Button *o, void *v); | |||||
static void cb_NewDevice (Fl_Button *o, void *v); | |||||
inline void cb_NewDeviceFromMenu_i (Fl_Widget *o, void *v); | |||||
static void cb_NewDeviceFromMenu (Fl_Widget *o, void *v); | |||||
inline void cb_NewDeviceFromCanvasMenu_i (Fl_Canvas *o, void *v); | |||||
static void cb_NewDeviceFromCanvasMenu (Fl_Canvas *o, void *v); | |||||
// Audio Menu | |||||
inline void cb_PlayPause_i (Fl_Widget *o, void *v); | |||||
static void cb_PlayPause (Fl_Widget *o, void *v); | |||||
inline void cb_Reset_i (Fl_Widget *o, void *v); | |||||
static void cb_Reset (Fl_Widget *o, void *v); | |||||
inline void cb_Connection_i(Fl_Canvas* o, void* v); | inline void cb_Connection_i(Fl_Canvas* o, void* v); | ||||
static void cb_Connection(Fl_Canvas* o, void* v); | static void cb_Connection(Fl_Canvas* o, void* v); | ||||
inline void cb_Unconnect_i(Fl_Canvas* o, void* v); | inline void cb_Unconnect_i(Fl_Canvas* o, void* v); | ||||
static void cb_Unconnect(Fl_Canvas* o, void* v); | static void cb_Unconnect(Fl_Canvas* o, void* v); | ||||
inline void cb_Close_i(Fl_Window* o, void* v); | |||||
static void cb_Close(Fl_Window* o, void* v); | |||||
inline void cb_GroupTab_i(Fl_Tabs* o, void* v); | inline void cb_GroupTab_i(Fl_Tabs* o, void* v); | ||||
static void cb_GroupTab(Fl_Tabs* o, void* v); | static void cb_GroupTab(Fl_Tabs* o, void* v); | ||||
inline void cb_Rload_i(Fl_Button* o, void* v); | |||||
static void cb_Rload(Fl_Button* o, void* v); | |||||
static void cb_Update(void* o, bool Mode); | static void cb_Update(void* o, bool Mode); | ||||
static void cb_Blocking(void* o, bool Mode); | static void cb_Blocking(void* o, bool Mode); | ||||
static void cb_UpdatePluginInfo(int ID, void *PluginInfo); | static void cb_UpdatePluginInfo(int ID, void *PluginInfo); | ||||
inline void cb_ChangeBufferAndSampleRate_i(long int NewBufferSize, long int NewSamplerate); | |||||
inline void cb_ChangeBufferAndSampleRate_i(long int NewBufferSize, long int NewSamplerate); | |||||
static void cb_ChangeBufferAndSampleRate(long unsigned int NewBufferSize, long unsigned int NewSamplerate, void *o) | static void cb_ChangeBufferAndSampleRate(long unsigned int NewBufferSize, long unsigned int NewSamplerate, void *o) | ||||
{ | { | ||||
((SynthModular*)o)->cb_ChangeBufferAndSampleRate_i(NewBufferSize, NewSamplerate); | ((SynthModular*)o)->cb_ChangeBufferAndSampleRate_i(NewBufferSize, NewSamplerate); | ||||
} | } | ||||
DeviceGroup m_Copied; | |||||
inline void cb_CutDeviceGroup_i(); | |||||
inline void cb_CopyDeviceGroup_i(); | |||||
inline void cb_PasteDeviceGroup_i(); | |||||
static void cb_CutDeviceGroup(Fl_Canvas* o, SynthModular*v) { v->cb_CutDeviceGroup_i(); }; | |||||
static void cb_CopyDeviceGroup(Fl_Canvas* o, SynthModular*v) { v->cb_CopyDeviceGroup_i(); }; | |||||
static void cb_PasteDeviceGroup(Fl_Canvas* o, SynthModular*v) { v->cb_PasteDeviceGroup_i(); }; | |||||
friend istream &operator>>(istream &s, SynthModular &o); | friend istream &operator>>(istream &s, SynthModular &o); | ||||
friend ostream &operator<<(ostream &s, SynthModular &o); | friend ostream &operator<<(ostream &s, SynthModular &o); | ||||
}; | }; | ||||