Skip to content

Commit 0820b6d

Browse files
committed
SP_MIDI - add new API fns is_nif_loaded and is_nif_initialized
useful for runtime checks
1 parent c966247 commit 0820b6d

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

app/external/sp_midi/src/sp_midi.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@
3333
#include "monitorlogger.h"
3434
#include "midi_port_info.h"
3535

36+
using namespace std;
37+
3638
static 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

120122
int 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

151154
void 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+
170186
static 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+
229266
ERL_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

359396
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},
360399
{"midi_init", 0, sp_midi_init_nif},
361400
{"midi_deinit", 0, sp_midi_deinit_nif},
362401
{"midi_send", 2, sp_midi_send_nif},

app/external/sp_midi/src/sp_midi.erl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-module(sp_midi).
2-
-export([midi_init/0, midi_deinit/0, midi_send/2, midi_flush/0, midi_ins/0, midi_outs/0, midi_refresh_devices/0,
2+
-export([is_nif_loaded/0, is_nif_initialized/0, midi_init/0, midi_deinit/0, midi_send/2, midi_flush/0, midi_ins/0, midi_outs/0, midi_refresh_devices/0,
33
have_my_pid/0, set_this_pid/1, set_log_level/1, get_current_time_microseconds/0]).
44
-on_load(init/0).
55

@@ -11,6 +11,10 @@ init() ->
1111
ok = erlang:load_nif("/home/luis/projects/sp_midi/build/libsp_midi", 0)
1212
end.
1313

14+
is_nif_loaded() ->
15+
exit(nif_library_not_loaded).
16+
is_nif_initialized() ->
17+
exit(nif_library_not_loaded).
1418
midi_init() ->
1519
exit(nif_library_not_loaded).
1620
midi_deinit() ->

app/external/sp_midi/src/sp_midi.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#pragma once
2424

25+
#include <stdbool.h>
2526
#include <erl_nif.h>
2627

2728
#ifdef WIN32
@@ -34,6 +35,11 @@
3435
extern "C" {
3536
#endif
3637

38+
39+
40+
DllExport int sp_midi_is_nif_loaded(bool* is_nif_loaded);
41+
DllExport int sp_midi_is_nif_initialized(bool* is_nif_initialized);
42+
3743
// TODO: These are exported for C tests. Once we are happy that it's working they should not be exported
3844
/**
3945
* Initialize the spmidi library. Must be called before anything else.
@@ -91,6 +97,9 @@ extern "C" {
9197
// Erlang NIFs. The NIF parameters are always the same, I will only explain the parameters as unpacked from erlang.
9298
// Note that the only NIF that passes data is sp_midi_send_nif(), the rest do not pass anything, and are simple
9399
// wrappers for the C functions that do the real work.
100+
DllExport ERL_NIF_TERM sp_midi_is_nif_loaded_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
101+
DllExport ERL_NIF_TERM sp_midi_is_nif_initialized_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
102+
94103
/**
95104
* Initialize the spmidi library. Must be called before anything else.
96105
*
@@ -126,7 +135,7 @@ extern "C" {
126135

127136
/**
128137
* Trigger a refresh of the MIDI devices. This is triggered from erlang when it a change in the topology is detected
129-
*
138+
*
130139
*/
131140
DllExport ERL_NIF_TERM sp_midi_refresh_devices(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
132141

0 commit comments

Comments
 (0)