3333#include " monitorlogger.h"
3434#include " midi_port_info.h"
3535
36+ using namespace std ;
37+
3638static int g_monitor_level = 6 ;
39+ static mutex g_init_mutex;
3740
38- using namespace std ;
3941
4042// FIXME: need to test what happens when MIDI devices are already in use by another application
4143// and sp_midi cannot open them
@@ -119,6 +121,7 @@ int sp_midi_send(const char* device_name, const unsigned char* c_message, unsign
119121
120122int sp_midi_init ()
121123{
124+ lock_guard<std::mutex> lock (g_init_mutex);
122125 if (g_already_initialized){
123126 return 0 ;
124127 }
@@ -150,6 +153,7 @@ int sp_midi_init()
150153
151154void sp_midi_deinit ()
152155{
156+ lock_guard<std::mutex> lock (g_init_mutex);
153157 if (!g_already_initialized){
154158 return ;
155159 }
@@ -167,6 +171,18 @@ void sp_midi_deinit()
167171 midiSendProcessor.reset (nullptr );
168172}
169173
174+ int sp_midi_is_nif_initialized (bool * is_nif_initialized)
175+ {
176+ *is_nif_initialized = g_already_initialized ? 1 : 0 ;
177+ return 0 ;
178+ }
179+
180+ int sp_midi_is_nif_loaded (bool * is_nif_loaded)
181+ {
182+ *is_nif_loaded = true ;
183+ return 0 ;
184+ }
185+
170186static char **vector_str_to_c (const vector<string>& vector_str)
171187{
172188 char **c_str_list;
@@ -226,6 +242,27 @@ ERL_NIF_TERM c_str_list_to_erlang(ErlNifEnv *env, int n, char **c_str_list)
226242
227243
228244// NIF functions
245+
246+ ERL_NIF_TERM sp_midi_is_nif_loaded_nif (ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
247+ {
248+ bool loaded;
249+ int rc = sp_midi_is_nif_loaded (&loaded);
250+ if (rc < 0 ){
251+ return enif_make_atom (env, " error" );
252+ }
253+ return enif_make_atom (env, loaded ? " true" : " false" );
254+ }
255+
256+ ERL_NIF_TERM sp_midi_is_nif_initialized_nif (ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
257+ {
258+ bool initialized;
259+ int rc = sp_midi_is_nif_initialized (&initialized);
260+ if (rc < 0 ){
261+ return enif_make_atom (env, " error" );
262+ }
263+ return enif_make_atom (env, initialized ? " true" : " false" );
264+ }
265+
229266ERL_NIF_TERM sp_midi_init_nif (ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
230267{
231268 int ret = sp_midi_init ();
@@ -357,6 +394,8 @@ int send_midi_data_to_erlang(const char *device_name, const unsigned char *data,
357394
358395
359396static ErlNifFunc nif_funcs[] = {
397+ {" is_nif_loaded" , 0 , sp_midi_is_nif_loaded_nif},
398+ {" is_nif_initialized" , 0 , sp_midi_is_nif_initialized_nif},
360399 {" midi_init" , 0 , sp_midi_init_nif},
361400 {" midi_deinit" , 0 , sp_midi_deinit_nif},
362401 {" midi_send" , 2 , sp_midi_send_nif},
0 commit comments