ref: 5d0ee6967dcaba54cb08fde6ea7835208b15894c
dir: /ft2-clone-latest-and-midi/
diff d3f10b96512210ac8854f4355a11e9104a546644 uncommitted
--- /dev/null
+++ b/midi.c
@@ -1,0 +1,171 @@
+#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 mpid = -1;
+static char *epfile, *eptab[MAX_MIDI_DEVICES];
+static int neps;
+
+static int
+scaneps(void)
+{
+ int fd, i, n, m;
+ char *s, *p, **t, **e, buf[512], *fl[32];
+ Dir *d;
+
+ e = eptab + nelem(eptab);
+ for(t=eptab; t<e; t++){
+ free(*t);
+ *t = nil;
+ }
+ neps = 0;
+ t = eptab;
+ /* special case for plugging in any non endpoint file */
+ if((s = getenv("midikbd")) != nil){
+ *t++ = s;
+ neps++;
+ }
+ if((fd = open("/dev/usb", OREAD)) < 0){
+ fprint(2, "scanusbep: %r\n");
+ return neps;
+ }
+ n = dirreadall(fd, &d);
+ close(fd);
+ if(n < 0){
+ fprint(2, "scanusbep: %r\n");
+ return neps;
+ }
+ for(i=0; i<n; i++){
+ snprint(buf, sizeof buf, "/dev/usb/%s/ctl", d[i].name);
+ if(epfile != nil && (s = strrchr(epfile, '/')) != nil){
+ if(strncmp(buf, epfile, s - epfile) == 0)
+ goto gotit;
+ }
+ if((fd = open(buf, OREAD)) < 0)
+ continue;
+ if((m = pread(fd, buf, sizeof buf, 0)) <= 0)
+ continue;
+ close(fd);
+ buf[m-1] = 0;
+ if(getfields(buf, fl, nelem(fl), 0, " ") < 26)
+ continue;
+ if(strcmp(fl[0], "enabled") != 0
+ || strcmp(fl[2], "r") != 0 && strcmp(fl[2], "rw") != 0
+ || strcmp(fl[25], "idle") != 0)
+ continue;
+ gotit:
+ if((*t++ = smprint("/dev/usb/%s/data", d[i].name)) == nil)
+ sysfatal("smprint: %r\n");
+ neps++;
+ if(t >= e)
+ break;
+ }
+ free(d);
+ return neps;
+}
+
+unsigned int
+rtmidi_get_port_count(RtMidiPtr)
+{
+ notrt.ok = true;
+ return scaneps();
+}
+
+char *
+rtmidi_get_port_name(RtMidiPtr, unsigned int i)
+{
+ char *s;
+
+ //assert(i < neps);
+ if(i >= neps)
+ return epfile;
+ if((s = strdup(eptab[i])) == nil)
+ sysfatal("strdup: %r");
+ return s;
+}
+
+void
+rtmidi_in_cancel_callback(RtMidiInPtr)
+{
+}
+
+void rtmidi_close_port(RtMidiPtr)
+{
+ threadkill(mpid);
+ mpid = -1;
+ callback = nil;
+ notrt.ok = false;
+ epfile = nil;
+}
+
+void rtmidi_in_free(RtMidiInPtr)
+{
+}
+
+RtMidiInPtr
+rtmidi_in_create_default(void)
+{
+ notrt.ok = true;
+ return ¬rt;
+}
+
+void
+midiproc(void *ep)
+{
+ int fd, n, k;
+ uchar buf[1024];
+
+ if((fd = open((char*)ep, OREAD)) < 0){
+ fprint(2, "midiproc: could not open stream: %r; exiting");
+ goto end;
+ }
+ while((n = read(fd, 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");
+end:
+ epfile = nil;
+ notrt.ok = false;
+ mpid = -1;
+}
+
+void
+rtmidi_open_port(RtMidiPtr, unsigned int i, char *)
+{
+ assert(mpid < 0);
+ if(i >= neps) /* could be plugging in a new device, try again */
+ scaneps();
+ assert(i < neps);
+ notrt.ok = true;
+ epfile = eptab[i];
+ if((mpid = proccreate(midiproc, epfile, mainstacksize)) < 0)
+ sysfatal("proccreate: %r");
+}
+
+void
+rtmidi_in_set_callback(RtMidiInPtr, RtMidiCCallback fn, void *)
+{
+ callback = fn;
+}
+
+void
+rtmidi_in_ignore_types(RtMidiInPtr, bool, bool, bool)
+{
+}
--- a/src/ft2_audio.c
+++ b/src/ft2_audio.c
@@ -5,6 +5,7 @@
#include <stdio.h>
#include <stdint.h>
+#include <math.h>
#include "ft2_header.h"
#include "ft2_config.h"
#include "scopes/ft2_scopes.h"
--- a/src/ft2_hpc.c
+++ b/src/ft2_hpc.c
@@ -11,6 +11,7 @@
#include <SDL2/SDL.h>
#include <stdint.h>
#include <stdbool.h>
+#include <math.h>
#include "ft2_hpc.h"
#define FRAC_BITS 53
--- a/src/ft2_main.c
+++ b/src/ft2_main.c
@@ -93,12 +93,12 @@
}
#endif
-#ifdef _WIN32
-
// ALT+F4 is used in FT2, but is "close program" in Windows...
#if SDL_MINOR_VERSION >= 24 || (SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL >= 4)
SDL_SetHint(SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4, "1");
#endif
+
+#ifdef _WIN32
#ifndef _MSC_VER
SetProcessDPIAware();
--- a/src/ft2_midi.c
+++ b/src/ft2_midi.c
@@ -285,7 +285,10 @@
uint32_t i;
if (midi.inputDeviceName != NULL)
+ {
free(midi.inputDeviceName);
+ midi.inputDeviceName = NULL;
+ }
const uint32_t numDevices = getNumMidiInDevices();
if (numDevices == 0)
--- a/src/ft2_scrollbars.c
+++ b/src/ft2_scrollbars.c
@@ -224,7 +224,7 @@
{
dTmp = (scrollBar->w / (double)scrollBar->end) * scrollBar->page;
tmp32 = (int32_t)(dTmp + 0.5);
- realThumbLength = (int16_t)CLAMP(tmp32, 1, scrollBar->w);
+ realThumbLength = (int16_t)CLAMP(tmp32, 1, (int)scrollBar->w);
}
else
{
@@ -251,7 +251,7 @@
}
// prevent scrollbar thumb coords from being outside of the scrollbar area
- thumbX = CLAMP(thumbX, scrollBar->x, scrollEnd-1);
+ thumbX = CLAMP((int)thumbX, (int)scrollBar->x, (int)scrollEnd-1);
if (thumbX+thumbW > scrollEnd)
thumbW = scrollEnd - thumbX;
}
@@ -267,7 +267,7 @@
{
dTmp = (scrollBar->h / (double)scrollBar->end) * scrollBar->page;
tmp32 = (int32_t)(dTmp + 0.5);
- realThumbLength = (int16_t)CLAMP(tmp32, 1, scrollBar->h);
+ realThumbLength = (int16_t)CLAMP(tmp32, 1, (int)scrollBar->h);
}
else
{
@@ -293,7 +293,7 @@
}
// prevent scrollbar thumb coords from being outside of the scrollbar area
- thumbY = CLAMP(thumbY, scrollBar->y, scrollEnd - 1);
+ thumbY = CLAMP((int)thumbY, (int)scrollBar->y, (int)scrollEnd - 1);
if (thumbY+thumbH > scrollEnd)
thumbH = scrollEnd - thumbY;
}
@@ -523,7 +523,7 @@
}
assert(scrollBar->w > 0);
- scrollPos = CLAMP(scrollPos, 0, scrollBar->w);
+ scrollPos = CLAMP((int)scrollPos, 0, (int)scrollBar->w);
length = scrollBar->w + (scrollBar->realThumbLength - scrollBar->thumbW);
if (length < 1)
@@ -549,7 +549,7 @@
scrollPos = mouse.lastScrollY - scrollBar->y - mouse.saveMouseY;
assert(scrollBar->h > 0);
- scrollPos = CLAMP(scrollPos, 0, scrollBar->h);
+ scrollPos = CLAMP((int)scrollPos, 0, (int)scrollBar->h);
length = scrollBar->h + (scrollBar->realThumbLength - scrollBar->thumbH);
if (length < 1)
@@ -617,7 +617,7 @@
}
assert(scrollBar->w > 0);
- scrollX = CLAMP(scrollX, 0, scrollBar->w);
+ scrollX = CLAMP((int)scrollX, 0, (int)scrollBar->w);
length = scrollBar->w + (scrollBar->realThumbLength - scrollBar->thumbW);
if (length < 1)
@@ -641,7 +641,7 @@
scrollY = mouse.lastScrollY - mouse.saveMouseY - scrollBar->y;
assert(scrollBar->h > 0);
- scrollY = CLAMP(scrollY, 0, scrollBar->h);
+ scrollY = CLAMP((int)scrollY, 0, (int)scrollBar->h);
length = scrollBar->h + (scrollBar->realThumbLength - scrollBar->thumbH);
if (length < 1)
--- a/src/ft2_video.c
+++ b/src/ft2_video.c
@@ -80,9 +80,9 @@
static void drawFPSCounter(void)
{
- SDL_version SDLVer;
+ //SDL_version SDLVer;
- SDL_GetVersion(&SDLVer);
+ //SDL_GetVersion(&SDLVer);
if (editor.framesPassed >= FPS_SCAN_FRAMES && (editor.framesPassed % FPS_SCAN_FRAMES) == 0)
{
@@ -132,7 +132,8 @@
"Relative mouse coords: %d,%d\n" \
"Absolute mouse coords: %d,%d\n" \
"Press CTRL+SHIFT+F to close this box.\n",
- SDLVer.major, SDLVer.minor, SDLVer.patch,
+ //SDLVer.major, SDLVer.minor, SDLVer.patch,
+ 9, 9, 9,
dAvgFPS,
dRefreshRate,
video.vsync60HzPresent ? "yes" : "no",