Index: pm_mac/pmmacosxcm.c =================================================================== --- pm_mac/pmmacosxcm.c (revision 234) +++ pm_mac/pmmacosxcm.c (working copy) @@ -63,7 +63,9 @@ Note that this distorts accurate timestamps somewhat. */ +#ifndef LIMIT_RATE #define LIMIT_RATE 1 +#endif #define SYSEX_BUFFER_SIZE 128 @@ -107,11 +109,13 @@ /* allow for running status (is running status possible here? -rbd): -cpr */ unsigned char last_command; int32_t last_msg_length; +#if LIMIT_RATE /* limit midi data rate (a CoreMidi requirement): */ UInt64 min_next_time; /* when can the next send take place? */ int byte_count; /* how many bytes in the next packet list? */ Float64 us_per_host_tick; /* host clock frequency, units of min_next_time */ UInt64 host_ticks_per_byte; /* host clock units per byte at maximum rate */ +#endif } midi_macosxcm_node, *midi_macosxcm_type; /* private function declarations */ @@ -427,11 +431,13 @@ m->packet = NULL; m->last_command = 0; m->last_msg_length = 0; +#if LIMIT_RATE m->min_next_time = 0; m->byte_count = 0; m->us_per_host_tick = 1000000.0 / AudioGetHostClockFrequency(); m->host_ticks_per_byte = (UInt64) (1000000.0 / (m->us_per_host_tick * MAX_BYTES_PER_S)); +#endif return pmNoError; } @@ -477,6 +483,7 @@ assert(endpoint); if (m->packet != NULL) { /* out of space, send the buffer and start refilling it */ + #if LIMIT_RATE /* before we can send, maybe delay to limit data rate. OS X allows * 15KB/s. */ UInt64 now = AudioGetCurrentHostTime(); @@ -484,10 +491,11 @@ usleep((useconds_t) ((m->min_next_time - now) * m->us_per_host_tick)); } + m->min_next_time = now + m->byte_count * m->host_ticks_per_byte; + m->byte_count = 0; + #endif macHostError = MIDISend(portOut, endpoint, m->packetList); m->packet = NULL; /* indicate no data in packetList now */ - m->min_next_time = now + m->byte_count * m->host_ticks_per_byte; - m->byte_count = 0; if (macHostError != noErr) goto send_packet_error; } return pmNoError; @@ -514,7 +522,9 @@ m->packet = MIDIPacketListAdd(m->packetList, sizeof(m->packetBuffer), m->packet, timestamp, messageLength, message); +#if LIMIT_RATE m->byte_count += messageLength; +#endif if (m->packet == NULL) { /* out of space, send the buffer and start refilling it */ /* make midi->packet non-null to fool midi_write_flush into sending */ @@ -567,13 +577,15 @@ messageLength = midi_length(what); /* make sure we go foreward in time */ - if (timestamp < m->min_next_time) timestamp = m->min_next_time; - - #ifdef LIMIT_RATE - if (timestamp < m->last_time) - timestamp = m->last_time; + if (timestamp < m->last_time) + timestamp = m->last_time; +#if LIMIT_RATE + if (timestamp < m->min_next_time) + timestamp = m->min_next_time; m->last_time = timestamp + messageLength * m->host_ticks_per_byte; - #endif +#else + m->last_time = timestamp; +#endif /* Add this message to the packet list */ return send_packet(midi, message, messageLength, timestamp); @@ -613,15 +625,17 @@ assert(m); /* make sure we go foreward in time */ + if (m->sysex_timestamp < m->last_time) + m->sysex_timestamp = m->last_time; + +#if LIMIT_RATE if (m->sysex_timestamp < m->min_next_time) m->sysex_timestamp = m->min_next_time; - - #ifdef LIMIT_RATE - if (m->sysex_timestamp < m->last_time) - m->sysex_timestamp = m->last_time; - m->last_time = m->sysex_timestamp + m->sysex_byte_count * - m->host_ticks_per_byte; - #endif + m->last_time = m->sysex_timestamp + m->sysex_byte_count * + m->host_ticks_per_byte; +#else + m->last_time = m->sysex_timestamp; +#endif /* now send what's in the buffer */ err = send_packet(midi, m->sysex_buffer, m->sysex_byte_count,