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(); | ||||||
|         let stream = match config.sample_format() { |         // https://www.opus-codec.org/docs/html_api/group__opusencoder.html#gace941e4ef26ed844879fde342ffbe546
 | ||||||
|             cpal::SampleFormat::F32 => device.build_input_stream( |         // https://chromium.googlesource.com/chromium/deps/opus/+/1.1.1/include/opus.h
 | ||||||
|                 &config.into(), |         let encode_len = sample_rate as usize * channels as usize / 100; // 10 ms
 | ||||||
|                 move |data, _: &_| { |         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( |                 send( | ||||||
|                         data, |                     &frame, | ||||||
|                     sample_rate_0, |                     sample_rate_0, | ||||||
|                     sample_rate, |                     sample_rate, | ||||||
|                     channels, |                     channels, | ||||||
|                     &mut encoder, |                     &mut encoder, | ||||||
|                     &sp, |                     &sp, | ||||||
|                 ); |                 ); | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let stream = match config.sample_format() { | ||||||
|  |             cpal::SampleFormat::F32 => device.build_input_stream( | ||||||
|  |                 &config.into(), | ||||||
|  |                 move |data, _: &_| { | ||||||
|  |                     INPUT_BUFFER.lock().unwrap().extend(data); | ||||||
|  |                     send_input_stream(); | ||||||
|                 }, |                 }, | ||||||
|                 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