Skip to content

Commit edd76be

Browse files
committed
We need to make sure we are shifting startsAt after range extraction.
1 parent f5aab21 commit edd76be

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

src/SoundFingerprinting.Tests/Unit/Data/HashesTest.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,16 +150,35 @@ public void ShouldMergeNonOverlappingSequences()
150150
var dtfi = CultureInfo.GetCultureInfo("en-US").DateTimeFormat;
151151
int count = 80;
152152
var aStartsAt = DateTime.Parse("01/15/2019 10:00:00", dtfi);
153-
var a = new Hashes(GetHashedFingerprints(count), count * 1.48f + 1.48f, aStartsAt);
153+
var a = new Hashes(GetHashedFingerprints(count), count * 1.48f, aStartsAt);
154154
var bStartsAt = DateTime.Parse("01/15/2019 10:02:00", dtfi);
155-
var b = new Hashes(GetHashedFingerprints(count), count * 1.48f + 1.48f, bStartsAt);
155+
var b = new Hashes(GetHashedFingerprints(count), count * 1.48f, bStartsAt);
156156

157-
Assert.IsTrue(a.MergeWith(b, out var c));
157+
Assert.IsTrue(a.MergeWith(b, out var c, 2 * 1.48f));
158158
Assert.AreEqual(count * 2, c.Count);
159+
160+
AssertInvariantsForHashes(c, aStartsAt);
159161
var rangeA = c.GetRange(aStartsAt, 120);
160162
AssertHashesAreEqual(a, rangeA);
163+
AssertInvariantsForHashes(rangeA, aStartsAt);
161164
var rangeB = c.GetRange(bStartsAt, 120);
162165
AssertHashesAreEqual(b, rangeB);
166+
AssertInvariantsForHashes(rangeB, bStartsAt);
167+
}
168+
169+
private static void AssertInvariantsForHashes(Hashes hashes, DateTime startsAt)
170+
{
171+
Assert.AreEqual(startsAt, hashes.RelativeTo);
172+
var list = hashes.ToList();
173+
Assert.AreEqual(0, list.First().StartsAt);
174+
Assert.AreEqual(0, list.First().SequenceNumber);
175+
for (int i = 1; i < hashes.Count; ++i)
176+
{
177+
Assert.IsTrue(list[i].StartsAt >= list[i - 1].StartsAt);
178+
Assert.IsTrue(list[i].SequenceNumber >= list[i - 1].SequenceNumber);
179+
}
180+
181+
Assert.AreEqual(hashes.DurationInSeconds, list.Last().StartsAt - list.First().StartsAt + 1.48f, 0.1f);
163182
}
164183

165184
private static void AssertHashesAreEqual(Hashes a, Hashes b)

src/SoundFingerprinting/Data/Hashes.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,28 @@ public Hashes GetRange(DateTime startsAt, float length)
136136
return fingerprintStartsAt >= startsAt && fingerprintEndsAt <= endsAt;
137137
})
138138
.ToList();
139-
139+
140140
if (!filtered.Any())
141141
{
142142
return new Hashes(Enumerable.Empty<HashedFingerprint>(), 0, startsAt);
143143
}
144144

145145
var relativeTo = RelativeTo.AddSeconds(filtered.First().StartsAt);
146146
var duration = filtered.Last().StartsAt - filtered.First().StartsAt + lengthOfOneFingerprint;
147-
return new Hashes(filtered, duration, relativeTo, Origins, StreamId);
147+
var shifted = ShiftStartsAtAccordingToSelectedRange(filtered);
148+
return new Hashes(shifted, duration, relativeTo, Origins, StreamId);
149+
}
150+
151+
private static List<HashedFingerprint> ShiftStartsAtAccordingToSelectedRange(List<HashedFingerprint> filtered)
152+
{
153+
var startsAtShift = filtered.First().StartsAt;
154+
var shifted = filtered.Select((fingerprint,
155+
index) => new HashedFingerprint(fingerprint.HashBins,
156+
(uint) index,
157+
fingerprint.StartsAt - startsAtShift,
158+
fingerprint.OriginalPoint))
159+
.ToList();
160+
return shifted;
148161
}
149162

150163
public bool MergeWith(Hashes with, out Hashes? merged, double allowedGap = 1.48f)

0 commit comments

Comments
 (0)