changeset 2006:327332138c5c

Prevent wait truncation in VGM logging
author Michael Pavone <pavone@retrodev.com>
date Fri, 16 Oct 2020 21:40:47 -0700
parents 3ce38692a3f2
children f612c1bd2c8b
files vgm.c vgm.h
diffstat 2 files changed, 4 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/vgm.c	Sun Oct 11 22:42:10 2020 -0700
+++ b/vgm.c	Fri Oct 16 21:40:47 2020 -0700
@@ -71,11 +71,12 @@
 	}
 	uint64_t last_sample = (uint64_t)writer->last_cycle * (uint64_t)44100;
 	last_sample /= (uint64_t)writer->master_clock;
-	uint64_t sample = (uint64_t)cycle * (uint64_t)44100;
+	uint64_t sample = ((uint64_t)cycle + (uint64_t)writer->extra_delta) * (uint64_t)44100;
 	sample /= (uint64_t)writer->master_clock;
 	uint32_t delta = sample - last_sample;
 	
 	writer->last_cycle = cycle;
+	writer->extra_delta = 0;
 	writer->header.num_samples += delta;
 	wait_commands(writer, delta);
 }
@@ -113,6 +114,7 @@
 void vgm_adjust_cycles(vgm_writer *writer, uint32_t deduction)
 {
 	if (deduction > writer->last_cycle) {
+		writer->extra_delta += deduction - writer->last_cycle;
 		writer->last_cycle = 0;
 	} else {
 		writer->last_cycle -= deduction;
--- a/vgm.h	Sun Oct 11 22:42:10 2020 -0700
+++ b/vgm.h	Fri Oct 16 21:40:47 2020 -0700
@@ -79,6 +79,7 @@
 	FILE       *f;
 	uint32_t   master_clock;
 	uint32_t   last_cycle;
+	uint32_t   extra_delta;
 } vgm_writer;
 
 vgm_writer *vgm_write_open(char *filename, uint32_t rate, uint32_t clock, uint32_t cycle);