[Scummvm-git-logs] scummvm master -> db69616ccd37a9797d53e9675ebe1427cbe02ed8

NMIError noreply at scummvm.org
Mon Sep 22 19:43:36 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
db69616ccd AUDIO: Add section looping to MidiParser


Commit: db69616ccd37a9797d53e9675ebe1427cbe02ed8
    https://github.com/scummvm/scummvm/commit/db69616ccd37a9797d53e9675ebe1427cbe02ed8
Author: Coen Rampen (crampen at gmail.com)
Date: 2025-09-22T21:43:30+02:00

Commit Message:
AUDIO: Add section looping to MidiParser

Changed paths:
    audio/midiparser.cpp
    audio/midiparser.h


diff --git a/audio/midiparser.cpp b/audio/midiparser.cpp
index 2a0542986e5..be3dae773a5 100644
--- a/audio/midiparser.cpp
+++ b/audio/midiparser.cpp
@@ -45,6 +45,10 @@ _centerPitchWheelOnUnload(false),
 _sendSustainOffOnNotesOff(false),
 _disableAllNotesOffMidiEvents(false),
 _disableAutoStartPlayback(false),
+_loopStartPoint(0xFFFFFFFF),
+_loopEndPoint(0xFFFFFFFF),
+_loopStartPointMs(0xFFFFFFFF),
+_loopEndPointMs(0xFFFFFFFF),
 _numTracks(0),
 _activeTrack(255),
 _abortParse(false),
@@ -229,6 +233,23 @@ void MidiParser::onTimer() {
 
 		eventTick = _position._subtracks[subtrack]._lastEventTick + info.delta;
 		eventTime = _position._lastEventTime + (eventTick - _position._lastEventTick) * _psecPerTick;
+
+		if (_loopStartPoint == 0xFFFFFFFF && _loopStartPointMs != 0xFFFFFFFF && eventTime >= _loopStartPointMs) {
+			_loopStartPoint = eventTick;
+		}
+
+		if (_loopStartPoint != 0xFFFFFFFF && _loopEndPoint != 0) {
+			uint32 endTick = (endTime - _position._lastEventTime) / _psecPerTick + _position._lastEventTick;
+
+			if ((_loopEndPoint != 0xFFFFFFFF && eventTick > _loopEndPoint && endTick > _loopEndPoint) ||
+					(eventTime > _loopEndPointMs && endTime > _loopEndPointMs)) {
+				// Loop
+				jumpToTick(_loopStartPoint);
+				_abortParse = true;
+				break;
+			}
+		}
+
 		if (eventTime > endTime)
 			break;
 
@@ -373,9 +394,13 @@ bool MidiParser::processEvent(const EventInfo &info, bool fireEvents) {
 			_position.stopTracking(info.subtrack);
 			if (!_position.isTracking()) {
 				// All subtracks have finished playing
-				if (_autoLoop) {
+				if (_loopStartPoint != 0xFFFFFFFF && _loopEndPoint == 0) {
+					jumpToTick(_loopStartPoint);
+				}
+				else if (_autoLoop) {
 					jumpToTick(0);
-				} else {
+				}
+				else {
 					stopPlaying();
 					if (fireEvents)
 						sendMetaEventToDriver(info.ext.type, info.ext.data, (uint16)info.length);
@@ -438,6 +463,18 @@ void MidiParser::resetTracking() {
 	_position.clear();
 }
 
+void MidiParser::setLoopSection(uint32 startPoint, uint32 endPoint) {
+	_loopStartPoint = startPoint;
+	_loopEndPoint = endPoint;
+}
+
+void MidiParser::setLoopSectionMicroseconds(uint32 startPoint, uint32 endPoint) {
+	_loopStartPointMs = startPoint;
+	_loopEndPointMs = endPoint;
+	_loopStartPoint = (startPoint == 0 ? 0 : 0xFFFFFFFF);
+	_loopEndPoint = (endPoint == 0 ? 0 : 0xFFFFFFFF);
+}
+
 bool MidiParser::setTrack(int track) {
 	if (track < 0 || track >= _numTracks)
 		return false;
diff --git a/audio/midiparser.h b/audio/midiparser.h
index 66cd7bb800e..9b02c879112 100644
--- a/audio/midiparser.h
+++ b/audio/midiparser.h
@@ -368,6 +368,10 @@ protected:
 	uint32 _psecPerTick;  ///< Microseconds per tick (_tempo / _ppqn).
 	uint32 _sysExDelay;     ///< Number of microseconds until the next SysEx event can be sent.
 	bool   _autoLoop;       ///< For lightweight clients that don't provide their own flow control.
+	uint32 _loopStartPoint;   ///< Start point (in ticks) of the looping section of the track.
+	uint32 _loopEndPoint;     ///< End point (in ticks) of the looping section of the track.
+	uint32 _loopStartPointMs; ///< Start point (in microseconds) of the looping section of the track.
+	uint32 _loopEndPointMs;   ///< End point (in microseconds) of the looping section of the track.
 	bool   _smartJump;      ///< Support smart expiration of hanging notes when jumping
 	bool   _centerPitchWheelOnUnload;  ///< Center the pitch wheels when unloading a song
 	bool   _sendSustainOffOnNotesOff;   ///< Send a sustain off on a notes off event, stopping hanging notes
@@ -579,6 +583,9 @@ public:
 	 */
 	virtual bool jumpToIndex(uint8 index, bool stopNotes = true) { return false; }
 
+	void setLoopSection(uint32 startPoint, uint32 endPoint = 0);
+	void setLoopSectionMicroseconds(uint32 startPoint, uint32 endPoint = 0);
+
 	uint32 getPPQN() { return _ppqn; }
 	virtual uint32 getTick() { return _position._playTick; }
 




More information about the Scummvm-git-logs mailing list