mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-01 11:49:58 +00:00
Made an attempt to implement seek_to
on PCMSegmentEventSource
, taking account of off-by-half counting.
This commit is contained in:
parent
3116a2cf4c
commit
3297f6d545
@ -47,3 +47,40 @@ Storage::Disk::Track::Event PCMSegmentEventSource::get_next_event()
|
|||||||
next_event_.type = Track::Event::IndexHole;
|
next_event_.type = Track::Event::IndexHole;
|
||||||
return next_event_;
|
return next_event_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Storage::Time PCMSegmentEventSource::get_length()
|
||||||
|
{
|
||||||
|
return segment_.length_of_a_bit * segment_.number_of_bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
Storage::Time PCMSegmentEventSource::seek_to(const Time &time_from_start)
|
||||||
|
{
|
||||||
|
// test for requested time being beyond the end
|
||||||
|
Time length = get_length();
|
||||||
|
if(time_from_start >= length)
|
||||||
|
{
|
||||||
|
next_event_.type = Track::Event::IndexHole;
|
||||||
|
bit_pointer_ = segment_.number_of_bits;
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if not beyond the end then make an initial assumption that the next thing encountered will be a flux transition
|
||||||
|
next_event_.type = Track::Event::FluxTransition;
|
||||||
|
|
||||||
|
// test for requested time being before the first bit
|
||||||
|
Time half_bit_length = segment_.length_of_a_bit;
|
||||||
|
half_bit_length.length >>= 1;
|
||||||
|
if(time_from_start < half_bit_length)
|
||||||
|
{
|
||||||
|
bit_pointer_ = 0;
|
||||||
|
Storage::Time zero;
|
||||||
|
return zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
// adjust for time to get to bit zero and determine number of bits in
|
||||||
|
Time relative_time = time_from_start - half_bit_length;
|
||||||
|
bit_pointer_ = (relative_time / segment_.length_of_a_bit).get_unsigned_int();
|
||||||
|
|
||||||
|
// map up to the correct amount of time
|
||||||
|
return half_bit_length + segment_.length_of_a_bit * (unsigned int)bit_pointer_;
|
||||||
|
}
|
||||||
|
@ -36,6 +36,9 @@ class PCMSegmentEventSource {
|
|||||||
Track::Event get_next_event();
|
Track::Event get_next_event();
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
Time seek_to(const Time &time_from_start);
|
||||||
|
Time get_length();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PCMSegment segment_;
|
PCMSegment segment_;
|
||||||
size_t bit_pointer_;
|
size_t bit_pointer_;
|
||||||
|
@ -36,17 +36,37 @@ struct Time {
|
|||||||
/*!
|
/*!
|
||||||
@returns the floating point conversion of this @c Time. This will often be less precise.
|
@returns the floating point conversion of this @c Time. This will often be less precise.
|
||||||
*/
|
*/
|
||||||
inline float get_float()
|
inline float get_float() const
|
||||||
{
|
{
|
||||||
return (float)length / (float)clock_rate;
|
return (float)length / (float)clock_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool operator < (Time other)
|
inline unsigned int get_unsigned_int() const
|
||||||
|
{
|
||||||
|
return length / clock_rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator < (const Time &other) const
|
||||||
{
|
{
|
||||||
return other.clock_rate * length < clock_rate * other.length;
|
return other.clock_rate * length < clock_rate * other.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time operator + (Time other)
|
inline bool operator <= (const Time &other) const
|
||||||
|
{
|
||||||
|
return other.clock_rate * length <= clock_rate * other.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator > (const Time &other) const
|
||||||
|
{
|
||||||
|
return other.clock_rate * length > clock_rate * other.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator >= (const Time &other) const
|
||||||
|
{
|
||||||
|
return other.clock_rate * length >= clock_rate * other.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Time operator + (const Time &other) const
|
||||||
{
|
{
|
||||||
Time result;
|
Time result;
|
||||||
result.clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
result.clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
||||||
@ -54,7 +74,7 @@ struct Time {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time &operator += (Time other)
|
inline Time &operator += (const Time &other)
|
||||||
{
|
{
|
||||||
unsigned int combined_clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
unsigned int combined_clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
||||||
length = length * (combined_clock_rate / clock_rate) + other.length * (combined_clock_rate / other.clock_rate);
|
length = length * (combined_clock_rate / clock_rate) + other.length * (combined_clock_rate / other.clock_rate);
|
||||||
@ -62,7 +82,7 @@ struct Time {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time operator - (Time other)
|
inline Time operator - (const Time &other) const
|
||||||
{
|
{
|
||||||
Time result;
|
Time result;
|
||||||
result.clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
result.clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
||||||
@ -70,7 +90,7 @@ struct Time {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time operator -= (Time other)
|
inline Time operator -= (const Time &other)
|
||||||
{
|
{
|
||||||
unsigned int combined_clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
unsigned int combined_clock_rate = NumberTheory::least_common_multiple(clock_rate, other.clock_rate);
|
||||||
length = length * (combined_clock_rate / clock_rate) - other.length * (combined_clock_rate / other.clock_rate);
|
length = length * (combined_clock_rate / clock_rate) - other.length * (combined_clock_rate / other.clock_rate);
|
||||||
@ -78,7 +98,7 @@ struct Time {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time operator * (Time other)
|
inline Time operator * (const Time &other) const
|
||||||
{
|
{
|
||||||
Time result;
|
Time result;
|
||||||
result.clock_rate = clock_rate * other.clock_rate;
|
result.clock_rate = clock_rate * other.clock_rate;
|
||||||
@ -86,14 +106,28 @@ struct Time {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time &operator *= (Time other)
|
inline Time &operator *= (const Time &other)
|
||||||
{
|
{
|
||||||
length *= other.length;
|
length *= other.length;
|
||||||
clock_rate *= other.clock_rate;
|
clock_rate *= other.clock_rate;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time operator / (Time other)
|
inline Time operator * (unsigned int multiplier) const
|
||||||
|
{
|
||||||
|
Time result;
|
||||||
|
result.clock_rate = clock_rate * multiplier;
|
||||||
|
result.length = length;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Time &operator *= (unsigned int multiplier)
|
||||||
|
{
|
||||||
|
length *= multiplier;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Time operator / (const Time &other) const
|
||||||
{
|
{
|
||||||
Time result;
|
Time result;
|
||||||
result.clock_rate = clock_rate * other.length;
|
result.clock_rate = clock_rate * other.length;
|
||||||
@ -101,7 +135,7 @@ struct Time {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Time &operator /= (Time other)
|
inline Time &operator /= (const Time &other)
|
||||||
{
|
{
|
||||||
length *= other.clock_rate;
|
length *= other.clock_rate;
|
||||||
clock_rate *= other.length;
|
clock_rate *= other.length;
|
||||||
|
Loading…
Reference in New Issue
Block a user