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.

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