simplify Raylib queueAudio using IsAudioStreamProcessed guard
This commit is contained in:
+2
-33
@@ -120,39 +120,8 @@ pub const Driver = struct {
|
|||||||
|
|
||||||
pub fn queueAudio(self: *Driver, output: usize, buffer: contract.AudioBuffer) void {
|
pub fn queueAudio(self: *Driver, output: usize, buffer: contract.AudioBuffer) void {
|
||||||
_ = output;
|
_ = output;
|
||||||
if (buffer.frames == 0) return;
|
if (buffer.frames > 0 and c.IsAudioStreamProcessed(self.audio_stream)) {
|
||||||
|
c.UpdateAudioStream(self.audio_stream, buffer.data.ptr, @intCast(buffer.frames));
|
||||||
const samples = std.mem.bytesAsSlice(i16, buffer.data);
|
|
||||||
for (samples[0..@min(samples.len, buffer.frames)]) |s| {
|
|
||||||
const next = (self.audio_ring_head + 1) % self.audio_ring.len;
|
|
||||||
if (next != self.audio_ring_tail) {
|
|
||||||
self.audio_ring[self.audio_ring_head] = s;
|
|
||||||
self.audio_ring_head = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.flushAudio();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flushAudio(self: *Driver) void {
|
|
||||||
while (c.IsAudioStreamProcessed(self.audio_stream)) {
|
|
||||||
var chunk: [512]i16 = undefined;
|
|
||||||
var count: usize = 0;
|
|
||||||
|
|
||||||
// Measure available samples in ring buffer
|
|
||||||
const available = if (self.audio_ring_head >= self.audio_ring_tail)
|
|
||||||
self.audio_ring_head - self.audio_ring_tail
|
|
||||||
else
|
|
||||||
self.audio_ring.len - self.audio_ring_tail + self.audio_ring_head;
|
|
||||||
|
|
||||||
if (available < chunk.len) break;
|
|
||||||
|
|
||||||
while (count < chunk.len) : (count += 1) {
|
|
||||||
chunk[count] = self.audio_ring[self.audio_ring_tail];
|
|
||||||
self.audio_ring_tail = (self.audio_ring_tail + 1) % self.audio_ring.len;
|
|
||||||
}
|
|
||||||
|
|
||||||
c.UpdateAudioStream(self.audio_stream, &chunk, @intCast(count));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user