Skip to content

Commit 43280d1

Browse files
Merge pull request #1470 from CapSoftware/recording-optimisations
feat: Recording pipeline optimisations and fail-safes
2 parents d7673fb + 3691a86 commit 43280d1

36 files changed

+1868
-248
lines changed

Cargo.lock

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ windows-core = "0.60"
7171
windows-sys = "0.59.0"
7272
windows-capture = "1.5.0"
7373
percent-encoding = "2.3.1"
74+
sysinfo = "0.32"
7475

7576
# TODO: Reenable these: https://github.com/CapSoftware/Cap/issues/859
7677
[workspace.lints.rust]
-30.6 KB
Loading
-31.7 KB
Loading
-29.5 KB
Loading
-21.9 KB
Loading
2.01 KB
Loading

apps/desktop/src-tauri/src/export.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ use cap_rendering::{
99
use image::codecs::jpeg::JpegEncoder;
1010
use serde::{Deserialize, Serialize};
1111
use specta::Type;
12-
use std::{path::PathBuf, sync::Arc};
12+
use std::{
13+
path::PathBuf,
14+
sync::{Arc, atomic::Ordering},
15+
};
1316
use tracing::{info, instrument};
1417

1518
#[derive(Deserialize, Clone, Copy, Debug, Type)]
@@ -368,15 +371,17 @@ pub async fn generate_export_preview_fast(
368371

369372
let render_start = Instant::now();
370373

374+
editor.export_preview_active.store(true, Ordering::Release);
371375
let segment_frames = segment_media
372376
.decoders
373377
.get_frames(
374378
segment_time as f32,
375379
!project_config.camera.hide,
376380
clip_config.map(|v| v.offsets).unwrap_or_default(),
377381
)
378-
.await
379-
.ok_or_else(|| "Failed to decode frame".to_string())?;
382+
.await;
383+
editor.export_preview_active.store(false, Ordering::Release);
384+
let segment_frames = segment_frames.ok_or_else(|| "Failed to decode frame".to_string())?;
380385

381386
let frame_number = (frame_time * settings.fps as f64).floor() as u32;
382387

apps/desktop/src-tauri/src/general_settings.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,10 @@ pub struct GeneralSettingsStore {
123123
pub instant_mode_max_resolution: u32,
124124
#[serde(default)]
125125
pub default_project_name_template: Option<String>,
126-
#[serde(default)]
126+
#[serde(default = "default_true")]
127127
pub crash_recovery_recording: bool,
128+
#[serde(default = "default_max_fps")]
129+
pub max_fps: u32,
128130
}
129131

130132
fn default_enable_native_camera_preview() -> bool {
@@ -148,6 +150,10 @@ fn default_instant_mode_max_resolution() -> u32 {
148150
1920
149151
}
150152

153+
fn default_max_fps() -> u32 {
154+
60
155+
}
156+
151157
fn default_server_url() -> String {
152158
std::option_env!("VITE_SERVER_URL")
153159
.unwrap_or("https://cap.so")
@@ -192,6 +198,7 @@ impl Default for GeneralSettingsStore {
192198
instant_mode_max_resolution: 1920,
193199
default_project_name_template: None,
194200
crash_recovery_recording: true,
201+
max_fps: 60,
195202
}
196203
}
197204
}

apps/desktop/src-tauri/src/hotkeys.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ pub enum HotkeyAction {
5454
StartInstantRecording,
5555
StopRecording,
5656
RestartRecording,
57+
TogglePauseRecording,
5758
CycleRecordingMode,
5859
OpenRecordingPicker,
5960
OpenRecordingPickerDisplay,
@@ -151,6 +152,7 @@ async fn handle_hotkey(app: AppHandle, action: HotkeyAction) -> Result<(), Strin
151152
HotkeyAction::RestartRecording => recording::restart_recording(app.clone(), app.state())
152153
.await
153154
.map(|_| ()),
155+
HotkeyAction::TogglePauseRecording => recording::toggle_pause_recording(app.state()).await,
154156
HotkeyAction::CycleRecordingMode => {
155157
let current = RecordingSettingsStore::get(&app)
156158
.ok()

0 commit comments

Comments
 (0)