feat: set audio only mode
This commit is contained in:
		
							parent
							
								
									3b34e2ea45
								
							
						
					
					
						commit
						9134c2826e
					
				@ -18,7 +18,7 @@ pub struct LatencyController {
 | 
			
		||||
    last_video_remote_ts: i64, // generated on remote device
 | 
			
		||||
    update_time: Instant,
 | 
			
		||||
    allow_audio: bool,
 | 
			
		||||
    enabled: bool
 | 
			
		||||
    audio_only: bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for LatencyController {
 | 
			
		||||
@ -27,7 +27,7 @@ impl Default for LatencyController {
 | 
			
		||||
            last_video_remote_ts: Default::default(),
 | 
			
		||||
            update_time: Instant::now(),
 | 
			
		||||
            allow_audio: Default::default(),
 | 
			
		||||
            enabled: true
 | 
			
		||||
            audio_only: true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -38,9 +38,9 @@ impl LatencyController {
 | 
			
		||||
        Arc::new(Mutex::new(LatencyController::default()))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Set whether this [LatencyController] should be enabled.
 | 
			
		||||
    pub fn set_enabled(&mut self, enable: bool) {
 | 
			
		||||
        self.enabled = enable;
 | 
			
		||||
    /// Set whether this [LatencyController] should be working in audio only mode.
 | 
			
		||||
    pub fn set_audio_only(&mut self, only: bool) {
 | 
			
		||||
        self.audio_only = only;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Update the latency controller with the latest video timestamp.
 | 
			
		||||
@ -51,10 +51,6 @@ impl LatencyController {
 | 
			
		||||
 | 
			
		||||
    /// Check if the audio should be played based on the current latency.
 | 
			
		||||
    pub fn check_audio(&mut self, timestamp: i64) -> bool {
 | 
			
		||||
        if !self.enabled {
 | 
			
		||||
            self.allow_audio = true;
 | 
			
		||||
            return self.allow_audio;
 | 
			
		||||
        }
 | 
			
		||||
        // Compute audio latency.
 | 
			
		||||
        let expected = self.update_time.elapsed().as_millis() as i64 + self.last_video_remote_ts;
 | 
			
		||||
        let latency = expected - timestamp;
 | 
			
		||||
@ -70,6 +66,11 @@ impl LatencyController {
 | 
			
		||||
                self.allow_audio = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // No video frame here, which means the update time is not triggered.
 | 
			
		||||
        // We manually update the time here.
 | 
			
		||||
        if self.audio_only {
 | 
			
		||||
            self.update_time = Instant::now();
 | 
			
		||||
        }
 | 
			
		||||
        self.allow_audio
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -172,7 +172,7 @@ impl Connection {
 | 
			
		||||
        // Start a audio thread to play the audio sent by peer.
 | 
			
		||||
        let latency_controller = LatencyController::new();
 | 
			
		||||
        // No video frame will be sent here, so we need to disable latency controller, or audio check may fail.
 | 
			
		||||
        latency_controller.lock().unwrap().set_enabled(false);
 | 
			
		||||
        latency_controller.lock().unwrap().set_audio_only(true);
 | 
			
		||||
        let audio_sender = start_audio_thread(Some(latency_controller));
 | 
			
		||||
        let mut conn = Self {
 | 
			
		||||
            inner: ConnInner {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user