From c1c6475d88fd781a6936b98bc07fbb032880283b Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Tue, 29 Mar 2022 12:26:45 +1100 Subject: Fix track index numbering to be gapless and zero based --- ptformat.cc | 36 ++++++++++++++++++++++++++++++++++++ tests/t.8/basicaudio | 12 ++++++------ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/ptformat.cc b/ptformat.cc index ca7f74d..17aaa38 100644 --- a/ptformat.cc +++ b/ptformat.cc @@ -1066,6 +1066,42 @@ PTFFormat::parserest(void) { tr++; } } + + if (_tracks.begin() == _tracks.end()) + return found; + + /* Sort track entries by index */ + std::sort(_tracks.begin(), _tracks.end()); + + /* Renumber track entries to be gapless */ + for (std::vector::iterator tr = _tracks.begin() + 1; + tr != _tracks.end(); tr++) { + while ((*tr).index == (*(tr-1)).index) { + tr++; + if (tr == _tracks.end()) { + break; + } + } + if (tr == _tracks.end()) { + break; + } + int diffn = (*tr).index - (*(tr-1)).index - 1; + if (diffn) { + for (std::vector::iterator rest = tr; + rest != _tracks.end(); rest++) { + (*rest).index -= diffn; + } + } + } + + /* Renumber track entries to be zero based */ + int first = _tracks[0].index; + if (first > 0) { + for (std::vector::iterator tr = _tracks.begin(); + tr != _tracks.end(); tr++) { + (*tr).index -= first; + } + } return found; } diff --git a/tests/t.8/basicaudio b/tests/t.8/basicaudio index 4b14eb4..33afa67 100755 --- a/tests/t.8/basicaudio +++ b/tests/t.8/basicaudio @@ -35,9 +35,9 @@ Track name (Track#) (Region#) @ Absolute: `4` t(0) r(1) @ 161000 `4` t(0) r(1) @ 184000 `4` t(0) r(1) @ 207000 -`1` t(3) r(1) @ 3000 -`2` t(4) r(3) @ 32000 -`3` t(5) r(5) @ 52000 +`1` t(1) r(1) @ 3000 +`2` t(2) r(3) @ 32000 +`3` t(3) r(5) @ 52000 MIDI Track name (MIDITrack#) (MIDIRegion#) @ Absolute: @@ -52,8 +52,8 @@ Track name (Track#) (WAV filename) @ Absolute + Into-sample, Length: `4` t(0) (24000.wav) @ 161000 + 1000, 23000 `4` t(0) (24000.wav) @ 184000 + 1000, 23000 `4` t(0) (24000.wav) @ 207000 + 1000, 23000 -`1` t(3) (24000.wav) @ 3000 + 1000, 23000 -`2` t(4) (24000.1.wav) @ 32000 + 8000, 16000 -`3` t(5) (24000.2.wav) @ 52000 + 2000, 22000' +`1` t(1) (24000.wav) @ 3000 + 1000, 23000 +`2` t(2) (24000.1.wav) @ 32000 + 8000, 16000 +`3` t(3) (24000.2.wav) @ 52000 + 2000, 22000' run_test -- cgit v1.2.3