Use signed 16-bit samples, saturate when mixing
This commit is contained in:
Generated
+11
-1
@@ -1,4 +1,14 @@
|
||||
[[package]]
|
||||
name = "source"
|
||||
name = "audiod"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"redox_syscall 0.1.49 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.49"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[metadata]
|
||||
"checksum redox_syscall 0.1.49 (registry+https://github.com/rust-lang/crates.io-index)" = "f22c50afdcf3f0a31ebb6b47697f6a7c5e5a24967e842858118bce0615f0afad"
|
||||
|
||||
+7
-7
@@ -10,7 +10,7 @@ const HANDLE_BUFFER_SIZE: usize = 4096;
|
||||
|
||||
struct Handle {
|
||||
flags: usize,
|
||||
buffer: VecDeque<(u16, u16)>,
|
||||
buffer: VecDeque<(i16, i16)>,
|
||||
}
|
||||
|
||||
pub struct AudioScheme {
|
||||
@@ -26,15 +26,15 @@ impl AudioScheme {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn buffer(&mut self) -> [(u16, u16); HDA_BUFFER_SIZE] {
|
||||
let mut buffer = [(0, 0); HDA_BUFFER_SIZE];
|
||||
pub fn buffer(&mut self) -> [(i16, i16); HDA_BUFFER_SIZE] {
|
||||
let mut buffer = [(0i16, 0i16); HDA_BUFFER_SIZE];
|
||||
|
||||
for (_id, handle) in self.handles.iter_mut() {
|
||||
let mut i = 0;
|
||||
while i < buffer.len() {
|
||||
if let Some(sample) = handle.buffer.pop_front() {
|
||||
buffer[i].0 += sample.0;
|
||||
buffer[i].1 += sample.1;
|
||||
buffer[i].0 = buffer[i].0.saturating_add(sample.0);
|
||||
buffer[i].1 = buffer[i].1.saturating_add(sample.1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -72,8 +72,8 @@ impl SchemeBlockMut for AudioScheme {
|
||||
let mut i = 0;
|
||||
while i + 4 <= buf.len() {
|
||||
handle.buffer.push_back((
|
||||
(buf[i] as u16) | ((buf[i + 1] as u16) << 8),
|
||||
(buf[i + 2] as u16) | ((buf[i + 3] as u16) << 8)
|
||||
(buf[i] as i16) | ((buf[i + 1] as i16) << 8),
|
||||
(buf[i + 2] as i16) | ((buf[i + 3] as i16) << 8)
|
||||
));
|
||||
|
||||
i += 4;
|
||||
|
||||
Reference in New Issue
Block a user