diff --git a/linux/alsarawmidi/JackALSARawMidiPort.cpp b/linux/alsarawmidi/JackALSARawMidiPort.cpp index d2e6f7b5..12ae9259 100644 --- a/linux/alsarawmidi/JackALSARawMidiPort.cpp +++ b/linux/alsarawmidi/JackALSARawMidiPort.cpp @@ -36,20 +36,20 @@ JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info, char device_id[32]; snprintf(device_id, sizeof(device_id), "hw:%d,%d,%d", card, device, subdevice); - const char *alias_prefix; + const char *alias_suffix; const char *error_message; snd_rawmidi_t **in; + const char *name_prefix; snd_rawmidi_t **out; - const char *name_suffix; if (snd_rawmidi_info_get_stream(info) == SND_RAWMIDI_STREAM_OUTPUT) { - alias_prefix = "system:midi_playback_"; + alias_suffix = "out"; in = 0; - name_suffix = "out"; + name_prefix = "system:midi_playback_"; out = &rawmidi; } else { - alias_prefix = "system:midi_capture_"; + alias_suffix = "in"; in = &rawmidi; - name_suffix = "in"; + name_prefix = "system:midi_capture_"; out = 0; } const char *func; @@ -113,9 +113,10 @@ JackALSARawMidiPort::JackALSARawMidiPort(snd_rawmidi_info_t *info, func = "CreateNonBlockingPipe"; goto close; } - snprintf(alias, sizeof(alias), "%s%d", alias_prefix, index + 1); - snprintf(name, sizeof(name), "system:%d-%d %s %d %s", card + 1, device + 1, - snd_rawmidi_info_get_name(info), subdevice + 1, name_suffix); + snprintf(alias, sizeof(alias), "system:%d-%d %s %d %s", card + 1, + device + 1, snd_rawmidi_info_get_name(info), subdevice + 1, + alias_suffix); + snprintf(name, sizeof(name), "%s%d", name_prefix, index + 1); this->io_mask = io_mask; return; free_params: diff --git a/windows/winmme/JackWinMMEOutputPort.cpp b/windows/winmme/JackWinMMEOutputPort.cpp index 65daf6df..1a1cb47b 100644 --- a/windows/winmme/JackWinMMEOutputPort.cpp +++ b/windows/winmme/JackWinMMEOutputPort.cpp @@ -145,16 +145,42 @@ JackWinMMEOutputPort::Execute() LARGE_INTEGER due_time; // 100 ns resolution - due_time.QuadPart = - ((frame_time - current_time) * 10); + due_time.QuadPart = + -((LONGLONG) ((frame_time - current_time) * 10)); if (! SetWaitableTimer(timer, &due_time, 0, NULL, NULL, 0)) { WriteOSError("JackWinMMEOutputPort::Execute", "ChangeTimerQueueTimer"); break; } + // Debugging code + jack_log("JackWinMMEOutputPort::Execute - waiting at %f for %f " + "milliseconds before sending message (current frame: %d, " + "send frame: %d)", + ((double) current_time) / 1000.0, + ((double) (frame_time - current_time)) / 1000.0, + GetFramesFromTime(current_time), event->time); + // End debugging code + if (! Wait(timer)) { break; } + + // Debugging code + jack_time_t wakeup_time = GetMicroSeconds(); + jack_log("JackWinMMEOutputPort::Execute - woke up at %f.", + ((double) wakeup_time) / 1000.0); + if (wakeup_time > frame_time) { + jack_log("JackWinMMEOutputPort::Execute - overslept by %f " + "milliseconds.", + ((double) (wakeup_time - frame_time)) / 1000.0); + } else if (wakeup_time < frame_time) { + jack_log("JackWinMMEOutputPort::Execute - woke up %f " + "milliseconds too early.", + ((double) (frame_time - wakeup_time)) / 1000.0); + } + // End debugging code + } jack_midi_data_t *data = event->buffer; DWORD message = 0;