#[cfg(feature = "file-decode")]
mod chunks;
mod decode;
mod opus;
mod pcm;
mod resample;
mod stream;
mod telephony;
#[cfg(feature = "file-decode")]
mod vad_windows;
#[cfg(test)]
#[path = "tests.rs"]
mod tests;
#[cfg(all(test, not(miri)))]
#[path = "proptests.rs"]
mod proptests;
pub(crate) use super::{HOP_LENGTH, N_FFT};
pub(crate) const MAX_BUFFER_SAMPLES: usize = 16000 * 5; #[cfg(feature = "file-decode")]
pub(crate) const WHOLE_BUFFER_MAX_AUDIO_SECS: f64 = 1800.0; #[cfg(feature = "file-decode")]
pub(crate) const MAX_SAMPLE_RATE: u32 = 192_000;
pub(crate) const DUAL_MONO_CORRELATION_THRESHOLD: f64 = 0.98;
#[cfg(feature = "file-decode")]
pub(crate) fn max_samples_for_secs(limit: Option<f64>, sample_rate: u32) -> usize {
match limit {
Some(secs) if secs.is_finite() && secs > 0.0 => (secs * sample_rate as f64) as usize,
_ => usize::MAX,
}
}
#[cfg(feature = "file-decode")]
pub(crate) fn whole_buffer_limit_secs(user: Option<f64>) -> f64 {
match user {
Some(secs) if secs.is_finite() && secs > 0.0 => secs.min(WHOLE_BUFFER_MAX_AUDIO_SECS),
_ => WHOLE_BUFFER_MAX_AUDIO_SECS,
}
}
#[cfg(feature = "file-decode")]
pub(crate) fn resolve_budget(limit: Option<f64>, sample_rate: u32) -> (usize, f64) {
let limit_secs = limit
.filter(|s| s.is_finite() && *s > 0.0)
.unwrap_or(f64::INFINITY);
(max_samples_for_secs(limit, sample_rate), limit_secs)
}
#[cfg(feature = "file-decode")]
pub(crate) fn decode_error(e: anyhow::Error) -> crate::error::GigasttError {
match e.downcast::<crate::error::GigasttError>() {
Ok(g) => g,
Err(e) => crate::error::GigasttError::InvalidAudio {
reason: format!("{e:#}"),
},
}
}
#[cfg(feature = "file-decode")]
pub(crate) fn audio_too_long_err(
observed_source_frames: usize,
sample_rate: u32,
limit_secs: f64,
) -> anyhow::Error {
crate::error::GigasttError::AudioTooLong {
observed_secs: observed_source_frames as f64 / sample_rate as f64,
limit_secs,
}
.into()
}
#[cfg(test)]
pub(crate) use decode::BytesMediaSource;
#[cfg(feature = "file-decode")]
pub use decode::{ChannelScan, scan_channels};
#[cfg(feature = "file-decode")]
pub use decode::{
decode_audio_bytes, decode_audio_bytes_shared, decode_audio_bytes_shared_bounded,
decode_audio_bytes_shared_channels, decode_audio_bytes_shared_channels_bounded,
decode_audio_file, load_audio_channels, probe_duration_bytes, probe_duration_file,
};
#[cfg(feature = "file-decode")]
pub(crate) use decode::decode_audio_file_bounded;
pub use decode::{DualMonoDetector, is_dual_mono, mix_channels_to_mono};
pub(crate) use pcm::{consume_audio_buffer, prepare_audio_buffer};
pub use pcm::{parse_pcm16_with_carry, parse_pcm16_with_carry_into};
pub use resample::{SampleRate, resample, resample_with_cache};
pub(crate) use stream::{PcmWindows, SliceWindows, WindowSpec};
#[cfg(feature = "file-decode")]
pub(crate) use stream::FileWindows;
#[cfg(feature = "file-decode")]
pub(crate) use vad_windows::VadWindows;
#[cfg(feature = "file-decode")]
pub use chunks::AudioChunks;
pub use telephony::TelephonyCodec;
#[cfg(feature = "file-decode")]
pub use telephony::{decode_telephony_raw, encode_wav_pcm16};
#[cfg(all(test, feature = "file-decode"))]
#[allow(unused_imports)]
pub(crate) use opus::is_recoverable_packet_eof;
#[cfg(all(test, feature = "file-decode"))]
#[allow(unused_imports)]
pub(crate) use telephony::try_decode_g722_wav;