示例#1
0
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;
}