shithub: m8c

Download patch

ref: 127850b5c82f3de866274e4f799a971d8e99db1d
parent: ae22bca6100884fabcf28d67ff34d7b5aada7654
author: Jonne Kokkonen <jonne.kokkonen@gmail.com>
date: Wed Apr 9 09:24:49 EDT 2025

rtmidi backend: double check device disconnection if no data received

--- a/src/backends/m8_libserialport.c
+++ b/src/backends/m8_libserialport.c
@@ -380,6 +380,7 @@
       // try opening the serial port to check if it's alive
       if (serial_port_connected()) {
         // the device is still there, carry on
+        empty_cycles = 0;
         return DEVICE_PROCESSING;
       }
       SDL_LogError(SDL_LOG_CATEGORY_SYSTEM,
--- a/src/backends/m8_rtmidi.c
+++ b/src/backends/m8_rtmidi.c
@@ -26,7 +26,7 @@
 bool midi_processing_suspended = false;
 bool midi_sysex_received = false;
 
-bool message_is_m8_sysex(const unsigned char *message) {
+static bool message_is_m8_sysex(const unsigned char *message) {
   if (memcmp(m8_sysex_header, message, m8_sysex_header_size) == 0) {
     return true;
   }
@@ -33,7 +33,7 @@
   return false;
 }
 
-void midi_decode(const uint8_t *encoded_data, size_t length, uint8_t **decoded_data,
+static void midi_decode(const uint8_t *encoded_data, size_t length, uint8_t **decoded_data,
                  size_t *decoded_length) {
   if (length < m8_sysex_header_size) {
     // Invalid data
@@ -124,7 +124,7 @@
   }
 }
 
-void close_and_free_midi_ports(void) {
+static void close_and_free_midi_ports(void) {
   SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "Freeing MIDI ports");
   rtmidi_in_cancel_callback(midi_in);
   rtmidi_close_port(midi_in);
@@ -136,9 +136,9 @@
   midi_sysex_received = false;
 }
 
-int initialize_rtmidi() {
+static int initialize_rtmidi() {
   SDL_Log("Initializing rtmidi");
-  midi_in = rtmidi_in_create(RTMIDI_API_UNSPECIFIED, "m8c_in", 1024);
+  midi_in = rtmidi_in_create(RTMIDI_API_UNSPECIFIED, "m8c_in", 2048);
   midi_out = rtmidi_out_create(RTMIDI_API_UNSPECIFIED, "m8c_out");
   if (midi_in == NULL || midi_out == NULL) {
     return 0;
@@ -146,11 +146,11 @@
   return 1;
 }
 
-int detect_m8_midi_device(const int verbose, const char *preferred_device) {
+static int detect_m8_midi_device(const int verbose, const char *preferred_device) {
   int m8_midi_port_number = -1;
   const unsigned int ports_total_in = rtmidi_get_port_count(midi_in);
   if (verbose)
-    SDL_Log("Number of MIDI in ports: %d", ports_total_in);
+    SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "Number of MIDI in ports: %d", ports_total_in);
   for (unsigned int port_number = 0; port_number < ports_total_in; port_number++) {
     int port_name_length_in;
     rtmidi_get_port_name(midi_in, port_number, NULL, &port_name_length_in);
@@ -171,6 +171,35 @@
   return m8_midi_port_number;
 }
 
+static int device_still_exists() {
+  if (midi_in == NULL || midi_out == NULL) {
+    return 0;
+  };
+
+  int m8_midi_port_number = 0;
+
+  SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "Checking if opened MIDI port still exists");
+
+  m8_midi_port_number = detect_m8_midi_device(0, NULL);
+  if (m8_midi_port_number >= 0) {
+    return 1;
+  }
+  return 0;
+}
+
+static int disconnect(void) {
+  SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "Sending disconnect message to M8");
+  const unsigned char disconnect_sysex[8] = {0xF0, 0x00, 0x02, 0x61, 0x00, 0x00, 'D', 0xF7};
+  const int result =
+      rtmidi_out_send_message(midi_out, &disconnect_sysex[0], sizeof(disconnect_sysex));
+  if (result != 0) {
+    SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Failed to send disconnect");
+  }
+  close_and_free_midi_ports();
+  return !result;
+}
+
+
 int m8_initialize(const int verbose, const char *preferred_device) {
 
   int m8_midi_port_number = 0;
@@ -226,18 +255,6 @@
   return result;
 }
 
-int disconnect(void) {
-  SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "Sending disconnect message to M8");
-  const unsigned char disconnect_sysex[8] = {0xF0, 0x00, 0x02, 0x61, 0x00, 0x00, 'D', 0xF7};
-  const int result =
-      rtmidi_out_send_message(midi_out, &disconnect_sysex[0], sizeof(disconnect_sysex));
-  if (result != 0) {
-    SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Failed to send disconnect");
-  }
-  close_and_free_midi_ports();
-  return !result;
-}
-
 int m8_send_msg_controller(const unsigned char input) {
   SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "MIDI key inputs not implemented yet");
   return 0;
@@ -301,14 +318,18 @@
   } else {
     empty_cycles++;
     if (empty_cycles >= conf->wait_packets) {
+      if (device_still_exists()) {
+        empty_cycles = 0;
+        return DEVICE_PROCESSING;
+      }
       SDL_Log("No messages received for %d cycles, assuming device disconnected", empty_cycles);
       close_and_free_midi_ports();
       destroy_queue(&queue);
       empty_cycles = 0;
-      return 0;
+      return DEVICE_DISCONNECTED;
     }
   }
-  return 1;
+  return DEVICE_PROCESSING;
 }
 
 int m8_close() {
--