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)40 sm_enable_sse (bool sse)
41 {
42   use_sse = sse;
43 }
44 
45 bool
sm_sse()46 sm_sse()
47 {
48   return use_sse;
49 }
50 
51 static int sm_init_counter = 0;
52 
53 bool
sm_init_done()54 sm_init_done()
55 {
56   return sm_init_counter > 0;
57 }
58 
59 void
sm_plugin_init()60 sm_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()72 sm_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()85 GlobalData::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()107 GlobalData::~GlobalData()
108 {
109   FFT::cleanup();
110   sm_debug ("GlobalData instance deleted\n");
111 }
112 
Main(int * argc_p,char *** argv_p)113 Main::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()123 Main::~Main()
124 {
125   sm_plugin_cleanup();
126 }
127 
128 InstEncCache *
inst_enc_cache()129 Global::inst_enc_cache()
130 {
131   return &global_data->inst_enc_cache;
132 }
133 
134 WavSetRepo *
wav_set_repo()135 Global::wav_set_repo()
136 {
137   return &global_data->wav_set_repo;
138 }
139 
140 }
141