diff --git a/jackd/engine.c b/jackd/engine.c index 93b86b6..06f3e11 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -446,6 +446,8 @@ jack_resize_port_segment (jack_engine_t *engine, * engine->control->buffer_size; } + VERBOSE (engine, "resizing port buffer segment for type %d, one buffer = %u bytes", ptid, one_buffer); + size = nports * one_buffer; if (shm_info->attached_at == 0) { diff --git a/jackd/jackd.c b/jackd/jackd.c index c3a81df..e408aba 100644 --- a/jackd/jackd.c +++ b/jackd/jackd.c @@ -39,6 +39,7 @@ #include #include #include +#include #ifdef USE_CAPABILITIES @@ -521,7 +522,7 @@ main (int argc, char *argv[]) int do_sanity_checks = 1; int show_version = 0; - const char *options = "-d:P:uvshVrRZTFlt:mn:Np:c:"; + const char *options = "-d:P:uvshVrRZTFlt:mM:n:Np:c:"; struct option long_options[] = { /* keep ordered by single-letter option code */ @@ -531,6 +532,7 @@ main (int argc, char *argv[]) { "help", 0, 0, 'h' }, { "tmpdir-location", 0, 0, 'l' }, { "no-mlock", 0, 0, 'm' }, + { "midi-bufsize", 1, 0, 'M' }, { "name", 1, 0, 'n' }, { "no-sanity-checks", 0, 0, 'N' }, { "port-max", 1, 0, 'p' }, @@ -553,6 +555,7 @@ main (int argc, char *argv[]) char *driver_name = NULL; char **driver_args = NULL; JSList * driver_params; + size_t midi_buffer_size = 0; int driver_nargs = 1; int i; int rc; @@ -598,6 +601,10 @@ main (int argc, char *argv[]) do_mlock = 0; break; + case 'M': + midi_buffer_size = (unsigned int) atol (optarg); + break; + case 'n': server_name = optarg; break; @@ -691,6 +698,15 @@ main (int argc, char *argv[]) fprintf (stderr, "jackd: no drivers found; exiting\n"); exit (1); } + + if (midi_buffer_size != 0) { + jack_port_type_info_t* port_type = &jack_builtin_port_types[JACK_MIDI_PORT_TYPE]; + port_type->buffer_size = midi_buffer_size * jack_midi_internal_event_size (); + port_type->buffer_scale_factor = -1; + if (verbose) { + fprintf (stderr, "Set MIDI buffer size to %u bytes\n", port_type->buffer_size); + } + } desc = jack_find_driver_descriptor (driver_name); if (!desc) { diff --git a/libjack/midiport.c b/libjack/midiport.c index bcdb958..3a1d402 100644 --- a/libjack/midiport.c +++ b/libjack/midiport.c @@ -26,9 +26,7 @@ #include #include - -enum { MIDI_INLINE_MAX = sizeof(jack_shmsize_t) }; - +enum { MIDI_INLINE_MAX = 4 }; /* 4 bytes for default event size */ typedef struct _jack_midi_port_info_private { jack_nframes_t nframes; /**< Number of frames in buffer */ @@ -39,14 +37,19 @@ typedef struct _jack_midi_port_info_private { } POST_PACKED_STRUCTURE jack_midi_port_info_private_t; typedef struct _jack_midi_port_internal_event { - int32_t time; - jack_shmsize_t size; - union { - jack_shmsize_t byte_offset; - jack_midi_data_t inline_data[MIDI_INLINE_MAX]; + uint16_t time; /* offset within buffer limit to 64k */ + uint16_t size; /* event size limited to 64k */ + union { + jack_shmsize_t byte_offset; + jack_midi_data_t inline_data[MIDI_INLINE_MAX]; } POST_PACKED_STRUCTURE; } POST_PACKED_STRUCTURE jack_midi_port_internal_event_t; +size_t +jack_midi_internal_event_size () +{ + return sizeof (jack_midi_port_internal_event_t); +} static inline jack_midi_data_t* jack_midi_event_data(void* port_buffer,