Skip to content

Commit 661497a

Browse files
committed
[*] update normally
1 parent b89bd9f commit 661497a

File tree

8 files changed

+71
-104
lines changed

8 files changed

+71
-104
lines changed

lib/recorder/examples/recording_10m_demo.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
3939
// screen_infos[0].logical_size.height as u32,
4040
// )));
4141

42-
config.validate()?;
43-
4442
log::debug!("Recording configuration: {:#?}", config);
4543

4644
let mut session = RecordingSession::new(config);

lib/recorder/examples/recording_1s_demo.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
2727
)))
2828
.with_fps(FPS::Fps30);
2929

30-
config.validate()?;
31-
3230
log::debug!("Recording configuration: {:#?}", config);
3331

3432
let mut session = RecordingSession::new(config);

lib/recorder/examples/recording_5s_demo.rs

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
3131
screen_infos[0].logical_size.clone(),
3232
RecorderConfig::make_filename("target"),
3333
)
34-
// .with_enable_frame_channel_user(true)
35-
// .with_enable_audio_channel_user(true)
36-
// .with_enable_speaker_channel_user(true)
34+
.with_enable_frame_channel_user(true)
35+
.with_enable_audio_channel_user(true)
36+
.with_enable_speaker_channel_user(true)
3737
// .with_enable_preview_mode(true)
38-
// .with_audio_device_name(Some(default_input.name))
39-
// .with_enable_recording_speaker(true)
40-
// .with_resolution(recorder::Resolution::Original((
41-
// screen_infos[0].logical_size.width as u32,
42-
// screen_infos[0].logical_size.height as u32,
43-
// )))
38+
.with_audio_device_name(Some(default_input.name))
39+
.with_enable_recording_speaker(true)
40+
.with_resolution(recorder::Resolution::Original((
41+
screen_infos[0].logical_size.width as u32,
42+
screen_infos[0].logical_size.height as u32,
43+
)))
4444
.with_fps(FPS::Fps30);
4545

46-
config.validate()?;
4746
log::debug!("Recording configuration: {:#?}", config);
4847

4948
let mut session = RecordingSession::new(config);
@@ -56,44 +55,44 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
5655
stop_sig.store(true, Ordering::Relaxed);
5756
});
5857

59-
// let frame_receiver_user = session.get_frame_receiver_user();
60-
// thread::spawn(move || {
61-
// if let Some(rx) = frame_receiver_user {
62-
// while let Ok(frame) = rx.recv() {
63-
// log::debug!(
64-
// "frame_receiver_user frame len: {} bytes",
65-
// frame.frame.cb_data.data.pixel_data.len()
66-
// );
67-
// }
68-
// log::debug!("exit frame_receiver_user");
69-
// } else {
70-
// log::debug!("frame_receiver_user is none");
71-
// }
72-
// });
73-
74-
// let audio_level_receiver_user = session.get_audio_level_receiver_user();
75-
// thread::spawn(move || {
76-
// if let Some(rx) = audio_level_receiver_user {
77-
// while let Ok(db) = rx.recv() {
78-
// log::debug!("audio_level_receiver_user db level: {db:.0}",);
79-
// }
80-
// log::debug!("exit audio_level_receiver_user");
81-
// } else {
82-
// log::debug!("audio_level_receiver_user is none");
83-
// }
84-
// });
85-
//
86-
// let speaker_level_receiver_user = session.get_speaker_level_receiver_user();
87-
// thread::spawn(move || {
88-
// if let Some(rx) = speaker_level_receiver_user {
89-
// while let Ok(db) = rx.recv() {
90-
// log::debug!("speaker_level_receiver_user db level: {db:.0}",);
91-
// }
92-
// log::debug!("exit speaker_level_receiver_user");
93-
// } else {
94-
// log::debug!("speaker_level_receiver_user is none");
95-
// }
96-
// });
58+
let frame_receiver_user = session.get_frame_receiver_user();
59+
thread::spawn(move || {
60+
if let Some(rx) = frame_receiver_user {
61+
while let Ok(frame) = rx.recv() {
62+
log::debug!(
63+
"frame_receiver_user frame len: {} bytes",
64+
frame.frame.cb_data.data.pixel_data.len()
65+
);
66+
}
67+
log::debug!("exit frame_receiver_user");
68+
} else {
69+
log::debug!("frame_receiver_user is none");
70+
}
71+
});
72+
73+
let audio_level_receiver_user = session.get_audio_level_receiver_user();
74+
thread::spawn(move || {
75+
if let Some(rx) = audio_level_receiver_user {
76+
while let Ok(db) = rx.recv() {
77+
log::debug!("audio_level_receiver_user db level: {db:.0}",);
78+
}
79+
log::debug!("exit audio_level_receiver_user");
80+
} else {
81+
log::debug!("audio_level_receiver_user is none");
82+
}
83+
});
84+
85+
let speaker_level_receiver_user = session.get_speaker_level_receiver_user();
86+
thread::spawn(move || {
87+
if let Some(rx) = speaker_level_receiver_user {
88+
while let Ok(db) = rx.recv() {
89+
log::debug!("speaker_level_receiver_user db level: {db:.0}",);
90+
}
91+
log::debug!("exit speaker_level_receiver_user");
92+
} else {
93+
log::debug!("speaker_level_receiver_user is none");
94+
}
95+
});
9796

