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.

329 lines
8.7KB

  1. /* SpiralPlugin
  2. * Copyleft (C) 2000 David Griffiths <dave@pawfal.org>
  3. * LADSPA Plugin by Nicolas Noble <nicolas@nobis-crew.org>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. #include "LADSPAPluginGUI.h"
  20. #include <FL/fl_draw.h>
  21. #include <FL/fl_draw.H>
  22. #include "ladspa.h"
  23. #include <cstdio>
  24. #include <cmath>
  25. #include <dlfcn.h>
  26. #include <vector>
  27. #include "utils.h"
  28. static const int GUI_COLOUR = 179;
  29. static const int GUIBG_COLOUR = 144;
  30. static const int GUIBG2_COLOUR = 145;
  31. LADSPAPluginGUI::LADSPAPluginGUI(int w, int h,LADSPAPlugin *o, ChannelHandler *ch,const HostInfo *Info, const vector<LPluginInfo> &PVec) :
  32. SpiralPluginGUI(w,h,o,ch)
  33. {
  34. PluginList=PVec;
  35. m_Filename="None";
  36. int Width=20;
  37. int Height=100;
  38. m_Browser= new Fl_Hold_Browser(5,20,290,260,"LADSPA Plugins");
  39. m_Browser->callback((Fl_Callback*)cb_Select);
  40. for (vector<LPluginInfo>::iterator i=PluginList.begin();
  41. i!=PluginList.end(); i++)
  42. {
  43. m_Browser->add((*i).Name.c_str());
  44. }
  45. // Get maximum input port count
  46. m_GUICH->GetData("GetMaxInputPortCount",&(m_InData.MaxInputPorts));
  47. // Set up buffers for data transfer via ChannelHandler
  48. m_InData.InputPortNames = (char *)malloc(256 * m_InData.MaxInputPorts);
  49. m_InData.InputPortRanges = (PortRange *)malloc(sizeof(PortRange) * m_InData.MaxInputPorts);
  50. if (!(m_InData.InputPortNames && m_InData.InputPortRanges)) {
  51. cerr<<"Memory allocation error\n"<<endl;
  52. }
  53. m_InputScroll = new Fl_Scroll(300,80,290,150," Value Min Max Clamp?");
  54. m_InputScroll->align(FL_ALIGN_TOP_LEFT);
  55. m_InputScroll->type(Fl_Scroll::VERTICAL);
  56. m_InputScroll->box(FL_DOWN_BOX);
  57. add(m_InputScroll);
  58. m_InputPack = new Fl_Pack(300,85,300,100,"");
  59. m_InputScroll->add(m_InputPack);
  60. m_Name = new Fl_Box(290,20,10,20,"None");
  61. m_Name->align(FL_ALIGN_RIGHT);
  62. m_Name->labelcolor(GUI_COLOUR);
  63. m_Name->labelsize(10);
  64. add(m_Name);
  65. m_Maker = new Fl_Box(290,40,10,20,"None");
  66. m_Maker->align(FL_ALIGN_RIGHT);
  67. m_Maker->labelcolor(GUI_COLOUR);
  68. m_Maker->labelsize(10);
  69. add(m_Maker);
  70. m_OutputGain = new Fl_Knob(545,240,40,40,"Output Gain");
  71. m_OutputGain->color(GUI_COLOUR);
  72. m_OutputGain->type(Fl_Knob::DOTLIN);
  73. m_OutputGain->maximum(2);
  74. m_OutputGain->step(0.001);
  75. m_OutputGain->value(1.0);
  76. m_OutputGain->labelsize(10);
  77. m_OutputGain->callback((Fl_Callback*)cb_Gain);
  78. add(m_OutputGain);
  79. m_UpdateInputs = new Fl_Button(480,252,50,25,"Refresh");
  80. m_UpdateInputs->labelsize(10);
  81. m_UpdateInputs->value(1);
  82. m_UpdateInputs->type(1);
  83. add(m_UpdateInputs);
  84. m_UpdateMinMax = new Fl_Button(400,252,85,25,"Update Min/Max");
  85. m_UpdateMinMax->labelsize(10);
  86. m_UpdateMinMax->callback((Fl_Callback*)cb_MinMax);
  87. add(m_UpdateMinMax);
  88. m_PowerAmp = new Fl_Button(320,252,80,25,"PowerAmp");
  89. m_PowerAmp->labelsize(10);
  90. m_PowerAmp->value(0);
  91. m_PowerAmp->type(1);
  92. m_PowerAmp->callback((Fl_Callback*)cb_PowerAmp);
  93. add(m_PowerAmp);
  94. end();
  95. }
  96. LADSPAPluginGUI::~LADSPAPluginGUI(void)
  97. {
  98. if (m_InData.InputPortNames) free(m_InData.InputPortNames);
  99. if (m_InData.InputPortRanges) free(m_InData.InputPortRanges);
  100. Fl::check();
  101. }
  102. void LADSPAPluginGUI::UpdatePortDisplay(int n, float v)
  103. {
  104. if (!m_UpdateInputs->value()) return;
  105. char temp[256];
  106. sprintf(temp,"%.4f",v);
  107. m_PortOutput[n]->value(temp);
  108. }
  109. void LADSPAPluginGUI::SetMinMax(int n, float min, float max, bool clamp)
  110. {
  111. char temp[256];
  112. sprintf(temp,"%.4f",min);
  113. m_PortMin[n]->value(temp);
  114. sprintf(temp,"%.4f",max);
  115. m_PortMax[n]->value(temp);
  116. sprintf(temp, "%d",clamp);
  117. m_PortClamp[n]->value(atoi(temp));
  118. }
  119. void LADSPAPluginGUI::GetMinMax(int n, float &min, float &max, bool &clamp)
  120. {
  121. min = atof(m_PortMin[n]->value());
  122. max = atof(m_PortMax[n]->value());
  123. clamp = m_PortClamp[n]->value();
  124. }
  125. void LADSPAPluginGUI::SetName(const char *s)
  126. {
  127. m_Name->label(s);
  128. }
  129. void LADSPAPluginGUI::SetMaker(const char *s)
  130. {
  131. m_Maker->label(s);
  132. }
  133. void LADSPAPluginGUI::ClearPortInfo()
  134. {
  135. for (vector<Fl_Group*>::iterator i=m_PackVec.begin();
  136. i!=m_PackVec.end(); i++)
  137. {
  138. m_InputPack->remove((*i));
  139. }
  140. m_InputScroll->remove(m_InputPack);
  141. delete m_InputPack;
  142. m_InputPack = new Fl_Pack(x()+300,y()+85,300,100,"");
  143. m_InputScroll->add(m_InputPack);
  144. m_PortOutput.clear();
  145. m_PackVec.clear();
  146. m_PortMin.clear();
  147. m_PortMax.clear();
  148. m_PortClamp.clear();
  149. }
  150. void LADSPAPluginGUI::AddPortInfo(const char *Info)
  151. {
  152. Fl_Group* NewGroup = new Fl_Group(0,85,150,15,"");
  153. NewGroup->box(FL_FLAT_BOX);
  154. m_InputPack->add(NewGroup);
  155. m_PackVec.push_back(NewGroup);
  156. Fl_Box* NewText = new Fl_Box(100,85,80,15,"");
  157. NewText->label(Info);
  158. NewText->labelsize(8);
  159. NewText->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
  160. NewGroup->add(NewText);
  161. Fl_Output* NewOutput = new Fl_Output(5,85,20,15,"");
  162. NewOutput->value(0);
  163. NewOutput->textsize(10);
  164. NewGroup->add(NewOutput);
  165. m_PortOutput.push_back(NewOutput);
  166. Fl_Input* NewInput = new Fl_Input(26,85,20,15,"");
  167. NewInput->value(0);
  168. NewInput->textsize(10);
  169. NewGroup->add(NewInput);
  170. m_PortMin.push_back(NewInput);
  171. NewInput = new Fl_Input(47,85,20,15,"");
  172. NewInput->value(0);
  173. NewInput->textsize(10);
  174. NewGroup->add(NewInput);
  175. m_PortMax.push_back(NewInput);
  176. Fl_Check_Button* NewCheckButton = new Fl_Check_Button(80,85,15,15,"");
  177. NewCheckButton->value(0);
  178. NewGroup->add(NewCheckButton);
  179. m_PortClamp.push_back(NewCheckButton);
  180. NewGroup->redraw();
  181. m_InputPack->redraw();
  182. m_InputScroll->redraw();
  183. redraw();
  184. }
  185. void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o)
  186. {
  187. LADSPAPlugin* Plugin = (LADSPAPlugin*)o;
  188. m_OutputGain->value(Plugin->GetGain());
  189. m_PowerAmp->value(Plugin->GetAmped());
  190. SetName(Plugin->GetName());
  191. SetMaker(Plugin->GetMaker());
  192. unsigned long n = Plugin->GetInputPortCount();
  193. const char *name;
  194. PortRange range;
  195. for (unsigned long p = 0; p < n; p++) {
  196. name = Plugin->GetPortName(p);
  197. range = Plugin->GetPortRange(p);
  198. AddPortInfo(name);
  199. SetMinMax(p, range.Min, range.Max, range.Clamp);
  200. }
  201. }
  202. inline void LADSPAPluginGUI::cb_Gain_i(Fl_Knob* o, void* v)
  203. {
  204. m_GUICH->Set("SetGain",(float)(o->value()));
  205. }
  206. void LADSPAPluginGUI::cb_Gain(Fl_Knob* o, void* v)
  207. {
  208. ((LADSPAPluginGUI*)(o->parent()))->cb_Gain_i(o,v);
  209. }
  210. inline void LADSPAPluginGUI::cb_Select_i(Fl_Hold_Browser* o)
  211. {
  212. m_Filename=PluginList[o->value()-1].Filename;
  213. m_Label=PluginList[o->value()-1].Label;
  214. m_GUICH->Set("SetPluginIndex",o->value()-1);
  215. m_GUICH->SetCommand(LADSPAPlugin::SELECTPLUGIN);
  216. // Wait until next update for plugin to be loaded etc.
  217. m_GUICH->Wait();
  218. // Now get the new values to populate GUI controls
  219. m_GUICH->GetData("GetName", m_InData.Name);
  220. m_GUICH->GetData("GetMaker", m_InData.Maker);
  221. m_GUICH->GetData("GetInputPortCount", &(m_InData.InputPorts));
  222. m_GUICH->GetData("GetInputPortNames", m_InData.InputPortNames);
  223. m_GUICH->GetData("GetInputPortRanges", m_InData.InputPortRanges);
  224. SetName((const char *)m_InData.Name);
  225. SetMaker((const char *)m_InData.Maker);
  226. // Clear out port info, and refresh
  227. ClearPortInfo();
  228. for (unsigned long n = 0; n < m_InData.InputPorts; n++) {
  229. AddPortInfo((const char *)(m_InData.InputPortNames + n * 256));
  230. SetMinMax(n, m_InData.InputPortRanges[n].Min,
  231. m_InData.InputPortRanges[n].Max,
  232. m_InData.InputPortRanges[n].Clamp);
  233. }
  234. }
  235. void LADSPAPluginGUI::cb_Select(Fl_Hold_Browser* o)
  236. {
  237. ((LADSPAPluginGUI*)(o->parent()))->cb_Select_i(o);
  238. }
  239. inline void LADSPAPluginGUI::cb_MinMax_i(Fl_Button* o, void* v)
  240. {
  241. unsigned long n=0;
  242. for (vector<Fl_Input*>::iterator i=m_PortMin.begin();
  243. i!=m_PortMin.end(); i++)
  244. {
  245. m_InData.InputPortRanges[n].Min = atof((*i)->value());
  246. n++;
  247. }
  248. n=0;
  249. for (vector<Fl_Input*>::iterator i=m_PortMax.begin();
  250. i!=m_PortMax.end(); i++)
  251. {
  252. m_InData.InputPortRanges[n].Max = atof((*i)->value());
  253. n++;
  254. }
  255. n=0;
  256. for (vector<Fl_Check_Button*>::iterator i=m_PortClamp.begin();
  257. i!=m_PortClamp.end(); i++)
  258. {
  259. m_InData.InputPortRanges[n].Clamp = (bool)((*i)->value());
  260. n++;
  261. }
  262. m_GUICH->SetData("SetInputPortRanges", m_InData.InputPortRanges);
  263. m_GUICH->SetCommand(LADSPAPlugin::SETRANGES);
  264. }
  265. void LADSPAPluginGUI::cb_MinMax(Fl_Button* o, void* v)
  266. {
  267. ((LADSPAPluginGUI*)(o->parent()))->cb_MinMax_i(o,v);
  268. }
  269. inline void LADSPAPluginGUI::cb_PowerAmp_i(Fl_Button* o, void* v)
  270. {
  271. m_GUICH->Set("SetAmped",(bool)(o->value()));
  272. }
  273. void LADSPAPluginGUI::cb_PowerAmp(Fl_Button* o, void* v)
  274. {
  275. ((LADSPAPluginGUI*)(o->parent()))->cb_PowerAmp_i(o,v);
  276. }