1 /***************************************************************************
2  *   Copyright (C) 2009 by Pere Ràfols Soler                               *
3  *   sapista2@gmail.com                                                    *
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                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20 
21 #ifndef DYN_MAIN_WIN_H
22   #define DYN_MAIN_WIN_H
23 
24 #include <iostream>
25 #include <string>
26 
27 #include <gtkmm/alignment.h>
28 #include <gtkmm/box.h>
29 #include <gtkmm/image.h>
30 #include <gtkmm/label.h>
31 
32 #include <cmath>
33 
34 //LV2 UI header
35 #include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
36 
37 #include "mainwidget.h"
38 #include "vuwidget.h"
39 #include "knob2.h"
40 #include "toggle_button.h"
41 #include "dynplot.h"
42 #include "sidechainbox.h"
43 
44 #define PORT_KEY_LISTEN 2
45 #define PORT_THRESHOLD 3
46 #define PORT_ATACK 4
47 #define PORT_HOLD_MAKEUP 5
48 #define PORT_DECAY 6
49 #define PORT_RATIO 7
50 #define PORT_HPFFREQ 8
51 #define PORT_LPFFREQ 9
52 #define PORT_GAIN 10
53 #define PORT_INVU 11
54 #define PORT_GAINREDUCTION 12
55 #define PORT_KNEE 13
56 #define PORT_DRY_WET 14
57 #define PORT_FEEDBACK_RANGE_SCACTIVE 15
58 #define PORT_COMP_MODE 16
59 #define PORT_PUNCH 17
60 
61 //Test print information, comment out for the final release
62 //#define PRINT_DEBUG_INFO
63 
64 using namespace sigc;
65 
66 class DynMainWindow : public MainWidget
67 {
68   public:
69     DynMainWindow(const char *uri, std::string bundlePath, std::string title, bool isCompressor, bool hasSideChain);
70     virtual ~DynMainWindow();
71 
72     // Informing GUI about changes in the control ports
gui_port_event(LV2UI_Handle ui,uint32_t port,uint32_t buffer_size,uint32_t format,const void * buffer)73     void gui_port_event(LV2UI_Handle ui, uint32_t port, uint32_t buffer_size, uint32_t format, const void * buffer)
74     {
75       float data = * static_cast<const float*>(buffer);
76 
77       #ifdef PRINT_DEBUG_INFO
78 	std::cout<<"gui_port_event Entring....... "<<std::endl;
79       #endif
80 
81         // Checking if params are the same as specified in the LV2 documentation
82         if (format != 0) {
83 	    #ifdef PRINT_DEBUG_INFO
84 	      std::cout<<"\t-- Return Format != 0"<<std::endl;
85 	    #endif
86             return;
87         }
88         if (buffer_size != 4) {
89 	    #ifdef PRINT_DEBUG_INFO
90 	      std::cout<<"\t-- Return buffer_size != 4"<<std::endl;
91 	    #endif
92             return;
93         }
94 
95         // Updating values in GUI ========================================================
96 	switch (port)
97 	{
98 	  case PORT_KEY_LISTEN:
99 	    m_KeyButton.set_active(data > 0.5);
100 	  break;
101 
102 	  case PORT_THRESHOLD:
103 	    m_InputVu->set_value_th(data);
104             m_Plot->set_threshold(data);
105 	  break;
106 
107 	  case PORT_ATACK:
108 	    m_Attack->set_value(data);
109 	  break;
110 
111 	  case PORT_HOLD_MAKEUP:
112 	    m_Hold_Makeup->set_value(data);
113             if(m_bIsCompressor)
114             {
115               m_Plot->set_makeup(data);
116             }
117 	  break;
118 
119 	  case PORT_DECAY:
120 	    m_Release->set_value(data);
121 	  break;
122 
123 	  case PORT_RATIO:
124 	    m_Ratio->set_value(data);
125 	    m_Plot->set_ratio(data);
126 	  break;
127 
128 	  case PORT_GAINREDUCTION:
129 	    m_GainReductionVu->setValue(0,data);
130             m_Plot->set_gainreduction(data);
131 	  break;
132 
133 	  case PORT_HPFFREQ:
134 	    m_HPF->set_value(data);
135 	  break;
136 
137 	  case PORT_LPFFREQ:
138 	    m_LPF->set_value(data);
139 	  break;
140 
141 	  case PORT_GAIN:
142 	    m_InGainFader->set_value(data);
143 	  break;
144 
145 	  case PORT_INVU:
146 	    m_InputVu->setValue(0,data);
147             m_Plot->set_inputvu(data);
148 	  break;
149 
150 	  case PORT_KNEE:
151               m_Knee->set_value(data);
152               m_Plot->set_knee(data);
153               break;
154 
155           case PORT_DRY_WET:
156               m_DryWet->set_value(100.0*data); //In range of 0% to 100%
157             break;
158 
159 	  case PORT_FEEDBACK_RANGE_SCACTIVE:
160 	    if(m_bIsCompressor)
161 	    {
162 	      m_FeedBackMode_SideChainActive.set_active(data > 0.5);
163 	    }
164 	    else
165 	    {
166       	      m_Range->set_value(data);
167               m_Plot->set_range(data);
168 	    }
169 	    break;
170 
171 	  case PORT_COMP_MODE:
172 	     m_OptoMode.set_active(data > 0.5);
173 	    break;
174 
175 	  case PORT_PUNCH:
176 	    m_Punch->set_value(100.0*data);  //In range of 0% to 100%
177 	    break;
178 	}
179 
180 	#ifdef PRINT_DEBUG_INFO
181 	  std::cout<<"\t--  Return OK"<<std::endl;
182 	#endif
183 
184     }
185 
186     LV2UI_Controller controller;
187     LV2UI_Write_Function write_function;
188 
189   protected:
190     VUWidget *m_InputVu;
191     VUWidget *m_GainReductionVu;
192     KnobWidget2 *m_InGainFader;
193     KnobWidget2 *m_Attack;
194     KnobWidget2 *m_Hold_Makeup;
195     KnobWidget2 *m_Release;
196     KnobWidget2 *m_Punch;
197     KnobWidget2 *m_Range, *m_Ratio;
198     KnobWidget2 *m_Knee;
199     KnobWidget2 *m_HPF;
200     KnobWidget2 *m_LPF;
201     KnobWidget2 *m_DryWet;
202     ToggleButton m_KeyButton, m_FeedBackMode_SideChainActive, m_OptoMode;
203     PlotDynCurve *m_Plot;
204     SideChainBox m_SCBox;
205     Gtk::Alignment m_KeyButtonAlign, m_TitleAlign, m_sidchianAlign, m_keyPadding, m_FeedBackModeAlign, m_OptoModeAlign;
206     Gtk::HBox m_VuBox, m_PlotBox, m_BalBox, m_MainBox, m_BotBox, m_SideChain2Box;
207     Gtk::VBox m_SideChainBox, m_TitleBox, m_DynBox, m_Main2Box, m_PlotLabelBox;
208     Gtk::Image *image_logo;
209     Gtk::Label m_LTitle;
210 
211     //Signal Handlers
212     void onGainChange();
213     void onThresholdChange();
214     void onRatioChange();
215     void onRangeChange();
216     void onAttackChange();
217     void onHoldChange();
218     void onReleaseChange();
219     void onKneeChange();
220     void onHPFChange();
221     void onLPFChange();
222     void onDryWetChange();
223     void onKeyListenChange();
224     void onFeedbackModeChange();
225     void onModeCompressorChange();
226     void onPunchChange();
227 
228   private:
229     std::string m_pluginUri;
230     std::string m_bundlePath;
231     bool m_bIsCompressor;
232 };
233 
234 #endif
235 
236