diff --git a/lib/portmidi/input/reader.ex b/lib/portmidi/input/reader.ex index 923484c..013b03c 100644 --- a/lib/portmidi/input/reader.ex +++ b/lib/portmidi/input/reader.ex @@ -1,8 +1,10 @@ defmodule PortMidi.Input.Reader do import PortMidi.Nifs.Input alias PortMidi.Input.Server + 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 @@ -35,12 +37,15 @@ defmodule PortMidi.Input.Reader do defp loop(server, stream) do if do_poll(stream) == :read, do: read_and_send(server,stream) + :timer.sleep(@input_poll_sleep) loop(server, stream) 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..d7085de 100644 --- a/src/portmidi_in.c +++ b/src/portmidi_in.c @@ -70,10 +70,13 @@ static ERL_NIF_TERM do_read(ErlNifEnv* env, int arc, const ERL_NIF_TERM argv[]) 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)); @@ -86,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); } @@ -97,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"); }