(
output: &mut [&mut [f32]],
flags: &FirewheelBitFlags,
shared_flags: &Arc<SharedFlags>,
logger: &mut RealtimeLogger,
)
| 700 | logger: &mut RealtimeLogger, |
| 701 | ) { |
| 702 | if flags.contains(FirewheelBitFlags::VALIDATE_OUTPUT_IS_FINITE) { |
| 703 | let mut non_finite_value = 0.0; |
| 704 | |
| 705 | for ch in output.iter_mut() { |
| 706 | for s in ch.iter_mut() { |
| 707 | // Try to optimize for auto-vectorization |
| 708 | let is_finite = s.is_finite(); |
| 709 | |
| 710 | non_finite_value = if is_finite { non_finite_value } else { *s }; |
| 711 | *s = if is_finite { *s } else { 0.0 }; |
| 712 | } |
| 713 | } |
| 714 | |
| 715 | if non_finite_value != 0.0 { |
| 716 | let _ = logger.try_error_with(|s| { |
| 717 | #[cfg(feature = "std")] |
| 718 | { |
| 719 | *s = format!( |
| 720 | "Non-finite number detected on audio output: {}", |
| 721 | non_finite_value |
| 722 | ); |
| 723 | } |
| 724 | |
| 725 | #[cfg(not(feature = "std"))] |
| 726 | { |
| 727 | *s = bevy_platform::prelude::String::from( |
| 728 | "Non-finite number detected on audio output", |
| 729 | ); |
| 730 | } |
| 731 | }); |
| 732 | } |
| 733 | } |
| 734 | |
| 735 | if flags.contains(FirewheelBitFlags::DETECT_CLIPPING_ON_OUTPUT) { |
| 736 | let mut clipping_occurred = false; |
| 737 | |
| 738 | for ch in output.iter() { |
| 739 | let max_peak = firewheel_core::dsp::algo::max_peak(ch); |
| 740 | |
| 741 | if max_peak > 1.0 { |
| 742 | clipping_occurred = true; |
| 743 | break; |
| 744 | } |
| 745 | } |
| 746 | |
| 747 | if clipping_occurred { |
| 748 | shared_flags |
| 749 | .clipping_occurred |
| 750 | .store(true, Ordering::Relaxed); |
| 751 | } |
| 752 | } |
| 753 | |
| 754 | if flags.contains(FirewheelBitFlags::HARD_CLIP_OUTPUTS) { |
| 755 | for ch in output.iter_mut() { |
| 756 | for s in ch.iter_mut() { |
| 757 | *s = s.clamp(-1.0, 1.0); |
| 758 | } |
| 759 | } |
no test coverage detected