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.

359 lines
9.8KB

  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 "LADSPAInfo.h"
  21. #include <FL/fl_draw.h>
  22. #include <FL/fl_draw.H>
  23. #include "ladspa.h"
  24. #include <cstdio>
  25. #include <cmath>
  26. #include <dlfcn.h>
  27. #include <vector>
  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,
  32. LADSPAPlugin *o,
  33. ChannelHandler *ch,
  34. const HostInfo *Info,
  35. const vector<LADSPAInfo::PluginEntry> &PVec) :
  36. SpiralPluginGUI(w,h,o,ch)
  37. {
  38. PluginList = PVec;
  39. int Width=20;
  40. int Height=100;
  41. // Get maximum input port count
  42. m_GUICH->GetData("GetMaxInputPortCount",&(m_InData.MaxInputPortCount));
  43. // Set up buffers for data transfer via ChannelHandler
  44. m_InData.InputPortNames = (char *)malloc(256 * m_InData.MaxInputPortCount);
  45. m_InData.InputPortSettings = (PortSettings *)malloc(sizeof(PortSettings) * m_InData.MaxInputPortCount);
  46. m_InData.InputPortValues = (float *)calloc(m_InData.MaxInputPortCount, sizeof(float));
  47. if (!(m_InData.InputPortNames && m_InData.InputPortSettings)) {
  48. cerr<<"Memory allocation error\n"<<endl;
  49. }
  50. // Set up widgets
  51. m_Browser = new Fl_Choice(60,20,420,20,"Plugin:");
  52. m_Browser->callback((Fl_Callback *)cb_Select);
  53. m_Browser->add("(None)");
  54. for (vector<LADSPAInfo::PluginEntry>::iterator i=PluginList.begin();
  55. i!=PluginList.end(); i++)
  56. {
  57. m_Browser->add(i->Name.c_str());
  58. }
  59. m_Name = new Fl_Box(10,45,480,20,"None");
  60. m_Name->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
  61. m_Name->labelcolor(GUI_COLOUR);
  62. m_Name->labelsize(10);
  63. add(m_Name);
  64. m_Maker = new Fl_Box(10,65,480,20,"None");
  65. m_Maker->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
  66. m_Maker->labelcolor(GUI_COLOUR);
  67. m_Maker->labelsize(10);
  68. add(m_Maker);
  69. m_InputScroll = new Fl_Scroll(10,105,480,150," Value Min Max Clamp? Default Port Name");
  70. m_InputScroll->labelsize(12);
  71. m_InputScroll->align(FL_ALIGN_TOP_LEFT);
  72. m_InputScroll->type(Fl_Scroll::VERTICAL);
  73. m_InputScroll->box(FL_DOWN_BOX);
  74. add(m_InputScroll);
  75. m_InputPack = new Fl_Pack(20,115,460,20,"");
  76. m_InputScroll->add(m_InputPack);
  77. m_PowerAmp = new Fl_Button(125,277,100,25,"PowerAmp");
  78. m_PowerAmp->labelsize(10);
  79. m_PowerAmp->value(0);
  80. m_PowerAmp->type(1);
  81. m_PowerAmp->callback((Fl_Callback*)cb_PowerAmp);
  82. add(m_PowerAmp);
  83. m_UpdateMinMax = new Fl_Button(230,277,100,25,"Update Settings");
  84. m_UpdateMinMax->labelsize(10);
  85. m_UpdateMinMax->callback((Fl_Callback*)cb_MinMax);
  86. add(m_UpdateMinMax);
  87. m_UpdateInputs = new Fl_Button(335,277,100,25,"Refresh");
  88. m_UpdateInputs->labelsize(10);
  89. m_UpdateInputs->value(1);
  90. m_UpdateInputs->type(1);
  91. add(m_UpdateInputs);
  92. m_OutputGain = new Fl_Knob(440,265,40,40,"Output Gain");
  93. m_OutputGain->color(GUI_COLOUR);
  94. m_OutputGain->type(Fl_Knob::DOTLIN);
  95. m_OutputGain->maximum(2);
  96. m_OutputGain->step(0.001);
  97. m_OutputGain->value(1.0);
  98. m_OutputGain->labelsize(10);
  99. m_OutputGain->callback((Fl_Callback*)cb_Gain);
  100. add(m_OutputGain);
  101. end();
  102. }
  103. LADSPAPluginGUI::~LADSPAPluginGUI(void)
  104. {
  105. if (m_InData.InputPortNames) free(m_InData.InputPortNames);
  106. if (m_InData.InputPortSettings) free(m_InData.InputPortSettings);
  107. Fl::check();
  108. }
  109. void LADSPAPluginGUI::UpdatePortDisplay(int n, float v)
  110. {
  111. if (!m_UpdateInputs->value()) return;
  112. char temp[256];
  113. sprintf(temp,"%.4f",v);
  114. m_PortOutput[n]->value(temp);
  115. }
  116. void LADSPAPluginGUI::SetPortSettings(unsigned long n, float min, float max, bool clamp, float defolt)
  117. {
  118. char temp[256];
  119. sprintf(temp,"%.4f",min);
  120. m_PortMin[n]->value(temp);
  121. sprintf(temp,"%.4f",max);
  122. m_PortMax[n]->value(temp);
  123. sprintf(temp, "%d",clamp);
  124. m_PortClamp[n]->value(atoi(temp));
  125. sprintf(temp, "%.4f",defolt);
  126. m_PortDefault[n]->value(temp);
  127. }
  128. void LADSPAPluginGUI::SetName(const char *s)
  129. {
  130. m_Name->label(s);
  131. }
  132. void LADSPAPluginGUI::SetMaker(const char *s)
  133. {
  134. m_Maker->label(s);
  135. }
  136. void LADSPAPluginGUI::ClearPortInfo()
  137. {
  138. for (vector<Fl_Group*>::iterator i=m_PackVec.begin();
  139. i!=m_PackVec.end(); i++)
  140. {
  141. m_InputPack->remove((*i));
  142. }
  143. m_InputScroll->remove(m_InputPack);
  144. delete m_InputPack;
  145. m_InputPack = new Fl_Pack(x()+5,y()+110,460,20,"");
  146. m_InputScroll->add(m_InputPack);
  147. m_PortOutput.clear();
  148. m_PackVec.clear();
  149. m_PortMin.clear();
  150. m_PortMax.clear();
  151. m_PortClamp.clear();
  152. m_PortDefault.clear();
  153. }
  154. void LADSPAPluginGUI::AddPortInfo(const char *Info)
  155. {
  156. Fl_Group* NewGroup = new Fl_Group(0,0,430,18,"");
  157. NewGroup->box(FL_FLAT_BOX);
  158. m_InputPack->add(NewGroup);
  159. m_PackVec.push_back(NewGroup);
  160. // Value
  161. Fl_Output* NewOutput = new Fl_Output(10,0,60,18,"");
  162. NewOutput->value(0);
  163. NewOutput->textsize(10);
  164. NewGroup->add(NewOutput);
  165. m_PortOutput.push_back(NewOutput);
  166. // Min
  167. Fl_Input* NewInput = new Fl_Input(72,0,60,18,"");
  168. NewInput->value(0);
  169. NewInput->textsize(10);
  170. NewGroup->add(NewInput);
  171. m_PortMin.push_back(NewInput);
  172. // Max
  173. NewInput = new Fl_Input(134,0,60,18,"");
  174. NewInput->value(0);
  175. NewInput->textsize(10);
  176. NewGroup->add(NewInput);
  177. m_PortMax.push_back(NewInput);
  178. // Clamp
  179. Fl_Check_Button* NewCheckButton = new Fl_Check_Button(200,0,10,18,"");
  180. NewCheckButton->value(0);
  181. NewGroup->add(NewCheckButton);
  182. m_PortClamp.push_back(NewCheckButton);
  183. // Fixed Value
  184. NewInput = new Fl_Input(250,0,60,18,"");
  185. NewInput->value(0);
  186. NewInput->textsize(10);
  187. NewGroup->add(NewInput);
  188. m_PortDefault.push_back(NewInput);
  189. // Port Name
  190. Fl_Box* NewText = new Fl_Box(322,0,10,18,"");
  191. NewText->label(Info);
  192. NewText->labelsize(10);
  193. NewText->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
  194. NewGroup->add(NewText);
  195. NewGroup->redraw();
  196. m_InputPack->redraw();
  197. m_InputScroll->redraw();
  198. redraw();
  199. }
  200. void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o)
  201. {
  202. LADSPAPlugin* Plugin = (LADSPAPlugin*)o;
  203. m_OutputGain->value(Plugin->GetGain());
  204. m_PowerAmp->value(Plugin->GetAmped());
  205. SetName(Plugin->GetName());
  206. SetMaker(Plugin->GetMaker());
  207. unsigned long n = Plugin->GetInputPortCount();
  208. const char *name;
  209. PortSettings settings;
  210. for (unsigned long p = 0; p < n; p++) {
  211. name = Plugin->GetPortName(p);
  212. settings = Plugin->GetPortSettings(p);
  213. AddPortInfo(name);
  214. SetPortSettings(p, settings.Min, settings.Max, settings.Clamp, settings.Default);
  215. }
  216. }
  217. void LADSPAPluginGUI::Update(void)
  218. {
  219. m_GUICH->GetData("GetInputPortCount", &(m_InData.InputPortCount));
  220. m_GUICH->GetData("GetInputPortValues", m_InData.InputPortValues);
  221. for (unsigned long n=0; n < m_InData.InputPortCount; n++) {
  222. UpdatePortDisplay(n, m_InData.InputPortValues[n]);
  223. }
  224. }
  225. inline void LADSPAPluginGUI::cb_Gain_i(Fl_Knob* o, void* v)
  226. {
  227. m_GUICH->Set("SetGain",(float)(o->value()));
  228. }
  229. void LADSPAPluginGUI::cb_Gain(Fl_Knob* o, void* v)
  230. {
  231. ((LADSPAPluginGUI*)(o->parent()))->cb_Gain_i(o,v);
  232. }
  233. inline void LADSPAPluginGUI::cb_Select_i(Fl_Choice* o)
  234. {
  235. m_GUICH->Set("SetPluginIndex",o->value()-1);
  236. m_GUICH->SetCommand(LADSPAPlugin::SELECTPLUGIN);
  237. // Wait until next update for plugin to be loaded etc.
  238. m_GUICH->Wait();
  239. // Now get the new values to populate GUI controls
  240. m_GUICH->GetData("GetName", m_InData.Name);
  241. m_GUICH->GetData("GetMaker", m_InData.Maker);
  242. m_GUICH->GetData("GetInputPortCount", &(m_InData.InputPortCount));
  243. m_GUICH->GetData("GetInputPortNames", m_InData.InputPortNames);
  244. m_GUICH->GetData("GetInputPortSettings", m_InData.InputPortSettings);
  245. SetName((const char *)m_InData.Name);
  246. SetMaker((const char *)m_InData.Maker);
  247. // Clear out port info, and refresh
  248. ClearPortInfo();
  249. for (unsigned long n = 0; n < m_InData.InputPortCount; n++) {
  250. AddPortInfo((const char *)(m_InData.InputPortNames + n * 256));
  251. SetPortSettings(n, m_InData.InputPortSettings[n].Min,
  252. m_InData.InputPortSettings[n].Max,
  253. m_InData.InputPortSettings[n].Clamp,
  254. m_InData.InputPortSettings[n].Default);
  255. }
  256. }
  257. void LADSPAPluginGUI::cb_Select(Fl_Choice* o)
  258. {
  259. ((LADSPAPluginGUI*)(o->parent()))->cb_Select_i(o);
  260. }
  261. inline void LADSPAPluginGUI::cb_MinMax_i(Fl_Button* o, void* v)
  262. {
  263. unsigned long n=0;
  264. for (vector<Fl_Input*>::iterator i=m_PortMin.begin();
  265. i!=m_PortMin.end(); i++)
  266. {
  267. m_InData.InputPortSettings[n].Min = atof((*i)->value());
  268. n++;
  269. }
  270. n=0;
  271. for (vector<Fl_Input*>::iterator i=m_PortMax.begin();
  272. i!=m_PortMax.end(); i++)
  273. {
  274. m_InData.InputPortSettings[n].Max = atof((*i)->value());
  275. n++;
  276. }
  277. n=0;
  278. for (vector<Fl_Check_Button*>::iterator i=m_PortClamp.begin();
  279. i!=m_PortClamp.end(); i++)
  280. {
  281. m_InData.InputPortSettings[n].Clamp = (bool)((*i)->value());
  282. n++;
  283. }
  284. n=0;
  285. for (vector<Fl_Input*>::iterator i=m_PortDefault.begin();
  286. i!=m_PortDefault.end(); i++)
  287. {
  288. m_InData.InputPortSettings[n].Default = atof((*i)->value());
  289. n++;
  290. }
  291. m_GUICH->SetData("SetInputPortSettings", m_InData.InputPortSettings);
  292. m_GUICH->SetCommand(LADSPAPlugin::SETPORTSETTINGS);
  293. }
  294. void LADSPAPluginGUI::cb_MinMax(Fl_Button* o, void* v)
  295. {
  296. ((LADSPAPluginGUI*)(o->parent()))->cb_MinMax_i(o,v);
  297. }
  298. inline void LADSPAPluginGUI::cb_PowerAmp_i(Fl_Button* o, void* v)
  299. {
  300. m_GUICH->Set("SetAmped",(bool)(o->value()));
  301. }
  302. void LADSPAPluginGUI::cb_PowerAmp(Fl_Button* o, void* v)
  303. {
  304. ((LADSPAPluginGUI*)(o->parent()))->cb_PowerAmp_i(o,v);
  305. }