9897
session.wait(move |v| {
9998
let v = (v * 100.0) as u32;

lib/recorder/examples/recording_demo.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
1818
)
1919
.with_fps(FPS::Fps30);
2020

21-
config.validate()?;
22-
2321
log::debug!("Recording configuration: {:#?}", config);
2422

2523
let mut session = RecordingSession::new(config);

lib/recorder/src/h264_writer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use std::{
2222
///
2323
/// let writer = H264Writer::new("output.h264".into(), MAX_H264_WRITER_QUEUE_SIZE);
2424
/// ```
25-
pub const MAX_H264_WRITER_QUEUE_SIZE: usize = 4096;
25+
pub const MAX_H264_WRITER_QUEUE_SIZE: usize = 512;
2626

2727
/// H.264 file writer that handles frame queuing and file output.
2828
///

lib/recorder/src/recorder.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ const INPUT_AUDIO_EXTENSION: &str = "input.wav";
3030
const SPEAKER_AUDIO_EXTENSION: &str = "speaker.wav";
3131
const TMP_OUTPUT_VIDEO_EXTENSION: &str = "tmp.mp4";
3232

33+
const USER_CHANNEL_SIZE: usize = 3;
34+
const RESIZE_WORKER_CHANNEL_SIZE: usize = 16;
35+
const ENCODER_WORKER_CHANNEL_SIZE: usize = 32;
36+
3337
static CAPTURE_MEAN_TIME: Lazy<Mutex<Option<Duration>>> = Lazy::new(|| Mutex::new(None));
3438

3539
/// Main recording session that manages the entire screen recording pipeline.
@@ -167,10 +171,10 @@ impl RecordingSession {
167171
/// let session = RecordingSession::new(config);
168172
/// ```
169173
pub fn new(config: RecorderConfig) -> Self {
170-
let (frame_sender, frame_receiver) = bounded(config.max_queue_size);
174+
let (frame_sender, frame_receiver) = bounded(ENCODER_WORKER_CHANNEL_SIZE);
171175

172176
let (frame_sender_user, frame_receiver_user) = if config.enable_frame_channel_user {
173-
let (tx, rx) = bounded(config.max_queue_size);
177+
let (tx, rx) = bounded(USER_CHANNEL_SIZE);
174178
(Some(tx), Some(Arc::new(rx)))
175179
} else {
176180
(None, None)
@@ -320,7 +324,7 @@ impl RecordingSession {
320324
self,
321325
combine_progress_cb: impl FnMut(f32),
322326
) -> Result<ProgressState, RecorderError> {
323-
let (encoder_sender, encoder_receiver) = bounded(self.config.max_queue_size * 2);
327+
let (encoder_sender, encoder_receiver) = bounded(ENCODER_WORKER_CHANNEL_SIZE);
324328

325329
let resize_handles = Self::resize_workers(
326330
self.frame_receiver.clone(),
@@ -405,7 +409,7 @@ impl RecordingSession {
405409
/// Enable audio recording with specified device
406410
fn enable_audio(&mut self, device_name: &str) -> Result<(), RecorderError> {
407411
let audio_recorder = AudioRecorder::new(if self.config.enable_audio_channel_user {
408-
Some(1024)
412+
Some(USER_CHANNEL_SIZE)
409413
} else {
410414
None
411415
})
@@ -443,7 +447,7 @@ impl RecordingSession {
443447
.with_extension(SPEAKER_AUDIO_EXTENSION);
444448

445449
let (sender, receiver) = if self.config.enable_speaker_channel_user {
446-
let (tx, rx) = bounded(1024);
450+
let (tx, rx) = bounded(USER_CHANNEL_SIZE);
447451
(Some(Arc::new(tx)), Some(Arc::new(rx)))
448452
} else {
449453
(None, None)
@@ -485,13 +489,11 @@ impl RecordingSession {
485489
enable_previwe_model: bool,
486490
) -> Vec<JoinHandle<()>> {
487491
let mut thread_handles = vec![];
488-
let channel_size = capture_receiver.capacity().unwrap_or(256);
489-
let (collect_sender, collect_receiver) = bounded(channel_size);
492+
let (collect_sender, collect_receiver) = bounded(ENCODER_WORKER_CHANNEL_SIZE);
490493

491494
let (handles, resize_senders) = Self::resize_workers_main(
492495
collect_sender.clone(),
493496
thread_counts,
494-
channel_size,
495497
resolution,
496498
loss_frame_count.clone(),
497499
);
@@ -520,7 +522,6 @@ impl RecordingSession {
520522
fn resize_workers_main(
521523
collect_sender: Sender<(usize, u64, ResizedImageBuffer)>,
522524
thread_counts: usize,
523-
channel_size: usize,
524525
resolution: Resolution,
525526
loss_frame_count: Arc<AtomicU64>,
526527
) -> (Vec<JoinHandle<()>>, Vec<Sender<ResizeChannelData>>) {
@@ -531,7 +532,7 @@ impl RecordingSession {
531532
let loss_frame_count_clone = loss_frame_count.clone();
532533
let collect_sender_clone = collect_sender.clone();
533534

534-
let (resize_sender, resize_receiver) = bounded(channel_size);
535+
let (resize_sender, resize_receiver) = bounded(RESIZE_WORKER_CHANNEL_SIZE);
535536
resize_senders.push(resize_sender);
536537

537538
let handle = thread::spawn(move || {

lib/recorder/src/recorder_config.rs

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{recorder_error::RecorderError, resolution::Resolution};
1+
use crate::resolution::Resolution;
22
use capture::LogicalSize;
33
use chrono::Local;
44
use derive_setters::Setters;
@@ -120,8 +120,6 @@ pub struct RecorderConfig {
120120
pub include_cursor: bool,
121121
/// Whether to remove temporary cache files after recording
122122
pub remove_cache_files: bool,
123-
/// Maximum queue size for frame processing (prevents memory overflow)
124-
pub max_queue_size: usize,
125123
/// Audio device name for input recording (None for default device)
126124
pub audio_device_name: Option<String>,
127125
/// Enable recording of speaker output (system audio)
@@ -186,7 +184,6 @@ impl RecorderConfig {
186184
resolution: Resolution::P1080,
187185
include_cursor: true,
188186
remove_cache_files: false,
189-
max_queue_size: 256,
190187
audio_device_name: None,
191188
enable_recording_speaker: false,
192189
enable_frame_channel_user: false,
@@ -222,36 +219,6 @@ impl RecorderConfig {
222219
(1000.0 / self.fps.to_u32() as f64) as u64
223220
}
224221

225-
/// Validate configuration parameters for correctness.
226-
///
227-
/// This method checks that all configuration values are within acceptable ranges
228-
/// and that the configuration is valid for recording.
229-
///
230-
/// # Returns
231-
///
232-
/// `Ok(())` if the configuration is valid, or `Err(RecorderError)` if invalid.
233-
///
234-
/// # Examples
235-
///
236-
/// ```
237-
/// use recorder::RecorderConfig;
238-
///
239-
/// let config = RecorderConfig::new("output".to_string(), Default::default(), "output.mp4".into());
240-
/// assert!(config.validate().is_ok());
241-
///
242-
/// let invalid_config = config.with_max_queue_size(0);
243-
/// assert!(invalid_config.validate().is_err());
244-
/// ```
245-
pub fn validate(&self) -> Result<(), RecorderError> {
246-
if self.max_queue_size == 0 {
247-
return Err(RecorderError::InvalidConfig(
248-
"Maximum queue size must be greater than 0".to_string(),
249-
));
250-
}
251-
252-
Ok(())
253-
}
254-
255222
/// Generate a filename with timestamp for automatic file naming.
256223
///
257224
/// The generated filename uses the format: `YYYY-MM-DD_HH:MM:SS.mp4`

wayshot/src/logic/recorder.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use crate::{
1515
use anyhow::{Result, bail};
1616
use once_cell::sync::Lazy;
1717
use recorder::{
18-
AudioRecorder, FPS, RecorderConfig, RecordingSession, Resolution, SpeakerRecorder,
19-
StreamingAudioRecorder, bounded,
18+
AudioRecorder, FPS, ProgressState, RecorderConfig, RecordingSession, Resolution,
19+
SpeakerRecorder, StreamingAudioRecorder, bounded,
2020
};
2121
use slint::{
2222
ComponentHandle, Model, SharedPixelBuffer, SharedString, ToSharedString, VecModel, Weak,
@@ -509,7 +509,6 @@ fn inner_start_recording(ui_weak: Weak<AppWindow>) -> Result<()> {
509509
.with_fps(all_config.recorder.fps.clone().into())
510510
.with_resolution(resolution);
511511

512-
config.validate()?;
513512
log::info!("Recording configuration: {:#?}", config);
514513

515514
let mut session = RecordingSession::new(config);
@@ -562,7 +561,7 @@ fn inner_start_recording(ui_weak: Weak<AppWindow>) -> Result<()> {
562561
});
563562

564563
let ui_weak_clone = ui_weak.clone();
565-
session.wait(move |v| {
564+
let state = session.wait(move |v| {
566565
log::debug!("combine tracks progress: {}%", (v * 100.0) as u32);
567566
_ = ui_weak_clone.upgrade_in_event_loop(move |ui| {
568567
global_store!(ui).set_record_status(UIRecordStatus::Mergeing);
@@ -572,7 +571,14 @@ fn inner_start_recording(ui_weak: Weak<AppWindow>) -> Result<()> {
572571

573572
_ = ui_weak.upgrade_in_event_loop(move |ui| {
574573
global_store!(ui).set_record_status(UIRecordStatus::Stopped);
575-
global_store!(ui).set_merge_tracks_status(UIMergeTrackStatus::Finished);
574+
match state {
575+
ProgressState::Finished => {
576+
global_store!(ui).set_merge_tracks_status(UIMergeTrackStatus::Finished);
577+
}
578+
ProgressState::Stopped => {
579+
global_store!(ui).set_merge_tracks_status(UIMergeTrackStatus::None);
580+
}
581+
}
576582
});
577583

578584
log::info!("Recording completed successfully!");

0 commit comments

Comments
 (0)