mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-23 03:32:32 +00:00
Made an effort to support zoned tracks, at least.
This commit is contained in:
parent
ada2f073e0
commit
19ee430d4a
@ -36,6 +36,8 @@ G64::G64(const char *file_name)
|
|||||||
_number_of_tracks = (uint8_t)fgetc(_file);
|
_number_of_tracks = (uint8_t)fgetc(_file);
|
||||||
_maximum_track_size = (uint16_t)fgetc(_file);
|
_maximum_track_size = (uint16_t)fgetc(_file);
|
||||||
_maximum_track_size |= (uint16_t)fgetc(_file) << 8;
|
_maximum_track_size |= (uint16_t)fgetc(_file) << 8;
|
||||||
|
|
||||||
|
get_track_at_position(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
G64::~G64()
|
G64::~G64()
|
||||||
@ -105,13 +107,36 @@ std::shared_ptr<Track> G64::get_track_at_position(unsigned int position)
|
|||||||
uint8_t speed_zone_contents[speed_zone_length];
|
uint8_t speed_zone_contents[speed_zone_length];
|
||||||
fread(speed_zone_contents, 1, speed_zone_length, _file);
|
fread(speed_zone_contents, 1, speed_zone_length, _file);
|
||||||
|
|
||||||
// TODO: divide into individual PCMSegments (per byte, if necessary), shove into a PCMTrack
|
// divide track into appropriately timed PCMSegments
|
||||||
|
std::vector<PCMSegment> segments;
|
||||||
|
unsigned int current_speed = speed_zone_contents[0] >> 6;
|
||||||
|
unsigned int start_byte_in_current_speed = 0;
|
||||||
|
for(unsigned int byte = 0; byte < track_length; byte ++)
|
||||||
|
{
|
||||||
|
unsigned int byte_speed = speed_zone_contents[byte >> 2] >> (6 - (byte&3)*2);
|
||||||
|
if(byte_speed != current_speed || byte == (track_length-1))
|
||||||
|
{
|
||||||
|
unsigned int number_of_bytes = byte - start_byte_in_current_speed;
|
||||||
|
|
||||||
|
PCMSegment segment;
|
||||||
|
segment.duration.length = number_of_bytes * 8;
|
||||||
|
segment.duration.clock_rate = current_speed;
|
||||||
|
segment.data.reset(new uint8_t[number_of_bytes]);
|
||||||
|
memcpy(segment.data.get(), &track_contents.get()[start_byte_in_current_speed], number_of_bytes);
|
||||||
|
segments.push_back(std::move(segment));
|
||||||
|
|
||||||
|
current_speed = byte_speed;
|
||||||
|
start_byte_in_current_speed = byte;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resulting_track.reset(new PCMTrack(std::move(segments)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PCMSegment segment;
|
PCMSegment segment;
|
||||||
segment.duration.length = track_length * 8;
|
segment.duration.length = track_length * 8;
|
||||||
segment.duration.clock_rate = track_length * 8;
|
segment.duration.clock_rate = 1; // this is arbitrary; if supplying only one PCMSegment then it'll naturally fill the track
|
||||||
segment.data = std::move(track_contents);
|
segment.data = std::move(track_contents);
|
||||||
|
|
||||||
resulting_track.reset(new PCMTrack(std::move(segment)));
|
resulting_track.reset(new PCMTrack(std::move(segment)));
|
||||||
|
Loading…
Reference in New Issue
Block a user