From 35214926a8f34d9a88826cd979c6c6cde4df1699 Mon Sep 17 00:00:00 2001 From: Kovak Date: Mon, 10 Jun 2019 16:28:10 -0700 Subject: [PATCH 1/5] fix errors in portmidi in handling --- lib/portmidi/input/reader.ex | 8 ++++++-- src/portmidi_in.c | 11 +++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/portmidi/input/reader.ex b/lib/portmidi/input/reader.ex index 923484c..5ae07e0 100644 --- a/lib/portmidi/input/reader.ex +++ b/lib/portmidi/input/reader.ex @@ -1,6 +1,7 @@ defmodule PortMidi.Input.Reader do import PortMidi.Nifs.Input alias PortMidi.Input.Server + require Logger @buffer_size Application.get_env(:portmidi, :buffer_size, 256) @@ -39,8 +40,11 @@ defmodule PortMidi.Input.Reader do end defp read_and_send(server, stream) do - messages = do_read(stream, @buffer_size) - Server.new_messages(server, messages) + + case do_read(stream, @buffer_size) do + {:error, reason} -> Logger.debug("Error Reading Midi: #{reason}") + messages -> Server.new_messages(server, messages) + end end defp do_stop({_server, stream, task}) do diff --git a/src/portmidi_in.c b/src/portmidi_in.c index f43d731..ff5e9cd 100644 --- a/src/portmidi_in.c +++ b/src/portmidi_in.c @@ -61,19 +61,22 @@ static ERL_NIF_TERM do_poll(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) } } + static ERL_NIF_TERM do_read(ErlNifEnv* env, int arc, const ERL_NIF_TERM argv[]) { PmEvent buffer[MAXBUFLEN]; int status, data1, data2, timestamp; static PortMidiStream ** stream; - ErlNifResourceType* streamType = (ErlNifResourceType*)enif_priv_data(env); if(!enif_get_resource(env, argv[0], streamType, (PortMidiStream **) &stream)) { return enif_make_badarg(env); } - - int bufferSize = enif_make_int(env, argv[2]); + long bufferSize; + enif_get_long(env, argv[1], &bufferSize); int numEvents = Pm_Read(*stream, buffer, bufferSize); - + if (numEvents < 0) { + ERL_NIF_TERM reason = enif_make_atom(env, makePmErrorAtom(numEvents)); + return enif_make_tuple2(env, enif_make_atom(env, "error"), reason); + } ERL_NIF_TERM events[numEvents]; for(int i = 0; i < numEvents; i++) { status = enif_make_int(env, Pm_MessageStatus(buffer[i].message)); From ffb3967a6c23a828c6bebe3414e12c66ebd8bd29 Mon Sep 17 00:00:00 2001 From: Kovak Date: Mon, 10 Jun 2019 16:43:35 -0700 Subject: [PATCH 2/5] sleep between polling so we dont poll too fast --- lib/portmidi/input/reader.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/portmidi/input/reader.ex b/lib/portmidi/input/reader.ex index 5ae07e0..1e5d2e4 100644 --- a/lib/portmidi/input/reader.ex +++ b/lib/portmidi/input/reader.ex @@ -36,6 +36,7 @@ defmodule PortMidi.Input.Reader do defp loop(server, stream) do if do_poll(stream) == :read, do: read_and_send(server,stream) + :timer.sleep(1) loop(server, stream) end From a0e78d839eedc1f102fc8156631fbddc3474761b Mon Sep 17 00:00:00 2001 From: Kovak Date: Mon, 10 Jun 2019 16:47:25 -0700 Subject: [PATCH 3/5] make sleep time configurable --- lib/portmidi/input/reader.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/portmidi/input/reader.ex b/lib/portmidi/input/reader.ex index 1e5d2e4..78c73ef 100644 --- a/lib/portmidi/input/reader.ex +++ b/lib/portmidi/input/reader.ex @@ -4,6 +4,7 @@ defmodule PortMidi.Input.Reader do require Logger @buffer_size Application.get_env(:portmidi, :buffer_size, 256) + @input_poll_sleep Application.get_env(:portmidi, :input_poll_sleep, 1) def start_link(server, device_name) do Agent.start_link fn -> start(server, device_name) end @@ -36,7 +37,7 @@ defmodule PortMidi.Input.Reader do defp loop(server, stream) do if do_poll(stream) == :read, do: read_and_send(server,stream) - :timer.sleep(1) + :timer.sleep(@input_poll_sleep) loop(server, stream) end From 560d07d778fdb737b9b98aa83dab3c02d3594f35 Mon Sep 17 00:00:00 2001 From: Kovak Date: Tue, 11 Jun 2019 11:02:36 -0700 Subject: [PATCH 4/5] fix some spacing things --- src/portmidi_in.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/portmidi_in.c b/src/portmidi_in.c index ff5e9cd..d7085de 100644 --- a/src/portmidi_in.c +++ b/src/portmidi_in.c @@ -61,11 +61,11 @@ static ERL_NIF_TERM do_poll(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) } } - static ERL_NIF_TERM do_read(ErlNifEnv* env, int arc, const ERL_NIF_TERM argv[]) { PmEvent buffer[MAXBUFLEN]; int status, data1, data2, timestamp; static PortMidiStream ** stream; + ErlNifResourceType* streamType = (ErlNifResourceType*)enif_priv_data(env); if(!enif_get_resource(env, argv[0], streamType, (PortMidiStream **) &stream)) { return enif_make_badarg(env); @@ -89,7 +89,6 @@ static ERL_NIF_TERM do_read(ErlNifEnv* env, int arc, const ERL_NIF_TERM argv[]) timestamp ); } - return enif_make_list_from_array(env, events, numEvents); } @@ -100,9 +99,7 @@ static ERL_NIF_TERM do_close(ErlNifEnv* env, int arc, const ERL_NIF_TERM argv[]) if(!enif_get_resource(env, argv[0], streamType, (PortMidiStream **) &stream)) { return enif_make_badarg(env); } - Pm_Close(*stream); - return enif_make_atom(env, "ok"); } From 7258af7e985528fc91f0cfe0b68164a8cbe2b0f2 Mon Sep 17 00:00:00 2001 From: Kovak Date: Tue, 11 Jun 2019 11:03:54 -0700 Subject: [PATCH 5/5] more spacing fixes --- lib/portmidi/input/reader.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/portmidi/input/reader.ex b/lib/portmidi/input/reader.ex index 78c73ef..013b03c 100644 --- a/lib/portmidi/input/reader.ex +++ b/lib/portmidi/input/reader.ex @@ -42,7 +42,6 @@ defmodule PortMidi.Input.Reader do end defp read_and_send(server, stream) do - case do_read(stream, @buffer_size) do {:error, reason} -> Logger.debug("Error Reading Midi: #{reason}") messages -> Server.new_messages(server, messages)