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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
use super::auto_release::*;
use cubeb_backend::ffi;
use std::os::raw::{c_long, c_uint, c_void};
use std::ptr;
#[derive(Debug)]
pub struct Resampler(AutoRelease<ffi::cubeb_resampler>);
impl Resampler {
#[allow(clippy::too_many_arguments)]
pub fn new(
stream: *mut ffi::cubeb_stream,
mut input_params: Option<ffi::cubeb_stream_params>,
mut output_params: Option<ffi::cubeb_stream_params>,
target_rate: c_uint,
data_callback: ffi::cubeb_data_callback,
user_ptr: *mut c_void,
quality: ffi::cubeb_resampler_quality,
reclock: ffi::cubeb_resampler_reclock,
) -> Self {
let raw_resampler = unsafe {
let in_params = match &mut input_params {
Some(p) => p,
None => ptr::null_mut(),
};
let out_params = match &mut output_params {
Some(p) => p,
None => ptr::null_mut(),
};
ffi::cubeb_resampler_create(
stream,
in_params,
out_params,
target_rate,
data_callback,
user_ptr,
quality,
reclock,
)
};
assert!(!raw_resampler.is_null(), "Failed to create resampler");
let resampler = AutoRelease::new(raw_resampler, ffi::cubeb_resampler_destroy);
Self(resampler)
}
pub fn fill(
&mut self,
input_buffer: *mut c_void,
input_frame_count: *mut c_long,
output_buffer: *mut c_void,
output_frames_needed: c_long,
) -> c_long {
unsafe {
ffi::cubeb_resampler_fill(
self.0.as_mut(),
input_buffer,
input_frame_count,
output_buffer,
output_frames_needed,
)
}
}
pub fn destroy(&mut self) {
if !self.0.as_ptr().is_null() {
self.0.reset(ptr::null_mut());
}
}
}
impl Drop for Resampler {
fn drop(&mut self) {
self.destroy();
}
}
impl Default for Resampler {
fn default() -> Self {
Self(AutoRelease::new(
ptr::null_mut(),
ffi::cubeb_resampler_destroy,
))
}
}
|