00001 #include "bcdisplayinfo.h"
00002 #include "bchash.h"
00003 #include "filesystem.h"
00004 #include "reverb.h"
00005 #include "reverbwindow.h"
00006
00007 #include <string.h>
00008
00009 PLUGIN_THREAD_OBJECT(Reverb, ReverbThread, ReverbWindow)
00010
00011 #include <libintl.h>
00012 #define _(String) gettext(String)
00013 #define gettext_noop(String) String
00014 #define N_(String) gettext_noop (String)
00015
00016
00017
00018 ReverbWindow::ReverbWindow(Reverb *reverb, int x, int y)
00019 : BC_Window(reverb->gui_string,
00020 x,
00021 y,
00022 250,
00023 230,
00024 250,
00025 230,
00026 0,
00027 0,
00028 1)
00029 {
00030 this->reverb = reverb;
00031 }
00032
00033 ReverbWindow::~ReverbWindow()
00034 {
00035 }
00036
00037 int ReverbWindow::create_objects()
00038 {
00039 int x = 170, y = 10;
00040 add_tool(new BC_Title(5, y + 10, _("Initial signal level:")));
00041 add_tool(level_init = new ReverbLevelInit(reverb, x, y)); y += 25;
00042 add_tool(new BC_Title(5, y + 10, _("ms before reflections:")));
00043 add_tool(delay_init = new ReverbDelayInit(reverb, x + 35, y)); y += 25;
00044 add_tool(new BC_Title(5, y + 10, _("First reflection level:")));
00045 add_tool(ref_level1 = new ReverbRefLevel1(reverb, x, y)); y += 25;
00046 add_tool(new BC_Title(5, y + 10, _("Last reflection level:")));
00047 add_tool(ref_level2 = new ReverbRefLevel2(reverb, x + 35, y)); y += 25;
00048 add_tool(new BC_Title(5, y + 10, _("Number of reflections:")));
00049 add_tool(ref_total = new ReverbRefTotal(reverb, x, y)); y += 25;
00050 add_tool(new BC_Title(5, y + 10, _("ms of reflections:")));
00051 add_tool(ref_length = new ReverbRefLength(reverb, x + 35, y)); y += 25;
00052 add_tool(new BC_Title(5, y + 10, _("Start band for lowpass:")));
00053 add_tool(lowpass1 = new ReverbLowPass1(reverb, x, y)); y += 25;
00054 add_tool(new BC_Title(5, y + 10, _("End band for lowpass:")));
00055 add_tool(lowpass2 = new ReverbLowPass2(reverb, x + 35, y)); y += 40;
00056 show_window();
00057 flush();
00058 return 0;
00059 }
00060
00061 WINDOW_CLOSE_EVENT(ReverbWindow)
00062
00063
00064
00065
00066
00067 ReverbLevelInit::ReverbLevelInit(Reverb *reverb, int x, int y)
00068 : BC_FPot(x,
00069 y,
00070 reverb->config.level_init,
00071 INFINITYGAIN,
00072 0)
00073 {
00074 this->reverb = reverb;
00075 }
00076 ReverbLevelInit::~ReverbLevelInit()
00077 {
00078 }
00079 int ReverbLevelInit::handle_event()
00080 {
00081
00082 reverb->config.level_init = get_value();
00083
00084 reverb->send_configure_change();
00085
00086 return 1;
00087 }
00088
00089 ReverbDelayInit::ReverbDelayInit(Reverb *reverb, int x, int y)
00090 : BC_IPot(x,
00091 y,
00092 reverb->config.delay_init,
00093 0,
00094 1000)
00095 {
00096 this->reverb = reverb;
00097 }
00098 ReverbDelayInit::~ReverbDelayInit()
00099 {
00100 }
00101 int ReverbDelayInit::handle_event()
00102 {
00103 reverb->config.delay_init = get_value();
00104 reverb->send_configure_change();
00105 return 1;
00106 }
00107
00108 ReverbRefLevel1::ReverbRefLevel1(Reverb *reverb, int x, int y)
00109 : BC_FPot(x,
00110 y,
00111 reverb->config.ref_level1,
00112 INFINITYGAIN,
00113 0)
00114 {
00115 this->reverb = reverb;
00116 }
00117 ReverbRefLevel1::~ReverbRefLevel1() {}
00118 int ReverbRefLevel1::handle_event()
00119 {
00120 reverb->config.ref_level1 = get_value();
00121 reverb->send_configure_change();
00122 return 1;
00123 }
00124
00125
00126 ReverbRefLevel2::ReverbRefLevel2(Reverb *reverb, int x, int y)
00127 : BC_FPot(x,
00128 y,
00129 reverb->config.ref_level2,
00130 INFINITYGAIN,
00131 0)
00132 {
00133 this->reverb = reverb;
00134 }
00135 ReverbRefLevel2::~ReverbRefLevel2() {}
00136 int ReverbRefLevel2::handle_event()
00137 {
00138 reverb->config.ref_level2 = get_value();
00139 reverb->send_configure_change();
00140 return 1;
00141 }
00142
00143 ReverbRefTotal::ReverbRefTotal(Reverb *reverb, int x, int y)
00144 : BC_IPot(x,
00145 y,
00146 reverb->config.ref_total,
00147 1,
00148 250)
00149 {
00150 this->reverb = reverb;
00151 }
00152 ReverbRefTotal::~ReverbRefTotal() {}
00153 int ReverbRefTotal::handle_event()
00154 {
00155 reverb->config.ref_total = get_value();
00156 reverb->send_configure_change();
00157 return 1;
00158 }
00159
00160
00161 ReverbRefLength::ReverbRefLength(Reverb *reverb, int x, int y)
00162 : BC_IPot(x,
00163 y,
00164 reverb->config.ref_length,
00165 0,
00166 5000)
00167 {
00168 this->reverb = reverb;
00169 }
00170 ReverbRefLength::~ReverbRefLength() {}
00171 int ReverbRefLength::handle_event()
00172 {
00173 reverb->config.ref_length = get_value();
00174 reverb->send_configure_change();
00175 return 1;
00176 }
00177
00178 ReverbLowPass1::ReverbLowPass1(Reverb *reverb, int x, int y)
00179 : BC_QPot(x,
00180 y,
00181 reverb->config.lowpass1)
00182 {
00183 this->reverb = reverb;
00184 }
00185 ReverbLowPass1::~ReverbLowPass1() {}
00186 int ReverbLowPass1::handle_event()
00187 {
00188 reverb->config.lowpass1 = get_value();
00189 reverb->send_configure_change();
00190 return 1;
00191 }
00192
00193 ReverbLowPass2::ReverbLowPass2(Reverb *reverb, int x, int y)
00194 : BC_QPot(x,
00195 y,
00196 reverb->config.lowpass2)
00197 {
00198 this->reverb = reverb;
00199 }
00200 ReverbLowPass2::~ReverbLowPass2() {}
00201 int ReverbLowPass2::handle_event()
00202 {
00203 reverb->config.lowpass2 = get_value();
00204 reverb->send_configure_change();
00205 return 1;
00206 }
00207
00208 ReverbMenu::ReverbMenu(Reverb *reverb, ReverbWindow *window)
00209 : BC_MenuBar(0, 0, window->get_w())
00210 {
00211 this->window = window;
00212 this->reverb = reverb;
00213 }
00214
00215 ReverbMenu::~ReverbMenu()
00216 {
00217 delete load;
00218 delete save;
00219
00220 for(int i = 0; i < total_loads; i++)
00221 {
00222 delete prev_load[i];
00223 }
00224 delete prev_load_thread;
00225 }
00226
00227 int ReverbMenu::create_objects(BC_Hash *defaults)
00228 {
00229 add_menu(filemenu = new BC_Menu(_("File")));
00230 filemenu->add_item(load = new ReverbLoad(reverb, this));
00231 filemenu->add_item(save = new ReverbSave(reverb, this));
00232
00233 load_defaults(defaults);
00234 prev_load_thread = new ReverbLoadPrevThread(reverb, this);
00235 return 0;
00236 }
00237
00238 int ReverbMenu::load_defaults(BC_Hash *defaults)
00239 {
00240 FileSystem fs;
00241 total_loads = defaults->get("TOTAL_LOADS", 0);
00242 if(total_loads > 0)
00243 {
00244 filemenu->add_item(new BC_MenuItem("-"));
00245 char string[1024], path[1024], filename[1024];
00246
00247 for(int i = 0; i < total_loads; i++)
00248 {
00249 sprintf(string, "LOADPREVIOUS%d", i);
00250 defaults->get(string, path);
00251 fs.extract_name(filename, path);
00252
00253 filemenu->add_item(prev_load[i] = new ReverbLoadPrev(reverb, this, filename, path));
00254 }
00255 }
00256 return 0;
00257 }
00258
00259 int ReverbMenu::save_defaults(BC_Hash *defaults)
00260 {
00261 if(total_loads > 0)
00262 {
00263 defaults->update("TOTAL_LOADS", total_loads);
00264 char string[1024];
00265
00266 for(int i = 0; i < total_loads; i++)
00267 {
00268 sprintf(string, "LOADPREVIOUS%d", i);
00269 defaults->update(string, prev_load[i]->path);
00270 }
00271 }
00272 return 0;
00273 }
00274
00275 int ReverbMenu::add_load(char *path)
00276 {
00277 if(total_loads == 0)
00278 {
00279 filemenu->add_item(new BC_MenuItem("-"));
00280 }
00281
00282
00283 FileSystem fs;
00284 char text[1024], new_path[1024];
00285 fs.extract_name(text, path);
00286 strcpy(new_path, path);
00287
00288 for(int i = 0; i < total_loads; i++)
00289 {
00290 if(!strcmp(prev_load[i]->get_text(), text))
00291 {
00292 for(int j = i; j > 0; j--)
00293 {
00294 prev_load[j]->set_text(prev_load[j - 1]->get_text());
00295 prev_load[j]->set_path(prev_load[j - 1]->path);
00296 }
00297 prev_load[0]->set_text(text);
00298 prev_load[0]->set_path(new_path);
00299 return 1;
00300 }
00301 }
00302
00303
00304 if(total_loads < TOTAL_LOADS)
00305 {
00306 filemenu->add_item(prev_load[total_loads] = new ReverbLoadPrev(reverb, this));
00307 total_loads++;
00308 }
00309
00310
00311 for(int i = total_loads - 1; i > 0; i--)
00312 {
00313
00314 prev_load[i]->set_text(prev_load[i - 1]->get_text());
00315
00316 prev_load[i]->set_path(prev_load[i - 1]->path);
00317 }
00318
00319
00320 prev_load[0]->set_text(text);
00321 prev_load[0]->set_path(new_path);
00322 return 0;
00323 }
00324
00325 ReverbLoad::ReverbLoad(Reverb *reverb, ReverbMenu *menu)
00326 : BC_MenuItem(_("Load..."))
00327 {
00328 this->reverb = reverb;
00329 this->menu = menu;
00330 thread = new ReverbLoadThread(reverb, menu);
00331 }
00332 ReverbLoad::~ReverbLoad()
00333 {
00334 delete thread;
00335 }
00336 int ReverbLoad::handle_event()
00337 {
00338 thread->start();
00339 return 0;
00340 }
00341
00342 ReverbSave::ReverbSave(Reverb *reverb, ReverbMenu *menu)
00343 : BC_MenuItem(_("Save..."))
00344 {
00345 this->reverb = reverb;
00346 this->menu = menu;
00347 thread = new ReverbSaveThread(reverb, menu);
00348 }
00349 ReverbSave::~ReverbSave()
00350 {
00351 delete thread;
00352 }
00353 int ReverbSave::handle_event()
00354 {
00355 thread->start();
00356 return 0;
00357 }
00358
00359 ReverbSetDefault::ReverbSetDefault()
00360 : BC_MenuItem(_("Set default"))
00361 {
00362 }
00363 int ReverbSetDefault::handle_event()
00364 {
00365 return 0;
00366 }
00367
00368 ReverbLoadPrev::ReverbLoadPrev(Reverb *reverb, ReverbMenu *menu, char *filename, char *path)
00369 : BC_MenuItem(filename)
00370 {
00371 this->reverb = reverb;
00372 this->menu = menu;
00373 strcpy(this->path, path);
00374 }
00375 ReverbLoadPrev::ReverbLoadPrev(Reverb *reverb, ReverbMenu *menu)
00376 : BC_MenuItem("")
00377 {
00378 this->reverb = reverb;
00379 this->menu = menu;
00380 }
00381 int ReverbLoadPrev::handle_event()
00382 {
00383 menu->prev_load_thread->set_path(path);
00384 menu->prev_load_thread->start();
00385 }
00386 int ReverbLoadPrev::set_path(char *path)
00387 {
00388 strcpy(this->path, path);
00389 }
00390
00391
00392 ReverbSaveThread::ReverbSaveThread(Reverb *reverb, ReverbMenu *menu)
00393 : Thread()
00394 {
00395 this->reverb = reverb;
00396 this->menu = menu;
00397 }
00398 ReverbSaveThread::~ReverbSaveThread()
00399 {
00400 }
00401 void ReverbSaveThread::run()
00402 {
00403 int result = 0;
00404 {
00405 ReverbSaveDialog dialog(reverb);
00406 dialog.create_objects();
00407 result = dialog.run_window();
00408
00409 }
00410 if(!result)
00411 {
00412 result = reverb->save_to_file(reverb->config_directory);
00413 menu->add_load(reverb->config_directory);
00414 }
00415 }
00416
00417 ReverbSaveDialog::ReverbSaveDialog(Reverb *reverb)
00418 : BC_FileBox(0,
00419 0,
00420 reverb->config_directory,
00421 _("Save reverb"),
00422 _("Select the reverb file to save as"))
00423 {
00424 this->reverb = reverb;
00425 }
00426 ReverbSaveDialog::~ReverbSaveDialog()
00427 {
00428 }
00429 int ReverbSaveDialog::ok_event()
00430 {
00431 set_done(0);
00432 return 0;
00433 }
00434 int ReverbSaveDialog::cancel_event()
00435 {
00436 set_done(1);
00437 return 0;
00438 }
00439
00440
00441
00442 ReverbLoadThread::ReverbLoadThread(Reverb *reverb, ReverbMenu *menu)
00443 : Thread()
00444 {
00445 this->reverb = reverb;
00446 this->menu = menu;
00447 }
00448 ReverbLoadThread::~ReverbLoadThread()
00449 {
00450 }
00451 void ReverbLoadThread::run()
00452 {
00453 int result = 0;
00454 {
00455 ReverbLoadDialog dialog(reverb);
00456 dialog.create_objects();
00457 result = dialog.run_window();
00458
00459 }
00460 if(!result)
00461 {
00462 result = reverb->load_from_file(reverb->config_directory);
00463 if(!result)
00464 {
00465 menu->add_load(reverb->config_directory);
00466 reverb->send_configure_change();
00467 }
00468 }
00469 }
00470
00471 ReverbLoadPrevThread::ReverbLoadPrevThread(Reverb *reverb, ReverbMenu *menu) : Thread()
00472 {
00473 this->reverb = reverb;
00474 this->menu = menu;
00475 }
00476 ReverbLoadPrevThread::~ReverbLoadPrevThread()
00477 {
00478 }
00479 void ReverbLoadPrevThread::run()
00480 {
00481 int result = 0;
00482 strcpy(reverb->config_directory, path);
00483 result = reverb->load_from_file(path);
00484 if(!result)
00485 {
00486 menu->add_load(path);
00487 reverb->send_configure_change();
00488 }
00489 }
00490 int ReverbLoadPrevThread::set_path(char *path)
00491 {
00492 strcpy(this->path, path);
00493 return 0;
00494 }
00495
00496
00497
00498
00499
00500 ReverbLoadDialog::ReverbLoadDialog(Reverb *reverb)
00501 : BC_FileBox(0,
00502 0,
00503 reverb->config_directory,
00504 _("Load reverb"),
00505 _("Select the reverb file to load from"), 0, 0)
00506 {
00507 this->reverb = reverb;
00508 }
00509 ReverbLoadDialog::~ReverbLoadDialog()
00510 {
00511 }
00512 int ReverbLoadDialog::ok_event()
00513 {
00514 set_done(0);
00515 return 0;
00516 }
00517 int ReverbLoadDialog::cancel_event()
00518 {
00519 set_done(1);
00520 return 0;
00521 }
00522