[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