1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html 2 3 #include "smmain.hh" 4 #include "smfft.hh" 5 #include "smmath.hh" 6 #include "smutils.hh" 7 #include "smconfig.hh" 8 #include "sminstenccache.hh" 9 #include "smwavsetrepo.hh" 10 #include "config.h" 11 #include <stdio.h> 12 #include <assert.h> 13 #include <locale.h> 14 15 #if SPECTMORPH_HAVE_BSE 16 #include <bse/bsemain.hh> 17 #endif 18 19 using std::string; 20 21 namespace SpectMorph 22 { 23 24 struct GlobalData 25 { 26 GlobalData(); 27 ~GlobalData(); 28 29 InstEncCache inst_enc_cache; 30 WavSetRepo wav_set_repo; 31 }; 32 33 static GlobalData *global_data = nullptr; 34 35 float *int_sincos_table; 36 37 static bool use_sse = true; 38 39 void sm_enable_sse(bool sse)40sm_enable_sse (bool sse) 41 { 42 use_sse = sse; 43 } 44 45 bool sm_sse()46sm_sse() 47 { 48 return use_sse; 49 } 50 51 static int sm_init_counter = 0; 52 53 bool sm_init_done()54sm_init_done() 55 { 56 return sm_init_counter > 0; 57 } 58 59 void sm_plugin_init()60sm_plugin_init() 61 { 62 if (sm_init_counter == 0) 63 { 64 assert (global_data == nullptr); 65 global_data = new GlobalData(); 66 } 67 sm_init_counter++; 68 sm_debug ("sm_init_plugin: sm_init_counter = %d\n", sm_init_counter); 69 } 70 71 void sm_plugin_cleanup()72sm_plugin_cleanup() 73 { 74 assert (sm_init_counter > 0); 75 76 if (sm_init_counter == 1) 77 { 78 delete global_data; 79 global_data = nullptr; 80 } 81 sm_init_counter--; 82 sm_debug ("sm_cleanup_plugin: sm_init_counter = %d\n", sm_init_counter); 83 } 84 GlobalData()85GlobalData::GlobalData() 86 { 87 /* ensure that user data dir exists */ 88 string user_data_dir = sm_get_user_dir (USER_DIR_DATA); 89 g_mkdir_with_parents (user_data_dir.c_str(), 0775); 90 91 /* ensure that cache dir exists */ 92 string cache_dir = sm_get_user_dir (USER_DIR_CACHE); 93 g_mkdir_with_parents (cache_dir.c_str(), 0775); 94 95 Config cfg; 96 97 for (auto area : cfg.debug()) 98 Debug::enable (area); 99 100 FFT::init(); 101 int_sincos_init(); 102 sm_math_init(); 103 104 sm_debug ("GlobalData instance created\n"); 105 } 106 ~GlobalData()107GlobalData::~GlobalData() 108 { 109 FFT::cleanup(); 110 sm_debug ("GlobalData instance deleted\n"); 111 } 112 Main(int * argc_p,char *** argv_p)113Main::Main (int *argc_p, char ***argv_p) 114 { 115 /* internationalized string printf */ 116 setlocale (LC_ALL, ""); 117 #if SPECTMORPH_HAVE_BSE 118 bse_init_inprocess (argc_p, *argv_p, NULL); 119 #endif 120 sm_plugin_init(); 121 } 122 ~Main()123Main::~Main() 124 { 125 sm_plugin_cleanup(); 126 } 127 128 InstEncCache * inst_enc_cache()129Global::inst_enc_cache() 130 { 131 return &global_data->inst_enc_cache; 132 } 133 134 WavSetRepo * wav_set_repo()135Global::wav_set_repo() 136 { 137 return &global_data->wav_set_repo; 138 } 139 140 } 141