Skip to content

Commit d2d4747

Browse files
committed
[*] update normally
1 parent ca22a4f commit d2d4747

File tree

5 files changed

+56
-16
lines changed

5 files changed

+56
-16
lines changed

lib/recorder/examples/recording_5s_demo.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
6262
while let Ok(frame) = rx.recv() {
6363
log::debug!(
6464
"frame_receiver_user frame len: {} bytes",
65-
frame.cb_data.data.pixel_data.len()
65+
frame.frame.cb_data.data.pixel_data.len()
6666
);
6767
}
6868
log::debug!("exit frame_receiver_user");

lib/recorder/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,18 @@ pub struct Frame {
173173
pub timestamp: Instant,
174174
}
175175

176+
#[derive(Debug, Clone)]
177+
pub struct StatsUser {
178+
pub total_frames: u64,
179+
pub loss_frames: u64,
180+
}
181+
182+
#[derive(Debug, Clone)]
183+
pub struct FrameUser {
184+
pub stats: StatsUser,
185+
pub frame: Frame,
186+
}
187+
176188
/// Configuration for combining video and audio tracks into a final MP4 file.
177189
///
178190
/// This structure is used by both the built-in and FFmpeg track combiners

lib/recorder/src/recorder.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{
2-
AudioError, AudioRecorder, CombineTracksConfig, EncodedFrame, Frame, H264Writer,
2+
AudioError, AudioRecorder, CombineTracksConfig, EncodedFrame, Frame, FrameUser, H264Writer,
33
MAX_H264_WRITER_QUEUE_SIZE, ProgressState, RecorderConfig, RecorderError, Resolution,
4-
SpeakerRecorder, StreamingAudioRecorder, VideoEncoder, combine_tracks,
4+
SpeakerRecorder, StatsUser, StreamingAudioRecorder, VideoEncoder, combine_tracks,
55
};
66
use capture::{Capture, CaptureIterConfig, capture_output_iter};
77
use crossbeam::channel::{Receiver, Sender, bounded};
@@ -90,8 +90,8 @@ pub struct RecordingSession {
9090
frame_receiver: Receiver<Frame>,
9191
capture_workers: Vec<JoinHandle<()>>,
9292

93-
frame_sender_user: Option<Sender<Frame>>,
94-
frame_receiver_user: Option<Arc<Receiver<Frame>>>,
93+
frame_sender_user: Option<Sender<FrameUser>>,
94+
frame_receiver_user: Option<Arc<Receiver<FrameUser>>>,
9595

9696
stop_sig: Arc<AtomicBool>,
9797
stop_sig_combine: Arc<AtomicBool>,
@@ -356,10 +356,17 @@ impl RecordingSession {
356356
self.total_frame_count += 1;
357357
let index = frame.thread_id as usize;
358358

359-
if let Some(ref sender) = self.frame_sender_user
360-
&& let Err(e) = sender.try_send(frame.clone())
361-
{
362-
log::warn!("try send frame failed: {e}");
359+
if let Some(ref sender) = self.frame_sender_user {
360+
let frame_user = FrameUser {
361+
stats: StatsUser {
362+
total_frames: self.total_frame_count,
363+
loss_frames: self.loss_frame_count.load(Ordering::Relaxed),
364+
},
365+
frame: frame.clone(),
366+
};
367+
if let Err(e) = sender.try_send(frame_user) {
368+
log::warn!("try send frame failed: {e}");
369+
}
363370
}
364371

365372
if let Err(e) = resize_sender.try_send((self.total_frame_count, frame)) {
@@ -1083,7 +1090,7 @@ impl RecordingSession {
10831090
/// }
10841091
/// }
10851092
/// ```
1086-
pub fn get_frame_receiver_user(&self) -> Option<Arc<Receiver<Frame>>> {
1093+
pub fn get_frame_receiver_user(&self) -> Option<Arc<Receiver<FrameUser>>> {
10871094
self.frame_receiver_user.clone()
10881095
}
10891096

wayshot/src/logic/recorder.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ use recorder::{
1717
AudioRecorder, FPS, RecorderConfig, RecordingSession, Resolution, SpeakerRecorder,
1818
StreamingAudioRecorder, bounded,
1919
};
20-
use slint::{ComponentHandle, Model, SharedString, ToSharedString, VecModel, Weak};
20+
use slint::{
21+
ComponentHandle, Model, SharedPixelBuffer, SharedString, ToSharedString, VecModel, Weak,
22+
};
2123
use std::{
2224
path::PathBuf,
2325
sync::{
@@ -442,13 +444,32 @@ fn inner_start_recording(ui_weak: Weak<AppWindow>) -> Result<()> {
442444
}
443445

444446
let frame_receiver_user = session.get_frame_receiver_user();
447+
let ui_weak_clone = ui_weak.clone();
445448
thread::spawn(move || {
446449
if let Some(rx) = frame_receiver_user {
447450
while let Ok(frame) = rx.recv() {
448451
log::debug!(
449452
"frame_receiver_user frame len: {} bytes",
450-
frame.cb_data.data.pixel_data.len()
453+
frame.frame.cb_data.data.pixel_data.len()
451454
);
455+
456+
_ = ui_weak_clone.upgrade_in_event_loop(move |ui| {
457+
let buffer = SharedPixelBuffer::<slint::Rgba8Pixel>::clone_from_slice(
458+
&frame.frame.cb_data.data.pixel_data,
459+
frame.frame.cb_data.data.width,
460+
frame.frame.cb_data.data.height,
461+
);
462+
let img = slint::Image::from_rgba8(buffer);
463+
global_store!(ui).set_preview_image(img);
464+
465+
// TODO: fps
466+
let mut sinfo = global_store!(ui).get_stats_info();
467+
sinfo.total = frame.stats.total_frames as i32;
468+
sinfo.loss = (frame.stats.loss_frames as f64 * 100.0
469+
/ frame.stats.total_frames.max(1) as f64)
470+
as f32;
471+
global_store!(ui).set_stats_info(sinfo);
472+
});
452473
}
453474
log::info!("exit frame_receiver_user");
454475
} else {

wayshot/ui/panel/desktop/home.slint

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ component PreviewPanel inherits Rectangle {
4242
height: stats-vbox.preferred-height;
4343
background: black;
4444
border-radius: Theme.border-radius;
45-
opacity: 0.5;
45+
opacity: 0.8;
4646

4747
stats-vbox := VerticalLayout {
4848
spacing: Theme.spacing * 2;
@@ -332,7 +332,7 @@ component ControlPanel inherits HorizontalLayout {
332332
}
333333

334334
ElevatedBtn {
335-
background: Theme.danger-color;
335+
background: self.has-hover ? Theme.danger-color.darker(30%) : Theme.danger-color;
336336
icon: Icons.stop-light;
337337
colorize: Theme.light-text-color;
338338

@@ -343,8 +343,8 @@ component ControlPanel inherits HorizontalLayout {
343343
}
344344

345345
if Store.record-status == RecordStatus.Stopped: ElevatedBtn {
346+
background: self.has-hover ? Theme.thirdly-brand-color.darker(30%) : Theme.thirdly-brand-color;
346347
icon: Icons.control-start-light;
347-
background: Theme.thirdly-brand-color;
348348
colorize: Theme.light-text-color;
349349

350350
clicked => {
@@ -378,7 +378,7 @@ component ControlPanel inherits HorizontalLayout {
378378
padding: Theme.padding * 4;
379379

380380
ElevatedBtn {
381-
background: Theme.warning-color;
381+
background: self.has-hover ? Theme.warning-color.darker(30%) : Theme.warning-color;
382382
icon: Icons.stop-light;
383383
colorize: Theme.light-text-color;
384384

0 commit comments

Comments
 (0)