opus1 0.3.0

Pure-Rust implementation of the Opus audio codec (RFC 6716), following libopus 1.x
Documentation
use crate::silk::macros::*;

/// libopus `silk_log2lin` (silk/log2lin.c): `2^(in_log_q7 / 128)`, the inverse
/// of `silk_lin2log`. 0 for a negative input and `i32::MAX` from 3967 on.
#[inline]
pub fn silk_log2lin(in_log_q7: i32) -> i32 {
    if in_log_q7 < 0 {
        return 0;
    }
    if in_log_q7 >= 3967 {
        return i32::MAX;
    }
    let out = silk_lshift(1, in_log_q7 >> 7);
    let frac_q7 = in_log_q7 & 0x7F;

    // Piece-wise parabolic approximation.
    let val = silk_smlawb(frac_q7, silk_smulbb(frac_q7, 128 - frac_q7), -174);
    if in_log_q7 < 2048 {
        silk_add_rshift32(out, silk_mul(out, val), 7)
    } else {
        silk_mla(out, out >> 7, val)
    }
}