ref: 6e5235d08c559605ce833377a7613ab601ab25aa
dir: /midi.c/
#include <stdio.h> #include <thread.h> #include "ft2_header.h" #include "ft2_edit.h" #include "ft2_config.h" #include "ft2_gui.h" #include "ft2_midi.h" #include "ft2_audio.h" #include "ft2_mouse.h" #include "ft2_pattern_ed.h" #include "ft2_structs.h" #include "rtmidi/rtmidi_c.h" static struct RtMidiWrapper notrt; static RtMidiCCallback callback; static int mpfd = -1; unsigned int rtmidi_get_port_count(RtMidiPtr) { if(access("/srv/midi", AREAD) < 0){ notrt.ok = false; return 0; } notrt.ok = true; return 1; } char * rtmidi_get_port_name(RtMidiPtr, unsigned int) { char *s; if((s = strdup("/srv/midi")) == nil) sysfatal("strdup: %r"); return s; } void rtmidi_in_cancel_callback(RtMidiInPtr) { } void rtmidi_close_port(RtMidiPtr) { close(mpfd); mpfd = -1; callback = nil; notrt.ok = false; } void rtmidi_in_free(RtMidiInPtr) { } RtMidiInPtr rtmidi_in_create_default(void) { notrt.ok = true; return ¬rt; } void midiproc(void *) { int fd, n, k; uchar buf[1024]; while((n = read(mpfd, buf, sizeof buf)) > 0){ if(n & 3) fprint(2, "midiproc: malformed message size %d\n", n); for(k=0; k<n; k+=4) if(callback != nil) callback(.0, buf+k+1, 3, nil); else fprint(2, "midiproc: discarding message\n"); } fprint(2, "midiproc is off this merry-go-round: %r\n"); mpfd = -1; } void rtmidi_open_port(RtMidiPtr, unsigned int, char *) { notrt.ok = true; if((mpfd = open("/srv/midi", OREAD)) < 0){ notrt.ok = false; return; } if(procrfork(midiproc, nil, mainstacksize, RFFDG) < 0) sysfatal("proccreate: %r"); } void rtmidi_in_set_callback(RtMidiInPtr, RtMidiCCallback fn, void *) { callback = fn; } void rtmidi_in_ignore_types(RtMidiInPtr, bool, bool, bool) { }