1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use audio::{Audio, BUFFER_CAPACITY};

pub struct DefaultAudio {
	buffer_index: usize,
	buffer: [f32; BUFFER_CAPACITY],
	previous_value: f32
}

impl DefaultAudio {
	pub fn new() -> Self {
		DefaultAudio {
			buffer_index: 0,
			buffer: [0.0; BUFFER_CAPACITY],
			previous_value: 0.0
		}
	}
}

impl Audio for DefaultAudio {
	fn push(&mut self, value: f32) {
		if self.buffer_index >= BUFFER_CAPACITY {
			return;
		}
		self.buffer[self.buffer_index] = value;
		self.buffer_index += 1;
	}

	fn copy_sample_buffer(&mut self, sample_buffer: &mut [f32]) {
		// @TODO: Remove side effect?

		// @TODO: Remove magic number
		let client_sample_buffer_length = 4096;

		for i in 0..client_sample_buffer_length {
			sample_buffer[i] = match i >= self.buffer_index {
				true => self.previous_value,
				false => self.buffer[i]
			};
			self.previous_value = sample_buffer[i];
		}
		for i in client_sample_buffer_length..self.buffer.len() {
			self.buffer[i - client_sample_buffer_length] = self.buffer[i];
		}
		self.buffer_index = match self.buffer_index < client_sample_buffer_length {
			true => 0,
			false => self.buffer_index - client_sample_buffer_length
		};
	}
}