@@ -186,36 +186,29 @@ impl SquareChannel {
186186 self . delay = 0 ;
187187 }
188188 } else {
189- let mut time = start_time;
189+ let mut time = start_time + self . delay ;
190190 let pattern = WAVE_PATTERN [ self . duty as usize ] ;
191191 let vol = self . volume . volume as i32 ;
192192
193193 while time < end_time {
194- if self . delay > 0 {
195- let delay_time = std:: cmp:: min ( self . delay , end_time - time) ;
196- time += delay_time;
197- self . delay -= delay_time;
198- if time >= end_time {
199- break ;
200- }
201- }
202-
203194 let amp = vol * pattern[ self . phase as usize ] ;
204195 if amp != self . last_amp {
205196 self . blip . add_delta ( time, amp - self . last_amp ) ;
206197 self . last_amp = amp;
207198 }
208199
200+ time += self . period ;
209201 self . phase = ( self . phase + 1 ) % 8 ;
210- self . delay = self . period ;
211202 }
203+
204+ self . delay = time - end_time;
212205 }
213206 }
214207
215208 fn trigger ( & mut self ) {
216209 self . enabled = true ;
217210 self . calculate_period ( ) ;
218- self . delay = 0 ; // Match rboy - no initial delay for square channels
211+ self . delay = 0 ; // No initial delay for square channels
219212 if self . sweep_period != 0 || self . sweep_shift != 0 {
220213 self . sweep_enabled = true ;
221214 self . sweep_freq = self . freq ;
@@ -322,7 +315,7 @@ impl WaveChannel {
322315 self . delay = 0 ;
323316 }
324317 } else {
325- let mut time = start_time;
318+ let mut time = start_time + self . delay ;
326319
327320 // Volume shift for wave channel (output at 4x amplitude)
328321 let volshift = match self . volume_shift {
@@ -334,15 +327,6 @@ impl WaveChannel {
334327 } ;
335328
336329 while time < end_time {
337- if self . delay > 0 {
338- let delay_time = std:: cmp:: min ( self . delay , end_time - time) ;
339- time += delay_time;
340- self . delay -= delay_time;
341- if time >= end_time {
342- break ;
343- }
344- }
345-
346330 let byte = self . waveram [ self . wave_pos as usize / 2 ] ;
347331 let sample = if self . wave_pos & 1 == 0 {
348332 byte >> 4
@@ -358,17 +342,19 @@ impl WaveChannel {
358342 self . last_amp = amp;
359343 }
360344
345+ time += self . period ;
361346 self . wave_pos = ( self . wave_pos + 1 ) % 32 ;
362- self . delay = self . period ;
363347 }
348+
349+ self . delay = time - end_time;
364350 }
365351 }
366352
367353 fn trigger ( & mut self ) {
368354 self . enabled = true ;
369355 self . wave_pos = 0 ;
370356 self . calculate_period ( ) ;
371- self . delay = 4 ; // Match rboy's initial delay
357+ self . delay = 4 ; // Initial delay for wave channel
372358 }
373359}
374360
@@ -422,18 +408,9 @@ impl NoiseChannel {
422408 self . delay = 0 ;
423409 }
424410 } else {
425- let mut time = start_time;
411+ let mut time = start_time + self . delay ;
426412
427413 while time < end_time {
428- if self . delay > 0 {
429- let delay_time = std:: cmp:: min ( self . delay , end_time - time) ;
430- time += delay_time;
431- self . delay -= delay_time;
432- if time >= end_time {
433- break ;
434- }
435- }
436-
437414 // Update LFSR
438415 let bit = ( self . lfsr & 1 ) ^ ( ( self . lfsr >> 1 ) & 1 ) ;
439416 self . lfsr = ( self . lfsr >> 1 ) | ( bit << 14 ) ;
@@ -453,8 +430,10 @@ impl NoiseChannel {
453430 self . last_amp = amp;
454431 }
455432
456- self . delay = self . period ;
433+ time + = self . period ;
457434 }
435+
436+ self . delay = time - end_time;
458437 }
459438 }
460439
@@ -558,15 +537,15 @@ impl Sound {
558537 self . run ( ) ;
559538
560539 // End frame for all channels
561- self . channel1 . blip . end_frame ( self . time ) ;
562- self . channel2 . blip . end_frame ( self . time ) ;
563- self . channel3 . blip . end_frame ( self . time ) ;
564- self . channel4 . blip . end_frame ( self . time ) ;
565-
566- // Adjust next_time before resetting time
567- self . next_time -= self . time ;
568- self . time = 0 ;
569- self . prev_time = 0 ;
540+ self . channel1 . blip . end_frame ( self . output_period ) ;
541+ self . channel2 . blip . end_frame ( self . output_period ) ;
542+ self . channel3 . blip . end_frame ( self . output_period ) ;
543+ self . channel4 . blip . end_frame ( self . output_period ) ;
544+
545+ // Adjust timing
546+ self . time -= self . output_period ;
547+ self . next_time -= self . output_period ;
548+ self . prev_time -= self . output_period ;
570549
571550 self . play_samples ( ) ;
572551 }
0 commit comments