Skip to content

Commit 2c18318

Browse files
committed
[*] update normally
1 parent 603297f commit 2c18318

File tree

8 files changed

+82
-35
lines changed

8 files changed

+82
-35
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use recorder::apply_gain;
2+
3+
fn main() {
4+
// Example audio data (-6dBFS sine wave)
5+
let mut audio_data = vec![0.5, -0.5, 0.3, -0.3, 0.1, -0.1];
6+
7+
println!("Original data: {:?}", audio_data);
8+
9+
// Apply +0dB gain
10+
apply_gain(&mut audio_data, 0.0);
11+
println!("After +0dB gain: {:?}", audio_data);
12+
13+
// Apply +6dB gain (amplify by 2x)
14+
apply_gain(&mut audio_data, 6.0);
15+
println!("After +6dB gain: {:?}", audio_data);
16+
17+
// Apply -12dB gain (attenuate to approximately 0.25x)
18+
apply_gain(&mut audio_data, -12.0);
19+
println!("After -12dB gain: {:?}", audio_data);
20+
21+
// Apply -120dB gain (essentially mute)
22+
apply_gain(&mut audio_data, -120.0);
23+
println!("After -120dB gain: {:?}", audio_data);
24+
}

lib/recorder/src/audio_level.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,20 @@ pub fn db_to_normalized(db: f32, min_db: f32, max_db: f32) -> f32 {
157157
let clamped = db.clamp(min_db, max_db);
158158
(clamped - min_db) / (max_db - min_db)
159159
}
160+
161+
/// Convert decibels to linear gain coefficient
162+
/// Supports both positive gain (amplification) and negative gain (attenuation)
163+
fn db_to_linear(db: f32) -> f32 {
164+
if db <= -120.0 {
165+
return 0.0; // Consider as mute below -120dB
166+
}
167+
10.0f32.powf(db / 20.0)
168+
}
169+
170+
pub fn apply_gain(audio_data: &mut [f32], db_gain: f32) {
171+
let gain = db_to_linear(db_gain);
172+
173+
for sample in audio_data.iter_mut() {
174+
*sample *= gain;
175+
}
176+
}

