fix audio encode
Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
parent
1280b7beb4
commit
9eaf745f18
@ -109,6 +109,7 @@ mod cpal_impl {
|
|||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
static ref HOST: Host = cpal::default_host();
|
static ref HOST: Host = cpal::default_host();
|
||||||
|
static ref INPUT_BUFFER: Arc<Mutex<std::collections::VecDeque<f32>>> = Default::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -242,18 +243,31 @@ mod cpal_impl {
|
|||||||
LowDelay,
|
LowDelay,
|
||||||
)?;
|
)?;
|
||||||
let channels = config.channels();
|
let channels = config.channels();
|
||||||
|
// https://www.opus-codec.org/docs/html_api/group__opusencoder.html#gace941e4ef26ed844879fde342ffbe546
|
||||||
|
// https://chromium.googlesource.com/chromium/deps/opus/+/1.1.1/include/opus.h
|
||||||
|
let encode_len = sample_rate as usize * channels as usize / 100; // 10 ms
|
||||||
|
INPUT_BUFFER.lock().unwrap().clear();
|
||||||
|
let mut send_input_stream = move || {
|
||||||
|
let mut lock = INPUT_BUFFER.lock().unwrap();
|
||||||
|
while lock.len() >= encode_len {
|
||||||
|
let frame: Vec<f32> = lock.drain(0..encode_len).collect();
|
||||||
|
send(
|
||||||
|
&frame,
|
||||||
|
sample_rate_0,
|
||||||
|
sample_rate,
|
||||||
|
channels,
|
||||||
|
&mut encoder,
|
||||||
|
&sp,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let stream = match config.sample_format() {
|
let stream = match config.sample_format() {
|
||||||
cpal::SampleFormat::F32 => device.build_input_stream(
|
cpal::SampleFormat::F32 => device.build_input_stream(
|
||||||
&config.into(),
|
&config.into(),
|
||||||
move |data, _: &_| {
|
move |data, _: &_| {
|
||||||
send(
|
INPUT_BUFFER.lock().unwrap().extend(data);
|
||||||
data,
|
send_input_stream();
|
||||||
sample_rate_0,
|
|
||||||
sample_rate,
|
|
||||||
channels,
|
|
||||||
&mut encoder,
|
|
||||||
&sp,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
err_fn,
|
err_fn,
|
||||||
)?,
|
)?,
|
||||||
@ -261,14 +275,8 @@ mod cpal_impl {
|
|||||||
&config.into(),
|
&config.into(),
|
||||||
move |data: &[i16], _: &_| {
|
move |data: &[i16], _: &_| {
|
||||||
let buffer: Vec<_> = data.iter().map(|s| cpal::Sample::to_f32(s)).collect();
|
let buffer: Vec<_> = data.iter().map(|s| cpal::Sample::to_f32(s)).collect();
|
||||||
send(
|
INPUT_BUFFER.lock().unwrap().extend(buffer);
|
||||||
&buffer,
|
send_input_stream();
|
||||||
sample_rate_0,
|
|
||||||
sample_rate,
|
|
||||||
channels,
|
|
||||||
&mut encoder,
|
|
||||||
&sp,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
err_fn,
|
err_fn,
|
||||||
)?,
|
)?,
|
||||||
@ -276,14 +284,8 @@ mod cpal_impl {
|
|||||||
&config.into(),
|
&config.into(),
|
||||||
move |data: &[u16], _: &_| {
|
move |data: &[u16], _: &_| {
|
||||||
let buffer: Vec<_> = data.iter().map(|s| cpal::Sample::to_f32(s)).collect();
|
let buffer: Vec<_> = data.iter().map(|s| cpal::Sample::to_f32(s)).collect();
|
||||||
send(
|
INPUT_BUFFER.lock().unwrap().extend(buffer);
|
||||||
&buffer,
|
send_input_stream();
|
||||||
sample_rate_0,
|
|
||||||
sample_rate,
|
|
||||||
channels,
|
|
||||||
&mut encoder,
|
|
||||||
&sp,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
err_fn,
|
err_fn,
|
||||||
)?,
|
)?,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user