@@ -142,8 +142,11 @@ pub fn render_orbit_to_stereo(
142142 let smoothing_time_seconds = 0.08 + smoothness * 0.70 ;
143143 let smoothing_coeff = ( -1.0 / ( sample_rate. max ( 1 ) as f32 * smoothing_time_seconds) ) . exp ( ) ;
144144
145- let silence_limit = settings. silence_threshold_seconds . max ( 1 ) as usize * sample_rate. max ( 1 ) as usize ;
145+ let sample_rate_usize = sample_rate. max ( 1 ) as usize ;
146+ let silence_limit = settings. silence_threshold_seconds . max ( 1 ) as usize * sample_rate_usize;
147+ let silence_bridge_limit = ( sample_rate_usize / 20 ) . max ( 1 ) ;
146148 let mut consecutive_silent_frames = 0usize ;
149+ let mut non_silent_bridge_frames = 0usize ;
147150 let mut silence_ranges = Vec :: new ( ) ;
148151 let mut skipped_silence_start: Option < usize > = None ;
149152
@@ -156,11 +159,17 @@ pub fn render_orbit_to_stereo(
156159
157160 for frame_index in start_frame..frame_count {
158161 let source_sample = mono[ frame_index] ;
159- let is_silent = source_sample. abs ( ) <= silence_floor;
160- if is_silent {
162+ let is_below_silence_floor = source_sample. abs ( ) <= silence_floor;
163+ if is_below_silence_floor {
164+ consecutive_silent_frames += 1 ;
165+ non_silent_bridge_frames = 0 ;
166+ } else if consecutive_silent_frames > 0 && non_silent_bridge_frames < silence_bridge_limit {
167+ // AIMP-style silence skipping should not be broken by tiny decoder clicks or noise-floor spikes.
168+ non_silent_bridge_frames += 1 ;
161169 consecutive_silent_frames += 1 ;
162170 } else {
163171 consecutive_silent_frames = 0 ;
172+ non_silent_bridge_frames = 0 ;
164173 }
165174
166175 if settings. skip_silence_enabled && consecutive_silent_frames > silence_limit {
@@ -256,7 +265,11 @@ pub fn render_orbit_to_stereo(
256265}
257266
258267fn silence_floor_from_percent ( percent : u8 ) -> f32 {
259- percent. clamp ( 1 , 20 ) as f32 / 100.0
268+ if percent == 0 {
269+ 0.001
270+ } else {
271+ percent. clamp ( 1 , 20 ) as f32 / 100.0
272+ }
260273}
261274
262275fn render_plain_stereo (
@@ -271,19 +284,27 @@ fn render_plain_stereo(
271284 silence_floor : f32 ,
272285) -> ( Vec < f32 > , f32 , Vec < ( f32 , f32 ) > ) {
273286 let frame_count = mono. len ( ) ;
274- let silence_limit = silence_threshold_seconds. max ( 1 ) as usize * sample_rate. max ( 1 ) as usize ;
287+ let sample_rate_usize = sample_rate. max ( 1 ) as usize ;
288+ let silence_limit = silence_threshold_seconds. max ( 1 ) as usize * sample_rate_usize;
289+ let silence_bridge_limit = ( sample_rate_usize / 20 ) . max ( 1 ) ;
275290 let mut consecutive_silent_frames = 0usize ;
291+ let mut non_silent_bridge_frames = 0usize ;
276292 let mut silence_ranges = Vec :: new ( ) ;
277293 let mut skipped_silence_start: Option < usize > = None ;
278294 let mut output = Vec :: with_capacity ( ( frame_count. saturating_sub ( start_frame) ) * 2 ) ;
279295
280296 for frame_index in start_frame..frame_count {
281297 let source_sample = mono[ frame_index] ;
282- let is_silent = source_sample. abs ( ) <= silence_floor;
283- if is_silent {
298+ let is_below_silence_floor = source_sample. abs ( ) <= silence_floor;
299+ if is_below_silence_floor {
300+ consecutive_silent_frames += 1 ;
301+ non_silent_bridge_frames = 0 ;
302+ } else if consecutive_silent_frames > 0 && non_silent_bridge_frames < silence_bridge_limit {
303+ non_silent_bridge_frames += 1 ;
284304 consecutive_silent_frames += 1 ;
285305 } else {
286306 consecutive_silent_frames = 0 ;
307+ non_silent_bridge_frames = 0 ;
287308 }
288309
289310 if skip_silence_enabled && consecutive_silent_frames > silence_limit {
0 commit comments