Skip to content

Commit eb0193f

Browse files
committed
sounds
1 parent 936c8f7 commit eb0193f

File tree

1 file changed

+23
-44
lines changed

1 file changed

+23
-44
lines changed

src/sound.rs

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)