optimize audio
This commit is contained in:
		
							parent
							
								
									66e39b62a2
								
							
						
					
					
						commit
						f69f6bc8d4
					
				| @ -11,7 +11,7 @@ use std::{ | ||||
| }; | ||||
| type Xdo = *const c_void; | ||||
| 
 | ||||
| pub const PA_SAMPLE_RATE: u32 = 24000; | ||||
| pub const PA_SAMPLE_RATE: u32 = 48000; | ||||
| static mut UNMODIFIED: bool = true; | ||||
| 
 | ||||
| thread_local! { | ||||
|  | ||||
| @ -115,9 +115,6 @@ mod cpal_impl { | ||||
|         encoder: &mut Encoder, | ||||
|         sp: &GenericService, | ||||
|     ) { | ||||
|         if data.iter().filter(|x| **x != 0.).next().is_none() { | ||||
|             return; | ||||
|         } | ||||
|         let buffer; | ||||
|         let data = if sample_rate0 != sample_rate { | ||||
|             buffer = crate::common::resample_channels(data, sample_rate0, sample_rate, channels); | ||||
| @ -194,7 +191,6 @@ mod cpal_impl { | ||||
|             log::error!("an error occurred on stream: {}", err); | ||||
|         }; | ||||
|         // Sample rate must be one of 8000, 12000, 16000, 24000, or 48000.
 | ||||
|         // Note: somehow 48000 not work
 | ||||
|         let sample_rate_0 = config.sample_rate().0; | ||||
|         let sample_rate = if sample_rate_0 < 12000 { | ||||
|             8000 | ||||
| @ -202,9 +198,12 @@ mod cpal_impl { | ||||
|             12000 | ||||
|         } else if sample_rate_0 < 24000 { | ||||
|             16000 | ||||
|         } else { | ||||
|         } else if sample_rate_0 < 48000 { | ||||
|             24000 | ||||
|         } else { | ||||
|             48000 | ||||
|         }; | ||||
|         log::debug!("Audio sample rate : {}",sample_rate); | ||||
|         let mut encoder = Encoder::new( | ||||
|             sample_rate, | ||||
|             if config.channels() > 1 { Stereo } else { Mono }, | ||||
| @ -278,19 +277,39 @@ fn create_format_msg(sample_rate: u32, channels: u16) -> Message { | ||||
|     msg | ||||
| } | ||||
| 
 | ||||
| // use AUDIO_ZERO_COUNT for the Noise(Zero) Gate Attack Time
 | ||||
| // every audio data length is set to 480
 | ||||
| // MAX_AUDIO_ZERO_COUNT=800 is similar as Gate Attack Time 3~5s(Linux) || 6~8s(Windows)
 | ||||
| const MAX_AUDIO_ZERO_COUNT: u16 = 800; | ||||
| static mut AUDIO_ZERO_COUNT: u16 = 0; | ||||
| 
 | ||||
| fn send_f32(data: &[f32], encoder: &mut Encoder, sp: &GenericService) { | ||||
|     if data.iter().filter(|x| **x != 0.).next().is_some() { | ||||
|         match encoder.encode_vec_float(data, data.len() * 6) { | ||||
|             Ok(data) => { | ||||
|                 let mut msg_out = Message::new(); | ||||
|                 msg_out.set_audio_frame(AudioFrame { | ||||
|                     data, | ||||
|                     ..Default::default() | ||||
|                 }); | ||||
|                 sp.send(msg_out); | ||||
|             } | ||||
|             Err(_) => {} | ||||
|         unsafe { | ||||
|             AUDIO_ZERO_COUNT = 0; | ||||
|         } | ||||
|     } else { | ||||
|         unsafe { | ||||
|             if AUDIO_ZERO_COUNT > MAX_AUDIO_ZERO_COUNT { | ||||
|                 if AUDIO_ZERO_COUNT == MAX_AUDIO_ZERO_COUNT + 1 { | ||||
|                     log::debug!("Audio Zero Gate Attack"); | ||||
|                     AUDIO_ZERO_COUNT += 1; | ||||
|                 } | ||||
|                 return; | ||||
|             } | ||||
|             AUDIO_ZERO_COUNT += 1; | ||||
|         } | ||||
|     } | ||||
|     match encoder.encode_vec_float(data, data.len() * 6) { | ||||
|         Ok(data) => { | ||||
|             let mut msg_out = Message::new(); | ||||
|             msg_out.set_audio_frame(AudioFrame { | ||||
|                 data, | ||||
|                 ..Default::default() | ||||
|             }); | ||||
|             sp.send(msg_out); | ||||
|         } | ||||
|         Err(_) => {} | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										13
									
								
								src/ui/cm.rs
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/ui/cm.rs
									
									
									
									
									
								
							| @ -416,6 +416,7 @@ async fn start_pa() { | ||||
|                             }; | ||||
|                             log::info!("pa monitor: {:?}", device); | ||||
|                             // systemctl --user status pulseaudio.service
 | ||||
|                             let mut buf: Vec<u8> = vec![0; 480 * 4]; | ||||
|                             match psimple::Simple::new( | ||||
|                                 None,                             // Use the default server
 | ||||
|                                 APP_NAME,                         // Our application’s name
 | ||||
| @ -430,14 +431,10 @@ async fn start_pa() { | ||||
|                                     if let Some(Err(_)) = stream.next_timeout2(1).await { | ||||
|                                         break; | ||||
|                                     } | ||||
|                                     let mut out: Vec<u8> = Vec::with_capacity(480 * 4); | ||||
|                                     unsafe { | ||||
|                                         out.set_len(out.capacity()); | ||||
|                                     } | ||||
|                                     if let Ok(_) = s.read(&mut out) { | ||||
|                                         if out.iter().filter(|x| **x != 0).next().is_some() { | ||||
|                                             allow_err!(stream.send(&Data::RawMessage(out)).await); | ||||
|                                         } | ||||
|                                     if let Ok(_) = s.read(&mut buf) { | ||||
|                                         allow_err!( | ||||
|                                             stream.send(&Data::RawMessage(buf.clone())).await | ||||
|                                         ); | ||||
|                                     } | ||||
|                                 }, | ||||
|                                 Err(err) => { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user