use super::{Encoder, ffi};
use core::ptr;
pub trait EncoderInput {
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int;
}
pub struct MonoPcm<'a, T>(pub &'a [T]);
impl EncoderInput for MonoPcm<'_, u16> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_buffer(encoder.ptr(), self.0.as_ptr() as _, ptr::null(), self.0.len() as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for MonoPcm<'_, i16> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_buffer(encoder.ptr(), self.0.as_ptr(), ptr::null(), self.0.len() as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for MonoPcm<'_, libc::c_int> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_buffer_int(encoder.ptr(), self.0.as_ptr(), ptr::null(), self.0.len() as _, output_buf as _, output_len as _)
}
}
}
#[cfg(unix)]
impl EncoderInput for MonoPcm<'_, libc::c_long> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_buffer_long2(encoder.ptr(), self.0.as_ptr(), ptr::null(), self.0.len() as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for MonoPcm<'_, f32> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_buffer_ieee_float(encoder.ptr(), self.0.as_ptr(), ptr::null(), self.0.len() as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for MonoPcm<'_, f64> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_buffer_ieee_double(encoder.ptr(), self.0.as_ptr(), ptr::null(), self.0.len() as _, output_buf as _, output_len as _)
}
}
}
pub struct DualPcm<'a, T> {
pub left: &'a [T],
pub right: &'a [T],
}
impl EncoderInput for DualPcm<'_, i16> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
debug_assert_eq!(self.left.len(), self.right.len());
let samples_num = core::cmp::min(self.left.len(), self.right.len());
unsafe {
ffi::lame_encode_buffer(encoder.ptr(), self.left.as_ptr(), self.right.as_ptr(), samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for DualPcm<'_, u16> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
debug_assert_eq!(self.left.len(), self.right.len());
let samples_num = core::cmp::min(self.left.len(), self.right.len());
unsafe {
ffi::lame_encode_buffer(encoder.ptr(), self.left.as_ptr() as _, self.right.as_ptr() as _, samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for DualPcm<'_, libc::c_int> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
debug_assert_eq!(self.left.len(), self.right.len());
let samples_num = core::cmp::min(self.left.len(), self.right.len());
unsafe {
ffi::lame_encode_buffer_int(encoder.ptr(), self.left.as_ptr(), self.right.as_ptr(), samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for DualPcm<'_, f32> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
debug_assert_eq!(self.left.len(), self.right.len());
let samples_num = core::cmp::min(self.left.len(), self.right.len());
unsafe {
ffi::lame_encode_buffer_ieee_float(encoder.ptr(), self.left.as_ptr() as _, self.right.as_ptr() as _, samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for DualPcm<'_, f64> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
debug_assert_eq!(self.left.len(), self.right.len());
let samples_num = core::cmp::min(self.left.len(), self.right.len());
unsafe {
ffi::lame_encode_buffer_ieee_double(encoder.ptr(), self.left.as_ptr() as _, self.right.as_ptr() as _, samples_num as _, output_buf as _, output_len as _)
}
}
}
pub struct InterleavedPcm<'a, T>(pub &'a [T]);
impl EncoderInput for InterleavedPcm<'_, i16> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
let samples_num = self.0.len() / 2;
debug_assert_eq!(self.0.len() % 2, 0);
unsafe {
ffi::lame_encode_buffer_interleaved(encoder.ptr(), self.0.as_ptr() as _, samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for InterleavedPcm<'_, u16> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
let samples_num = self.0.len() / 2;
debug_assert_eq!(self.0.len() % 2, 0);
unsafe {
ffi::lame_encode_buffer_interleaved(encoder.ptr(), self.0.as_ptr() as _, samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for InterleavedPcm<'_, libc::c_int> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
let samples_num = self.0.len() / 2;
debug_assert_eq!(self.0.len() % 2, 0);
unsafe {
ffi::lame_encode_buffer_interleaved_int(encoder.ptr(), self.0.as_ptr(), samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for InterleavedPcm<'_, f32> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
let samples_num = self.0.len() / 2;
debug_assert_eq!(self.0.len() % 2, 0);
unsafe {
ffi::lame_encode_buffer_interleaved_ieee_float(encoder.ptr(), self.0.as_ptr(), samples_num as _, output_buf as _, output_len as _)
}
}
}
impl EncoderInput for InterleavedPcm<'_, f64> {
#[inline(always)]
fn encode(self, encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
let samples_num = self.0.len() / 2;
debug_assert_eq!(self.0.len() % 2, 0);
unsafe {
ffi::lame_encode_buffer_interleaved_ieee_double(encoder.ptr(), self.0.as_ptr(), samples_num as _, output_buf as _, output_len as _)
}
}
}
pub trait EncoderFlush {
fn flush(encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int;
}
pub struct FlushGap;
impl EncoderFlush for FlushGap {
#[allow(clippy::not_unsafe_ptr_arg_deref)]
#[inline(always)]
fn flush(encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_flush(encoder.ptr(), output_buf, output_len as _)
}
}
}
pub struct FlushNoGap;
impl EncoderFlush for FlushNoGap {
#[allow(clippy::not_unsafe_ptr_arg_deref)]
#[inline(always)]
fn flush(encoder: &mut Encoder, output_buf: *mut u8, output_len: usize) -> libc::c_int {
unsafe {
ffi::lame_encode_flush_nogap(encoder.ptr(), output_buf, output_len as _)
}
}
}