Skip to content

Commit 6680478

Browse files
committed
[*] refactor
1 parent 115cf94 commit 6680478

File tree

6 files changed

+50
-10
lines changed

6 files changed

+50
-10
lines changed

lib/record-audio/src/lib.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ pub struct AudioRecorder {
120120
recorded_samples: Arc<Mutex<Vec<f32>>>,
121121
channels: u16,
122122
sample_rate: u32,
123+
gain_db: f32,
123124
}
124125

125126
impl Default for AudioRecorder {
@@ -138,6 +139,7 @@ impl AudioRecorder {
138139
recorded_samples: Arc::new(Mutex::new(Vec::new())),
139140
channels: 2,
140141
sample_rate: 48000,
142+
gain_db: 0.0,
141143
}
142144
}
143145

@@ -146,6 +148,11 @@ impl AudioRecorder {
146148
self
147149
}
148150

151+
pub fn with_gain(mut self, gain_db: f32) -> Self {
152+
self.gain_db = gain_db;
153+
self
154+
}
155+
149156
pub fn get_input_devices(&self) -> Result<Vec<AudioDeviceInfo>> {
150157
let devices = self
151158
.host
@@ -208,6 +215,12 @@ impl AudioRecorder {
208215
let level_sender = self.level_sender.clone();
209216
let channels = self.channels;
210217

218+
let linear_gain = if self.gain_db == 0.0 {
219+
1.0
220+
} else {
221+
10.0_f32.powf(self.gain_db / 20.0)
222+
};
223+
211224
// Buffer for level calculation
212225
let level_buffer: Arc<Mutex<Vec<f32>>> = Arc::new(Mutex::new(Vec::new()));
213226
let level_buffer_clone = level_buffer.clone();
@@ -216,14 +229,19 @@ impl AudioRecorder {
216229
.build_input_stream(
217230
&config,
218231
move |data: &[f32], _: &cpal::InputCallbackInfo| {
232+
let gain_samples: Vec<f32> = data
233+
.iter()
234+
.map(|s| (s * linear_gain).clamp(-1.0, 1.0))
235+
.collect();
236+
219237
if let Ok(mut s) = samples.lock() {
220-
s.extend_from_slice(data);
238+
s.extend_from_slice(&gain_samples);
221239
}
222240

223241
if let Some(sender) = &level_sender
224242
&& let Ok(mut buf) = level_buffer_clone.lock()
225243
{
226-
buf.extend_from_slice(data);
244+
buf.extend_from_slice(&gain_samples);
227245

228246
// Calculate and send level every ~100ms worth of samples
229247
let threshold = (config.sample_rate as usize / 10) * channels as usize;

wayshot/src/logic/video_editor/record_audio.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ fn video_editor_start_recording_audio(ui: &AppWindow) {
100100
let config = global_store!(ui).get_video_editor_record_audio_config();
101101
let save_dir = config.save_dir.to_string();
102102
let device = config.device.to_string();
103+
let gain = config.gain;
103104

104105
if save_dir.is_empty() {
105106
crate::toast_warn!(ui, tr("Please select a save directory first"));
@@ -120,7 +121,9 @@ fn video_editor_start_recording_audio(ui: &AppWindow) {
120121
};
121122

122123
let (sender, receiver) = channel::bounded::<(f32, f32)>(32);
123-
let recorder = AudioRecorder::new().with_level_sender(sender.clone());
124+
let recorder = AudioRecorder::new()
125+
.with_level_sender(sender.clone())
126+
.with_gain(gain);
124127

125128
{
126129
let mut state = RECORD_AUDIO_STATE.lock().unwrap();
@@ -251,10 +254,6 @@ fn video_editor_stop_recording_audio(ui: &AppWindow) {
251254
audio.convert_to_mono();
252255
}
253256

254-
if config.gain != 0.0 {
255-
audio.apply_gain(config.gain);
256-
}
257-
258257
let timestamp = chrono::Local::now().format("%Y%m%d_%H%M%S");
259258
let filename = format!("recording_{}.wav", timestamp);
260259
let save_path = PathBuf::from(&save_dir).join(&filename);

wayshot/ui/base/label.slint

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { Theme } from "theme.slint";
22

33
export component Label inherits Text {
4+
in-out property <bool> enabled: true;
5+
46
vertical-alignment: center;
5-
color: Theme.primary-text-color;
7+
color: enabled ? Theme.primary-text-color : Theme.disabled-color;
68
font-size: Theme.default-font-size;
79
font-family: Theme.default-font-family;
810
}

wayshot/ui/base/select.slint

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export component Select inherits Rectangle {
3535
height: hbox.preferred-height;
3636
background: Theme.secondary-background;
3737
border-radius: Theme.border-radius;
38-
border-width: fs.has-focus ? 2px : 0;
38+
border-width: fs.has-focus && root.enabled ? 2px : 0;
3939
border-color: Theme.focus-color;
4040

4141
callback selected(current-index: int, current-value: string);
@@ -53,6 +53,7 @@ export component Select inherits Rectangle {
5353
spacing: Theme.spacing * 2;
5454

5555
lb := Label {
56+
enabled: root.enabled;
5657
text: root.current-value;
5758
font-size: root.font-size;
5859
overflow: elide;
@@ -66,9 +67,12 @@ export component Select inherits Rectangle {
6667
}
6768
}
6869

69-
fs := FocusScope { }
70+
fs := FocusScope {
71+
enabled: root.enabled;
72+
}
7073

7174
ta := TouchArea {
75+
enabled: root.enabled;
7276
mouse-cursor: MouseCursor.pointer;
7377
clicked => {
7478
is-indicator-down = false;

wayshot/ui/panel/desktop/video-editor/preview/preview.slint

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,15 @@ component PreviewWindow inherits Rectangle {
193193
background: Theme.thirdly-background;
194194

195195
private property <bool> show-volume-indicator;
196+
private property <bool> no-show-volume-indeicator: true;
196197
private property <float> width-height-rate: self.width / self.height;
197198
private property preview-volume <=> Store.video-editor-ui-state.preview-volume;
198199

199200
changed preview-volume => {
201+
if (no-show-volume-indeicator) {
202+
no-show-volume-indeicator = false;
203+
return;
204+
}
200205
root.show-volume-indicator = true;
201206
}
202207

wayshot/ui/panel/desktop/video-editor/record-audio-dialog.slint

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,15 @@ export component RecordAudioDialog inherits MovingDialog {
4343
text: cache-config.save-dir;
4444
vpadding: Theme.padding;
4545
placeholder-text: Logic.tr("Please select a save directory");
46+
enabled: !Store.video-editor-is-recording-audio;
4647

4748
clicked => {
4849
Logic.video-editor-record-audio-select-dir();
4950
}
5051
}
5152

5253
Select {
54+
enabled: !Store.video-editor-is-recording-audio;
5355
vpadding: Theme.padding;
5456
values: Store.video-editor-audio-devices;
5557
current-value: cache-config.device.is-empty ? Logic.tr("Please select a input device") : cache-config.device;
@@ -69,12 +71,14 @@ export component RecordAudioDialog inherits MovingDialog {
6971
Label {
7072
text: Logic.tr("Gain (dB):");
7173
vertical-alignment: center;
74+
enabled: !Store.video-editor-is-recording-audio;
7275
}
7376

7477
LineInput {
7578
input-type: InputType.decimal;
7679
text: cache-config.gain.to-fixed(2);
7780
vpadding: Theme.padding / 2;
81+
enabled: !Store.video-editor-is-recording-audio;
7882

7983
accepted => {
8084
cache-config.gain = self.text.to-float();
@@ -86,6 +90,7 @@ export component RecordAudioDialog inherits MovingDialog {
8690
CheckBtn {
8791
text: Logic.tr("Mono");
8892
checked: cache-config.mono;
93+
enabled: !Store.video-editor-is-recording-audio;
8994

9095
toggled => {
9196
cache-config.mono = self.checked;
@@ -102,11 +107,14 @@ export component RecordAudioDialog inherits MovingDialog {
102107

103108
HorizontalLayout {
104109
spacing: Theme.spacing;
110+
alignment: start;
105111

106112
Label {
107113
text: "L";
114+
width: Theme.default-font-size;
108115
vertical-alignment: center;
109116
font-size: Theme.default-font-size * 0.8;
117+
enabled: !Store.video-editor-is-recording-audio;
110118
}
111119

112120
AudioLevel {
@@ -116,10 +124,14 @@ export component RecordAudioDialog inherits MovingDialog {
116124

117125
HorizontalLayout {
118126
spacing: Theme.spacing;
127+
alignment: start;
128+
119129
Label {
120130
text: "R";
131+
width: Theme.default-font-size;
121132
vertical-alignment: center;
122133
font-size: Theme.default-font-size * 0.8;
134+
enabled: !Store.video-editor-is-recording-audio;
123135
}
124136

125137
AudioLevel {

0 commit comments

Comments
 (0)