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