int SMFProcessor::seek(SynthRoute *synthRoute, const MidiEventList &midiEvents, int currentEventIx, MasterClockNanos seekNanos, MasterClockNanos currentEventNanos) { MasterClockNanos nanosNow = MasterClock::getClockNanos(); while (!stopProcessing && currentEventNanos < seekNanos && currentEventIx < midiEvents.size()) { const MidiEvent &e = midiEvents.at(currentEventIx); while (!stopProcessing && synthRoute->getState() == SynthRouteState_OPEN) { bool res = true; switch (e.getType()) { case SHORT_MESSAGE: { quint32 msg = e.getShortMessage(); if ((msg & 0xE0) != 0x80) res = synthRoute->pushMIDIShortMessage(msg, nanosNow); break; } case SYSEX: res = synthRoute->pushMIDISysex(e.getSysexData(), e.getSysexLen(), nanosNow); break; case SET_TEMPO: { uint tempo = e.getShortMessage(); midiTick = parser.getMidiTick(tempo); emit driver->tempoUpdated(MidiParser::MICROSECONDS_PER_MINUTE / tempo); break; } default: break; } if (res) break; qDebug() << "SMFProcessor: MIDI buffer became full while seeking, taking a nap"; usleep(MAX_SLEEP_TIME / MasterClock::NANOS_PER_MICROSECOND); nanosNow = MasterClock::getClockNanos(); } currentEventIx++; currentEventNanos += e.getTimestamp() * midiTick; } return currentEventIx; }