///|
pub(all) suberror AudioError {
  AudioError(String)
}

///|
/// Interleaved PCM uses 1 to 8 channels and a declared sample rate.
pub fn validate_format(
  sample_rate : Int32,
  channels : Int32,
) -> Unit raise AudioError {
  if sample_rate < 8000 || sample_rate > 192000 {
    raise AudioError("sample_rate must be between 8000 and 192000 Hz")
  }
  if channels < 1 || channels > 8 {
    raise AudioError("channels must be between 1 and 8")
  }
}

///|
pub fn validate_samples(
  samples : Array[Double],
  channels : Int32,
) -> Unit raise AudioError {
  if channels < 1 || samples.length() % channels != 0 {
    raise AudioError("interleaved input must contain complete frames")
  }
  for sample in samples {
    if sample.is_nan() || sample.is_inf() || sample.abs() > 1.0e100 {
      raise AudioError(
        "PCM samples must be finite and have absolute value <= 1e100",
      )
    }
  }
}

///|
pub fn validate_ratio(
  value : Double,
  minimum : Double,
  maximum : Double,
  name : String,
) -> Unit raise AudioError {
  if value.is_nan() || value.is_inf() || value < minimum || value > maximum {
    raise AudioError("\{name} must be between \{minimum} and \{maximum}")
  }
}