summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2022-03-29 12:26:45 +1100
committerDamien Zammit <damien@zamaudio.com>2022-03-29 13:02:21 +1100
commitc1c6475d88fd781a6936b98bc07fbb032880283b (patch)
tree5ceb1a40d8a0f95a90f3940a26c27efaa55e4bbe
parent232ba2575316a132a3fa977aa096904afe8e979d (diff)
Fix track index numbering to be gapless and zero basedHEADmaster
-rw-r--r--ptformat.cc36
-rwxr-xr-xtests/t.8/basicaudio12
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<track_t>::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<track_t>::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<track_t>::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