1
0
mirror of https://github.com/TomHarte/CLK.git synced 2026-04-21 02:17:08 +00:00

Added a guarantee that the TrackSerialiser won't modify tracks it receives.

This commit is contained in:
Thomas Harte
2018-05-18 23:03:28 -04:00
parent ed06533e60
commit 8263c48a1d
9 changed files with 21 additions and 18 deletions
+7 -4
View File
@@ -8,11 +8,14 @@
#include "TrackSerialiser.hpp"
#include <memory>
// TODO: if this is a PCMTrack with only one segment and that segment's bit rate is within tolerance,
// just return a copy of that segment.
Storage::Disk::PCMSegment Storage::Disk::track_serialisation(Track &track, Time length_of_a_bit) {
Storage::Disk::PCMSegment Storage::Disk::track_serialisation(const Track &track, Time length_of_a_bit) {
unsigned int history_size = 16;
DigitalPhaseLockedLoop pll(100, history_size);
std::unique_ptr<Track> track_copy(track.clone());
struct ResultAccumulator: public DigitalPhaseLockedLoop::Delegate {
PCMSegment result;
@@ -29,12 +32,12 @@ Storage::Disk::PCMSegment Storage::Disk::track_serialisation(Track &track, Time
length_multiplier.simplify();
// start at the index hole
track.seek_to(Time(0));
track_copy->seek_to(Time(0));
// grab events until the next index hole
Time time_error = Time(0);
while(true) {
Track::Event next_event = track.get_next_event();
Track::Event next_event = track_copy->get_next_event();
if(next_event.type == Track::Event::IndexHole) break;
Time extended_length = next_event.length * length_multiplier + time_error;
@@ -47,7 +50,7 @@ Storage::Disk::PCMSegment Storage::Disk::track_serialisation(Track &track, Time
if(history_size) {
history_size--;
if(!history_size) {
track.seek_to(Time(0));
track_copy->seek_to(Time(0));
time_error.set_zero();
pll.set_delegate(&result_accumulator);
}