use std::mem::transmute;
use crate::{
arc,
av::{self, audio},
define_cls, define_obj_type, ns, objc,
};
#[cfg(feature = "blocks")]
use crate::{blocks, cf};
#[cfg(feature = "blocks")]
#[doc(alias = "AVAudioConverterInputBlock")]
pub type InputBlock<Attr> = blocks::Block<
fn(av::AudioPacketCount, &mut av::AudioConverterInputStatus) -> Option<arc::Rar<av::AudioBuf>>,
Attr,
>;
#[derive(Debug, PartialEq, Eq)]
#[repr(isize)]
pub enum PrimeMethod {
Pre = 0,
Normal = 1,
None = 2,
}
#[derive(Debug, PartialEq, Eq)]
#[repr(C)]
pub struct PrimeInfo {
pub leading_frames: audio::FrameCount,
pub trailing_frames: audio::FrameCount,
}
#[derive(Debug, PartialEq, Eq)]
#[repr(isize)]
pub enum InputStatus {
HaveData = 0,
NoDataNow = 1,
EndOfStream = 2,
}
#[derive(Debug, PartialEq, Eq)]
#[repr(isize)]
pub enum OutputStatus {
HaveData = 0,
InputRanDry = 1,
EndOfStream = 2,
Error = 3,
}
define_obj_type!(
pub Converter(ns::Id)
);
impl arc::A<Converter> {
#[objc::msg_send(initFromFormat:toFormat:)]
pub fn init_from_format_to_format(
self,
from: &av::AudioFormat,
to: &av::AudioFormat,
) -> Option<arc::R<Converter>>;
}
impl Converter {
define_cls!(AV_AUDIO_CONVERTER);
pub fn with_formats(from: &av::AudioFormat, to: &av::AudioFormat) -> Option<arc::R<Self>> {
Self::alloc().init_from_format_to_format(from, to)
}
#[objc::msg_send(bitRateStrategy)]
pub fn bit_rate_strategy(&self) -> Option<arc::R<ns::String>>;
#[objc::msg_send(setBitRateStrategy:)]
pub fn set_bit_rate_strategy(&self, value: Option<&ns::String>);
#[objc::msg_send(maximumOutputPacketSize)]
pub fn maximum_output_packet_size(&self) -> isize;
#[objc::msg_send(availableEncodeBitRates)]
pub fn available_encode_bit_rates(&self) -> Option<arc::R<ns::Array<ns::Number>>>;
#[objc::msg_send(applicableEncodeBitRates)]
pub fn applicable_encode_bit_rates(&self) -> Option<arc::R<ns::Array<ns::Number>>>;
#[objc::msg_send(availableEncodeSampleRates)]
pub fn available_encode_sample_rates(&self) -> Option<arc::R<ns::Array<ns::Number>>>;
#[objc::msg_send(applicableEncodeSampleRates)]
pub fn applicable_encode_sample_rates(&self) -> Option<arc::R<ns::Array<ns::Number>>>;
#[objc::msg_send(availableEncodeChannelLayoutTags)]
pub fn available_encode_channel_layout_tags(&self) -> Option<arc::R<ns::Array<ns::Number>>>;
#[objc::msg_send(convertToBuffer:fromBuffer:error:)]
pub unsafe fn convert_to_buf_from_buf_err<'ear>(
&self,
output_buffer: &mut av::AudioPcmBuf,
from_buffer: &av::AudioPcmBuf,
error: *mut Option<&'ear ns::Error>,
) -> bool;
#[inline]
pub fn convert_to_buf_from_buf<'ear>(
&self,
output_buffer: &mut av::AudioPcmBuf,
from_buffer: &av::AudioPcmBuf,
) -> ns::Result<'ear> {
unsafe {
let mut error = None;
let res = self.convert_to_buf_from_buf_err(output_buffer, from_buffer, &mut error);
if error.is_some() {
debug_assert!(!res);
Err(transmute(error))
} else {
debug_assert!(res);
Ok(())
}
}
}
#[cfg(feature = "blocks")]
#[objc::msg_send(convertToBuffer:error:withInputFromBlock:)]
pub unsafe fn convert_to_buf_err_with_input_from_block(
&self,
output_buffer: &mut av::AudioBuf,
error: *mut Option<&cf::Error>,
block: &mut av::AudioConverterInputBlock<blocks::Esc>,
) -> OutputStatus;
#[doc(alias = "convertToBuffer:error:withInputFromBlock:")]
#[inline]
#[cfg(feature = "blocks")]
pub fn convert_to_buf_with_input_from_block<'ar>(
&self,
output_buffer: &mut av::AudioBuf,
block: &mut av::AudioConverterInputBlock<blocks::Esc>,
) -> Result<OutputStatus, arc::R<cf::Error>> {
unsafe {
let mut error = None;
let res =
self.convert_to_buf_err_with_input_from_block(output_buffer, &mut error, block);
if error.is_some() {
debug_assert_eq!(res, OutputStatus::Error);
Err(transmute(error))
} else {
Ok(res)
}
}
}
}
unsafe extern "C" {
static AV_AUDIO_CONVERTER: &'static objc::Class<Converter>;
}