From 0ac5eaf54271dfcd2df47d83b06c083110a6282c Mon Sep 17 00:00:00 2001 From: nebogeo Date: Sun, 10 Nov 2002 03:20:46 +0000 Subject: [PATCH] Fixed in app port connection, disconnection and other stuff. --- SpiralSound/Plugins/JackPlugin/JackPlugin.C | 94 ++++++------ SpiralSound/Plugins/JackPlugin/JackPlugin.h | 2 + .../Plugins/JackPlugin/JackPluginGUI.C | 135 +++++++++++------- .../Plugins/JackPlugin/JackPluginGUI.h | 2 +- 4 files changed, 139 insertions(+), 94 deletions(-) diff --git a/SpiralSound/Plugins/JackPlugin/JackPlugin.C b/SpiralSound/Plugins/JackPlugin/JackPlugin.C index 9d6ac70..9659ff6 100644 --- a/SpiralSound/Plugins/JackPlugin/JackPlugin.C +++ b/SpiralSound/Plugins/JackPlugin/JackPlugin.C @@ -55,8 +55,6 @@ JackClient::~JackClient() bool JackClient::Attach() { if (m_Attached) return true; - - cerr<<"Attach"<Name=Name; @@ -92,7 +86,7 @@ bool JackClient::Attach() for (int n=0; nName=Name; @@ -111,10 +105,7 @@ bool JackClient::Attach() m_Attached=true; cerr<<"connected to jack..."<Connected) + if (jack_port_connected(m_InputPortMap[n]->Port)) { - if (m_InputPortMap[n]->Buf) - { - sample_t *in = (sample_t *) jack_port_get_buffer(m_InputPortMap[n]->Port, nframes); - memcpy (m_InputPortMap[n]->Buf, in, sizeof (sample_t) * m_BufferSize); - //cerr<<"got "<Buf[0]<<" from "<Name<Port, nframes); + memcpy (m_InputPortMap[n]->Buf, in, sizeof (sample_t) * m_BufferSize); + } } for (int n=0; nConnected) { if (m_OutputPortMap[n]->Buf) - { + { sample_t *out = (sample_t *) jack_port_get_buffer(m_OutputPortMap[n]->Port, nframes); memcpy (out, m_OutputPortMap[n]->Buf, sizeof (sample_t) * m_BufferSize); } else // no output availible, clear - { + { sample_t *out = (sample_t *) jack_port_get_buffer(m_OutputPortMap[n]->Port, nframes); memset (out, 0, sizeof (sample_t) * m_BufferSize); } } } - - + if(RunCallback&&RunContext) { // do the work @@ -243,6 +229,8 @@ void JackClient::GetPortNames(vector &InputNames, vector &Output // Input means input of SSM, so this connects jack sources to the plugin outputs void JackClient::ConnectInput(int n, const string &JackPort) { + if (!IsAttached()) return; + cerr<<"JackClient::ConnectInput: connecting source ["<Name<<"]"<ConnectedTo!="") @@ -265,6 +253,7 @@ void JackClient::ConnectInput(int n, const string &JackPort) // Output means output of SSM, so this connects plugin inputs to a jack destination void JackClient::ConnectOutput(int n, const string &JackPort) { + if (!IsAttached()) return; cerr<<"JackClient::ConnectOutput: connecting source ["<Name<<"] to dest ["<ConnectedTo!="") @@ -275,14 +264,45 @@ void JackClient::ConnectOutput(int n, const string &JackPort) } m_OutputPortMap[n]->ConnectedTo = JackPort; - if (jack_connect (m_Client, jack_port_name(m_OutputPortMap[n]->Port), JackPort.c_str())) cerr<<"JackClient::ConnectOutput: cannot connect output port [" <Name<<"] to ["<Connected=true; } +///////////////////////////////////////////////////////////////////////////////////////////// +// Input means input of SSM, so this connects jack sources to the plugin outputs +void JackClient::DisconnectInput(int n) +{ + if (!IsAttached()) return; + cerr<<"JackClient::DisconnectInput: Disconnecting input "<ConnectedTo!="") + { + if (jack_disconnect (m_Client, m_InputPortMap[n]->ConnectedTo.c_str(), jack_port_name(m_InputPortMap[n]->Port))) + cerr<<"JackClient::ConnectInput: cannot disconnect input port [" + <ConnectedTo<<"] from ["<Name<<"]"<Connected=false; +} + +///////////////////////////////////////////////////////////////////////////////////////////// +// Output means output of SSM, so this connects plugin inputs to a jack destination +void JackClient::DisconnectOutput(int n) +{ + if (!IsAttached()) return; + cerr<<"JackClient::DisconnectInput: Disconnecting input "<ConnectedTo!="") + { + if (jack_disconnect (m_Client, jack_port_name(m_OutputPortMap[n]->Port), m_OutputPortMap[n]->ConnectedTo.c_str())) + cerr<<"JackClient::ConnectOutput: cannot disconnect output port [" + <ConnectedTo<<"] from ["<Name<<"]"<Connected=false; +} ///////////////////////////////////////////////////////////////////////////////////////////// void JackClient::SetInputBuf(int ID, float* s) @@ -327,7 +347,7 @@ m_Connected(false) m_PluginInfo.Name="Jack"; m_PluginInfo.Width=200; - m_PluginInfo.Height=415; + m_PluginInfo.Height=325; m_PluginInfo.NumInputs=NUM_OUTPUTS; m_PluginInfo.NumOutputs=NUM_INPUTS; @@ -390,28 +410,21 @@ void JackPlugin::Execute() void JackPlugin::ExecuteCommands() { // we want to process this whether we are connected to stuff or not - for (int n=0; nZero(); - } - JackClient* pJack=JackClient::Get(); - + // connect the buffers up if we are plugged into something for (int n=0; nSetOutputBuf(n,(float*)GetInput(n)->GetBuffer()); + pJack->SetOutputBuf(n,(float*)GetInput(n)->GetBuffer()); } else { - JackClient::Get()->SetOutputBuf(n,NULL); + pJack->SetOutputBuf(n,NULL); } } - // don't really want to do this all the time, as it only needs to - // be done once per attach. for (int n=0; nSetInputBuf(n,(float*)GetOutputBuf(n)->GetBuffer()); @@ -421,10 +434,10 @@ void JackPlugin::ExecuteCommands() { switch (m_AudioCH->GetCommand()) { - case ATTACH : Attach(); break; + /*case ATTACH : Attach(); break; case DETACH : Detach(); break; - case CONNECTINPUT : ConnectInput(m_GUIArgs.Num,m_GUIArgs.Port); break; - case CONNECTOUTPUT : ConnectOutput(m_GUIArgs.Num,m_GUIArgs.Port); break; + case CONNECTINPUT : pJack->ConnectInput(m_GUIArgs.Num,m_GUIArgs.Port); break; + case CONNECTOUTPUT : pJack->ConnectOutput(m_GUIArgs.Num,m_GUIArgs.Port); break; */ case UPDATE_NAMES : { int c=0; @@ -451,6 +464,7 @@ void JackPlugin::ExecuteCommands() m_NumOutputPortNames=OutputNames.size(); } break; + default : break; } } m_Connected=JackClient::Get()->IsAttached(); diff --git a/SpiralSound/Plugins/JackPlugin/JackPlugin.h b/SpiralSound/Plugins/JackPlugin/JackPlugin.h index 54d3cea..bada460 100644 --- a/SpiralSound/Plugins/JackPlugin/JackPlugin.h +++ b/SpiralSound/Plugins/JackPlugin/JackPlugin.h @@ -46,6 +46,8 @@ public: void GetPortNames(vector &InputNames,vector &OutputNames); void ConnectInput(int n, const string &JackPort); void ConnectOutput(int n, const string &JackPort); + void DisconnectInput(int n); + void DisconnectOutput(int n); string GetInputName(int ID) { return m_InputPortMap[ID]->Name; } string GetOutputName(int ID) { return m_OutputPortMap[ID]->Name; } void SetInputBuf(int ID, float* s); diff --git a/SpiralSound/Plugins/JackPlugin/JackPluginGUI.C b/SpiralSound/Plugins/JackPlugin/JackPluginGUI.C index f1cc0ed..ea75d4b 100644 --- a/SpiralSound/Plugins/JackPlugin/JackPluginGUI.C +++ b/SpiralSound/Plugins/JackPlugin/JackPluginGUI.C @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "JackPlugin.h" #include "JackPluginGUI.h" #include #include @@ -80,41 +81,43 @@ SpiralPluginGUI(w,h,o,ch) { for (int n=0; n<255; n++) Numbers[n]=n; - m_Indicator = new Fl_LED_Button(85,17,30,30,""); + m_Indicator = new Fl_LED_Button(85,15,30,30,""); m_Indicator->value(0); m_Indicator->color(FL_RED); - m_Attach = new Fl_Button(5,50,190,20,"Attach"); + m_Attach = new Fl_Button(5,40,190,20,"Attach"); m_Attach->type(0); m_Attach->labelsize(10); m_Attach->callback((Fl_Callback*)cb_Attach); - m_Detach = new Fl_Button(5,70,190,20,"Detach"); + m_Detach = new Fl_Button(5,60,190,20,"Detach"); m_Detach->type(0); m_Detach->labelsize(10); m_Detach->callback((Fl_Callback*)cb_Detach); - int yoff=90; + int yoff=80; for (int n=0; nlabelsize(10); - m_OutputLabel[n]->labeltype(FL_ENGRAVED_LABEL); - m_OutputButton[n] = new Fl_Button(5,n*40+yoff+20,95,20,"None yet"); - m_OutputButton[n]->labelsize(10); + m_OutputLabel[n] = new Fl_Box(5,n*30+yoff,95,10,m_OutputName[n]); + m_OutputLabel[n]->labelsize(8); + //m_OutputLabel[n]->labeltype(FL_ENGRAVED_LABEL); + m_OutputButton[n] = new Fl_Button(5,n*30+yoff+10,95,20,"None"); + m_OutputButton[n]->type(1); + m_OutputButton[n]->labelsize(8); m_OutputButton[n]->callback((Fl_Callback*)cb_OutputConnect,&Numbers[n]); } for (int n=0; nlabelsize(10); - m_InputLabel[n]->labeltype(FL_ENGRAVED_LABEL); - m_InputButton[n] = new Fl_Button(100,n*40+yoff+20,95,20,"None yet"); - m_InputButton[n]->labelsize(10); + m_InputLabel[n] = new Fl_Box(100,n*30+yoff,95,10,m_InputName[n]); + m_InputLabel[n]->labelsize(8); + //m_InputLabel[n]->labeltype(FL_ENGRAVED_LABEL); + m_InputButton[n] = new Fl_Button(100,n*30+yoff+10,95,20,"None"); + m_InputButton[n]->type(1); + m_InputButton[n]->labelsize(8); m_InputButton[n]->callback((Fl_Callback*)cb_InputConnect,&Numbers[n]); } @@ -126,48 +129,62 @@ void JackPluginGUI::UpdateValues(SpiralPlugin *o) } -void JackPluginGUI::draw() -{ - SpiralPluginGUI::draw(); +void JackPluginGUI::Update() +{ m_Indicator->value(m_GUICH->GetBool("Connected")); -}; + redraw(); +} //// Callbacks //// inline void JackPluginGUI::cb_Attach_i(Fl_Button* o, void* v) { - m_GUICH->SetCommand(JackPlugin::ATTACH); + //m_GUICH->SetCommand(JackPlugin::ATTACH); + JackClient::Get()->Attach(); } void JackPluginGUI::cb_Attach(Fl_Button* o, void* v) { ((JackPluginGUI*)(o->parent()))->cb_Attach_i(o,v);} inline void JackPluginGUI::cb_Detach_i(Fl_Button* o, void* v) { - m_GUICH->SetCommand(JackPlugin::DETACH); + //m_GUICH->SetCommand(JackPlugin::DETACH); + JackClient::Get()->Detach(); } void JackPluginGUI::cb_Detach(Fl_Button* o, void* v) { ((JackPluginGUI*)(o->parent()))->cb_Detach_i(o,v);} inline void JackPluginGUI::cb_OutputConnect_i(Fl_Button* o, void* v) { - m_GUICH->SetCommand(JackPlugin::UPDATE_NAMES); - m_GUICH->Wait(); - - // bit of a hack for multithreaded safety - int ninputs=m_GUICH->GetInt("NumOutputPortNames"); - char inputs[MAX_INPUTPORTS][256]; - m_GUICH->GetData("InputPortNames",inputs); + if (o->value()) + { + m_GUICH->SetCommand(JackPlugin::UPDATE_NAMES); + m_GUICH->Wait(); - vector Inputs; - for (int n=0; nGetInt("NumOutputPortNames"); + char inputs[MAX_INPUTPORTS][256]; + m_GUICH->GetData("InputPortNames",inputs); - // connect this plugin's output to a jack input - if (choice>0) + vector Inputs; + for (int n=0; n0) + { + //m_GUICH->Set("Num",(*(int*)v)); + //m_GUICH->SetData("Port",inputs[choice-1]); + //m_GUICH->SetCommand(JackPlugin::CONNECTOUTPUT); + + JackClient::Get()->ConnectOutput((*(int*)v),inputs[choice-1]); + + o->label(inputs[choice-1]); + o->redraw(); + } + } + else { - m_GUICH->Set("Num",(*(int*)v)); - m_GUICH->SetData("Port",inputs[choice-1]); - m_GUICH->SetCommand(JackPlugin::CONNECTOUTPUT); - o->label(inputs[choice-1]); + JackClient::Get()->DisconnectOutput((*(int*)v)); + o->label("None"); o->redraw(); } } @@ -176,25 +193,37 @@ void JackPluginGUI::cb_OutputConnect(Fl_Button* o, void* v) inline void JackPluginGUI::cb_InputConnect_i(Fl_Button* o, void* v) { - m_GUICH->SetCommand(JackPlugin::UPDATE_NAMES); - m_GUICH->Wait(); - - // bit of a hack for multithreaded safety - int noutputs=m_GUICH->GetInt("NumOutputPortNames"); - char outputs[MAX_OUTPUTPORTS][256]; - m_GUICH->GetData("OutputPortNames",outputs); + if (o->value()) + { + m_GUICH->SetCommand(JackPlugin::UPDATE_NAMES); + m_GUICH->Wait(); - vector Outputs; - for (int n=0; n0) + // bit of a hack for multithreaded safety + int noutputs=m_GUICH->GetInt("NumOutputPortNames"); + char outputs[MAX_OUTPUTPORTS][256]; + m_GUICH->GetData("OutputPortNames",outputs); + + vector Outputs; + for (int n=0; n0) + { + //m_GUICH->Set("Num",(*(int*)v)); + //m_GUICH->SetData("Port",outputs[choice-1]); + //m_GUICH->SetCommand(JackPlugin::CONNECTINPUT); + + JackClient::Get()->ConnectInput((*(int*)v),outputs[choice-1]); + + o->label(outputs[choice-1]); + o->redraw(); + } + } + else { - m_GUICH->Set("Num",(*(int*)v)); - m_GUICH->SetData("Port",outputs[choice-1]); - m_GUICH->SetCommand(JackPlugin::CONNECTINPUT); - o->label(outputs[choice-1]); + JackClient::Get()->DisconnectInput((*(int*)v)); + o->label("None"); o->redraw(); } } diff --git a/SpiralSound/Plugins/JackPlugin/JackPluginGUI.h b/SpiralSound/Plugins/JackPlugin/JackPluginGUI.h index 885c824..fee5fe2 100644 --- a/SpiralSound/Plugins/JackPlugin/JackPluginGUI.h +++ b/SpiralSound/Plugins/JackPlugin/JackPluginGUI.h @@ -38,7 +38,7 @@ public: JackPluginGUI(int w, int h, JackPlugin *o,ChannelHandler *ch,const HostInfo *Info); virtual void UpdateValues(SpiralPlugin *o); - virtual void draw(); + virtual void Update(); private: