Skip to content

Commit edf802c

Browse files
committed
SP_Link - add new API fns is_nif_loaded is_nif_initialized
These can be used to check the status of the NIF at runtime.
1 parent f672308 commit edf802c

File tree

5 files changed

+60
-2
lines changed

5 files changed

+60
-2
lines changed

app/external/sp_link/src/sp_link.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,26 @@ int sp_link_init(double bpm)
8585

8686
void sp_link_deinit()
8787
{
88+
lock_guard<std::mutex> lock (g_init_mutex);
8889
if (!g_initialized){
8990
return;
9091
}
9192
delete g_link;
9293
g_initialized = false;
9394
}
9495

96+
int sp_link_is_nif_initialized(bool* is_nif_initialized)
97+
{
98+
*is_nif_initialized = g_initialized ? 1 : 0;
99+
return 0;
100+
}
101+
102+
int sp_link_is_nif_loaded(bool* is_nif_loaded)
103+
{
104+
*is_nif_loaded = true;
105+
return 0;
106+
}
107+
95108

96109
int sp_link_enable(bool enable)
97110
{

app/external/sp_link/src/sp_link.erl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-module(sp_link).
2-
-export([init_nif/1, deinit_nif/0, enable/1, is_enabled/0, set_tempo/2, get_tempo/0, get_num_peers/0,
2+
-export([is_nif_loaded/0, is_nif_initialized/0, init_nif/1, deinit_nif/0, enable/1, is_enabled/0, set_tempo/2, get_tempo/0, get_num_peers/0,
33
start_stop_sync_enable/1, is_start_stop_sync_enabled/0, set_is_playing/2, is_playing/0, get_time_for_is_playing/0,
44
get_beat_at_time/2, get_phase_at_time/2, get_time_at_beat/2, request_beat_at_time/3, force_beat_at_time/3,
55
request_beat_at_start_playing_time/2, set_is_playing_and_request_beat_at_time/4, set_callback_pid/1,
@@ -14,6 +14,10 @@ init() ->
1414
ok = erlang:load_nif("/home/luis/projects/sp_link/build/libsp_link", 0)
1515
end.
1616

17+
is_nif_loaded() ->
18+
exit(nif_library_not_loaded).
19+
is_nif_initialized() ->
20+
exit(nif_library_not_loaded).
1721
init_nif(_) ->
1822
exit(nif_library_not_loaded).
1923
deinit_nif() ->

app/external/sp_link/src/sp_link.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ extern "C" {
3232
#endif
3333

3434
// TODO: These are exported for C tests. Once we are happy that it's working they should not be exported
35+
3536
/**
3637
* Initialize the sp_link library. Must be called before anything else.
3738
*
@@ -44,7 +45,20 @@ extern "C" {
4445
*/
4546
DllExport void sp_link_deinit();
4647

48+
DllExport int sp_link_is_nif_loaded(bool* is_nif_loaded);
49+
50+
/**
51+
* Returns true if init has been called
52+
*/
53+
DllExport int sp_link_is_nif_initialized(bool* is_nif_initialized);
4754

55+
/**
56+
* Enable/disable the sp_link library. This should be called after init to
57+
* enable/disable network connectivity with other link peers on the local
58+
* network.
59+
*
60+
* @return 0 if ok, < 0 if error
61+
*/
4862
DllExport int sp_link_enable(bool enable);
4963

5064
DllExport int sp_link_is_enabled(bool* enabled);

app/external/sp_link/src/sp_link_nifs.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,27 @@
2929

3030
extern int g_monitor_level;
3131

32+
ERL_NIF_TERM sp_link_is_nif_loaded_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
33+
{
34+
bool loaded;
35+
int rc = sp_link_is_nif_loaded(&loaded);
36+
if (rc < 0){
37+
return enif_make_atom(env, "error");
38+
}
39+
return enif_make_atom(env, loaded ? "true" : "false");
40+
}
41+
42+
ERL_NIF_TERM sp_link_is_nif_initialized_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
43+
{
44+
bool initialized;
45+
int rc = sp_link_is_nif_initialized(&initialized);
46+
if (rc < 0){
47+
return enif_make_atom(env, "error");
48+
}
49+
return enif_make_atom(env, initialized ? "true" : "false");
50+
}
51+
52+
3253

3354
ERL_NIF_TERM sp_link_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
3455
{
@@ -375,7 +396,7 @@ ERL_NIF_TERM sp_link_set_link_callback_pid_nif(ErlNifEnv* env, int argc, const E
375396
if (!enif_is_pid(env, argv[0])){
376397
return enif_make_badarg(env);
377398
}
378-
399+
379400
ErlNifPid link_erlang_callback_pid;
380401
int rc = enif_get_local_pid(env, argv[0], &link_erlang_callback_pid);
381402
if (rc){
@@ -411,6 +432,8 @@ ERL_NIF_TERM sp_link_get_current_time_microseconds_nif(ErlNifEnv* env, int argc,
411432

412433

413434
static ErlNifFunc nif_funcs[] = {
435+
{"is_nif_loaded", 0, sp_link_is_nif_loaded_nif},
436+
{"is_nif_initialized", 0, sp_link_is_nif_initialized_nif},
414437
{"init_nif", 1, sp_link_init_nif},
415438
{"deinit_nif", 0, sp_link_deinit_nif},
416439
{"enable", 1, sp_link_enable_nif},

app/external/sp_link/src/sp_link_nifs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ extern "C" {
4343
/**
4444
* Deinitialize the sp_link library.
4545
*/
46+
DllExport ERL_NIF_TERM sp_link_is_nif_loaded_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
47+
48+
DllExport ERL_NIF_TERM sp_link_is_nif_initialized_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
49+
4650
DllExport ERL_NIF_TERM sp_link_deinit_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
4751

4852
DllExport ERL_NIF_TERM sp_link_enable_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);

0 commit comments

Comments
 (0)