lib/recorder/src/record_audio.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::calc_rms_level;
1+
use crate::{apply_gain, calc_rms_level};
22
use cpal::{
33
Device, Host, InputCallbackInfo, SampleFormat, Stream, StreamConfig,
44
traits::{DeviceTrait, HostTrait, StreamTrait},
@@ -413,12 +413,14 @@ impl StreamingAudioRecorder {
413413
let recording_session = recorder.start_input_recording(
414414
device_name,
415415
move |f32_samples: &[f32], _info: &_| {
416-
let mut f32_sample_amplification = vec![0.0; f32_samples.len()];
416+
let mut f32_sample_amplification = Vec::with_capacity(f32_samples.len());
417417
let data = if let Some(ref amplification) = amplification {
418-
for (index, v) in f32_samples.iter().enumerate() {
419-
f32_sample_amplification[index] =
420-
v * (amplification.load(Ordering::Relaxed) as f32 / 100.0);
421-
}
418+
f32_sample_amplification.extend_from_slice(f32_samples);
419+
420+
apply_gain(
421+
&mut f32_sample_amplification,
422+
amplification.load(Ordering::Relaxed) as f32,
423+
);
422424

423425
&f32_sample_amplification[..]
424426
} else {

lib/recorder/src/record_speaker.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::audio_level::calc_rms_level;
1+
use crate::audio_level::{apply_gain, calc_rms_level};
22
use crossbeam::channel::Sender;
33
use pipewire::{
44
context::ContextRc,
@@ -412,12 +412,14 @@ impl SpeakerRecorder {
412412
)
413413
};
414414

415-
let mut f32_sample_amplification = vec![0.0; f32_samples.len()];
415+
let mut f32_sample_amplification = Vec::with_capacity(f32_samples.len());
416416
let f32_samples = if let Some(ref amplification) = amplification {
417-
for (index, v) in f32_samples.iter().enumerate() {
418-
f32_sample_amplification[index] =
419-
v * (amplification.load(Ordering::Relaxed) as f32 / 100.0);
420-
}
417+
f32_sample_amplification.extend_from_slice(f32_samples);
418+
419+
apply_gain(
420+
&mut f32_sample_amplification,
421+
amplification.load(Ordering::Relaxed) as f32,
422+
);
421423

422424
&f32_sample_amplification[..]
423425
} else {

wayshot/src/config.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,16 @@ pub struct Control {
147147
pub screen: String,
148148
pub input_audio: String,
149149

150-
#[derivative(Default(value = "100.0"))]
151-
pub input_audio_sound: f32,
150+
// db
151+
#[derivative(Default(value = "0.0"))]
152+
pub input_audio_gain: f32,
152153

153154
#[derivative(Default(value = "true"))]
154155
pub enable_input_audio: bool,
155156

156-
#[derivative(Default(value = "100.0"))]
157-
pub desktop_speaker_sound: f32,
157+
// db
158+
#[derivative(Default(value = "0.0"))]
159+
pub desktop_speaker_gain: f32,
158160

159161
#[derivative(Default(value = "true"))]
160162
pub enable_desktop_speaker: bool,

wayshot/src/logic/recorder.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ fn init_input_audio(ui: &AppWindow) -> Result<()> {
153153

154154
let mut control_setting = global_store!(ui).get_setting_control();
155155
control_setting.input_audio = default_input.name.into();
156-
control_setting.input_audio_sound = 100.0;
156+
control_setting.input_audio_gain = 0.0;
157157
control_setting.enable_input_audio = true;
158158
global_store!(ui).set_setting_control(control_setting.clone());
159159
global_logic!(ui).invoke_set_setting_control(control_setting);
@@ -210,7 +210,7 @@ fn init_desktop_speaker(ui: &AppWindow) -> Result<()> {
210210

211211
Ok(recorder) => {
212212
let amplification = Arc::new(AtomicI32::new(
213-
config::all().control.desktop_speaker_sound.max(0.0) as i32,
213+
config::all().control.desktop_speaker_gain as i32,
214214
));
215215
let recorder = recorder.with_amplification(amplification.clone());
216216

@@ -415,7 +415,7 @@ fn inner_input_audio_changed(ui: &AppWindow, name: SharedString) -> Result<()> {
415415
}
416416

417417
let amplification = Arc::new(AtomicI32::new(
418-
config::all().control.input_audio_sound.max(0.0) as i32,
418+
config::all().control.input_audio_gain as i32,
419419
));
420420

421421
let recorder = AudioRecorder::new(Some(1024))?.with_amplification(amplification.clone());
@@ -525,10 +525,10 @@ fn inner_start_recording(ui_weak: Weak<AppWindow>) -> Result<()> {
525525
.with_remove_cache_files(all_config.recorder.remove_temporary_files)
526526
.with_audio_device_name(input_audio_name)
527527
.with_audio_amplification(Arc::new(AtomicI32::new(
528-
all_config.control.input_audio_sound as i32,
528+
all_config.control.input_audio_gain as i32,
529529
)))
530530
.with_speaker_amplification(Arc::new(AtomicI32::new(
531-
all_config.control.desktop_speaker_sound as i32,
531+
all_config.control.desktop_speaker_gain as i32,
532532
)))
533533
.with_fps(all_config.recorder.fps.clone().into())
534534
.with_resolution(resolution);

wayshot/ui/panel/desktop/home.slint

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -211,16 +211,16 @@ component ControlPanel inherits HorizontalLayout {
211211
alignment: center;
212212

213213
input-audio-slider := Slider {
214-
value: Store.setting-control.input-audio-sound;
215-
minimum: 0;
216-
maximum: 300;
214+
value: Store.setting-control.input-audio-gain;
215+
minimum: -20;
216+
maximum: 20;
217217
indicator-size: self.has-hover ? Theme.icon-size * 2 / 3 : 0;
218218
height: Theme.icon-size / 3;
219219
width: root.slider-width;
220220
enabled: Store.setting-control.enable-input-audio && Store.record-status == RecordStatus.Stopped;
221221

222222
changed(value) => {
223-
Store.setting-control.input-audio-sound = self.value;
223+
Store.setting-control.input-audio-gain = self.value;
224224
Logic.set-setting-control(Store.setting-control);
225225
Logic.input-audio-amplification-changed(self.value);
226226
}
@@ -231,7 +231,7 @@ component ControlPanel inherits HorizontalLayout {
231231
alignment: center;
232232

233233
Label {
234-
text: input-audio-slider.value.to-fixed(0) + "%";
234+
text: input-audio-slider.value.to-fixed(0) + "db";
235235
color: input-audio-slider.enabled ? Theme.primary-text-color : Theme.disabled-color;
236236
}
237237
}
@@ -297,17 +297,17 @@ component ControlPanel inherits HorizontalLayout {
297297
VerticalLayout {
298298
alignment: center;
299299
desktop-speaker-slider := Slider {
300-
value: Store.setting-control.desktop-speaker-sound;
301-
minimum: 0;
302-
maximum: 100;
300+
value: Store.setting-control.desktop-speaker-gain;
301+
minimum: -20;
302+
maximum: 20;
303303
indicator-size: self.has-hover ? Theme.icon-size * 2 / 3 : 0;
304304
width: root.slider-width;
305305

306306
height: Theme.icon-size / 3;
307307
enabled: Store.setting-control.enable-desktop-speaker && Store.record-status == RecordStatus.Stopped;
308308

309309
changed(value) => {
310-
Store.setting-control.desktop-speaker-sound = self.value;
310+
Store.setting-control.desktop-speaker-gain = self.value;
311311
Logic.set-setting-control(Store.setting-control);
312312
Logic.desktop-speaker-amplification-changed(self.value);
313313
}
@@ -318,7 +318,7 @@ component ControlPanel inherits HorizontalLayout {
318318
alignment: center;
319319

320320
Label {
321-
text: desktop-speaker-slider.value.to-fixed(0) + "%";
321+
text: desktop-speaker-slider.value.to-fixed(0) + "db";
322322
color: desktop-speaker-slider.enabled ? Theme.primary-text-color : Theme.disabled-color;
323323
}
324324
}

wayshot/ui/store.slint

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ export struct SettingControl {
8787
screen: string,
8888

8989
input-audio: string,
90-
input-audio-sound: float,
90+
input-audio-gain: float,
9191
enable-input-audio: bool,
9292

93-
desktop-speaker-sound: float,
93+
desktop-speaker-gain: float,
9494
enable-desktop-speaker: bool,
9595
}
9696

@@ -190,9 +190,9 @@ export global Store {
190190
in-out property <SettingControl> setting-control: {
191191
screen: sources[1].name,
192192
input-audio: sources[0].name,
193-
input-audio-sound: 10,
193+
input-audio-gain: -2,
194194
enable-input-audio: true,
195-
desktop-speaker-sound: 50,
195+
desktop-speaker-gain: 2,
196196
enable-desktop-speaker: true,
197197
};
198198

0 commit comments

Comments
 (0)