33
33
#include " monitorlogger.h"
34
34
#include " midi_port_info.h"
35
35
36
+ using namespace std ;
37
+
36
38
static int g_monitor_level = 6 ;
39
+ static mutex g_init_mutex;
37
40
38
- using namespace std ;
39
41
40
42
// FIXME: need to test what happens when MIDI devices are already in use by another application
41
43
// and sp_midi cannot open them
@@ -119,6 +121,7 @@ int sp_midi_send(const char* device_name, const unsigned char* c_message, unsign
119
121
120
122
int sp_midi_init ()
121
123
{
124
+ lock_guard<std::mutex> lock (g_init_mutex);
122
125
if (g_already_initialized){
123
126
return 0 ;
124
127
}
@@ -150,6 +153,7 @@ int sp_midi_init()
150
153
151
154
void sp_midi_deinit ()
152
155
{
156
+ lock_guard<std::mutex> lock (g_init_mutex);
153
157
if (!g_already_initialized){
154
158
return ;
155
159
}
@@ -167,6 +171,18 @@ void sp_midi_deinit()
167
171
midiSendProcessor.reset (nullptr );
168
172
}
169
173
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
+
170
186
static char **vector_str_to_c (const vector<string>& vector_str)
171
187
{
172
188
char **c_str_list;
@@ -226,6 +242,27 @@ ERL_NIF_TERM c_str_list_to_erlang(ErlNifEnv *env, int n, char **c_str_list)
226
242
227
243
228
244
// 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
+
229
266
ERL_NIF_TERM sp_midi_init_nif (ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
230
267
{
231
268
int ret = sp_midi_init ();
@@ -357,6 +394,8 @@ int send_midi_data_to_erlang(const char *device_name, const unsigned char *data,
357
394
358
395
359
396
static 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},
360
399
{" midi_init" , 0 , sp_midi_init_nif},
361
400
{" midi_deinit" , 0 , sp_midi_deinit_nif},
362
401
{" midi_send" , 2 , sp_midi_send_nif},
0 commit comments