use num_derive::{FromPrimitive, ToPrimitive};
use num_traits::FromPrimitive;
use oboe_sys as ffi;
use std::{error, fmt, result};
pub const NANOS_PER_MICROSECOND: i64 = 1000;
pub const NANOS_PER_MILLISECOND: i64 = NANOS_PER_MICROSECOND * 1000;
pub const MILLIS_PER_SECOND: i64 = 1000;
pub const NANOS_PER_SECOND: i64 = NANOS_PER_MILLISECOND * MILLIS_PER_SECOND;
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum StreamState {
Uninitialized = ffi::oboe_StreamState_Uninitialized,
Unknown = ffi::oboe_StreamState_Unknown,
Open = ffi::oboe_StreamState_Open,
Starting = ffi::oboe_StreamState_Starting,
Started = ffi::oboe_StreamState_Started,
Pausing = ffi::oboe_StreamState_Pausing,
Paused = ffi::oboe_StreamState_Paused,
Flushing = ffi::oboe_StreamState_Flushing,
Flushed = ffi::oboe_StreamState_Flushed,
Stopping = ffi::oboe_StreamState_Stopping,
Stopped = ffi::oboe_StreamState_Stopped,
Closing = ffi::oboe_StreamState_Closing,
Closed = ffi::oboe_StreamState_Closed,
Disconnected = ffi::oboe_StreamState_Disconnected,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum Direction {
Output = ffi::oboe_Direction_Output,
Input = ffi::oboe_Direction_Input,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum AudioFormat {
Invalid = ffi::oboe_AudioFormat_Invalid,
Unspecified = ffi::oboe_AudioFormat_Unspecified,
I16 = ffi::oboe_AudioFormat_I16,
I24 = ffi::oboe_AudioFormat_I24,
I32 = ffi::oboe_AudioFormat_I32,
F32 = ffi::oboe_AudioFormat_Float,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum DataCallbackResult {
Continue = ffi::oboe_DataCallbackResult_Continue,
Stop = ffi::oboe_DataCallbackResult_Stop,
}
pub type Result<T> = result::Result<T, Error>;
pub type Status = Result<()>;
pub(crate) fn wrap_status(result: i32) -> Status {
if result == ffi::oboe_Result_OK {
Ok(())
} else {
Err(FromPrimitive::from_i32(result).unwrap())
}
}
pub(crate) fn wrap_result<T>(result: ffi::oboe_ResultWithValue<T>) -> Result<T> {
if result.mError == ffi::oboe_Result_OK {
Ok(result.mValue)
} else {
Err(FromPrimitive::from_i32(result.mError).unwrap())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum Error {
Disconnected = ffi::oboe_Result_ErrorDisconnected,
IllegalArgument = ffi::oboe_Result_ErrorIllegalArgument,
Internal = ffi::oboe_Result_ErrorInternal,
InvalidState = ffi::oboe_Result_ErrorInvalidState,
InvalidHandle = ffi::oboe_Result_ErrorInvalidHandle,
Unimplemented = ffi::oboe_Result_ErrorUnimplemented,
Unavailable = ffi::oboe_Result_ErrorUnavailable,
NoFreeHandles = ffi::oboe_Result_ErrorNoFreeHandles,
NoMemory = ffi::oboe_Result_ErrorNoMemory,
Null = ffi::oboe_Result_ErrorNull,
Timeout = ffi::oboe_Result_ErrorTimeout,
WouldBlock = ffi::oboe_Result_ErrorWouldBlock,
InvalidFormat = ffi::oboe_Result_ErrorInvalidFormat,
OutOfRange = ffi::oboe_Result_ErrorOutOfRange,
NoService = ffi::oboe_Result_ErrorNoService,
InvalidRate = ffi::oboe_Result_ErrorInvalidRate,
Closed = ffi::oboe_Result_ErrorClosed,
}
impl error::Error for Error {}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(self, f)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum SharingMode {
Exclusive = ffi::oboe_SharingMode_Exclusive,
Shared = ffi::oboe_SharingMode_Shared,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum PerformanceMode {
None = ffi::oboe_PerformanceMode_None,
PowerSaving = ffi::oboe_PerformanceMode_PowerSaving,
LowLatency = ffi::oboe_PerformanceMode_LowLatency,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum AudioApi {
Unspecified = ffi::oboe_AudioApi_Unspecified,
OpenSLES = ffi::oboe_AudioApi_OpenSLES,
AAudio = ffi::oboe_AudioApi_AAudio,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum SampleRateConversionQuality {
None,
Fastest,
Low,
Medium,
High,
Best,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum Usage {
Media = ffi::oboe_Usage_Media,
VoiceCommunication = ffi::oboe_Usage_VoiceCommunication,
VoiceCommunicationSignalling = ffi::oboe_Usage_VoiceCommunicationSignalling,
Alarm = ffi::oboe_Usage_Alarm,
Notification = ffi::oboe_Usage_Notification,
NotificationRingtone = ffi::oboe_Usage_NotificationRingtone,
NotificationEvent = ffi::oboe_Usage_NotificationEvent,
AssistanceAccessibility = ffi::oboe_Usage_AssistanceAccessibility,
AssistanceNavigationGuidance = ffi::oboe_Usage_AssistanceNavigationGuidance,
AssistanceSonification = ffi::oboe_Usage_AssistanceSonification,
Game = ffi::oboe_Usage_Game,
Assistant = ffi::oboe_Usage_Assistant,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum ContentType {
Speech = ffi::oboe_ContentType_Speech,
Music = ffi::oboe_ContentType_Music,
Movie = ffi::oboe_ContentType_Movie,
Sonification = ffi::oboe_ContentType_Sonification,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum InputPreset {
Generic = ffi::oboe_InputPreset_Generic,
Camcorder = ffi::oboe_InputPreset_Camcorder,
VoiceRecognition = ffi::oboe_InputPreset_VoiceRecognition,
VoiceCommunication = ffi::oboe_InputPreset_VoiceCommunication,
Unprocessed = ffi::oboe_InputPreset_Unprocessed,
VoicePerformance = ffi::oboe_InputPreset_VoicePerformance,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum SessionId {
None = ffi::oboe_SessionId_None,
Allocate = ffi::oboe_SessionId_Allocate,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
#[repr(i32)]
pub enum ChannelCount {
Unspecified = ffi::oboe_ChannelCount_Unspecified,
Mono = ffi::oboe_ChannelCount_Mono,
Stereo = ffi::oboe_ChannelCount_Stereo,
}
pub struct DefaultStreamValues(());
impl DefaultStreamValues {
pub fn get_sample_rate() -> i32 {
unsafe { ffi::oboe_DefaultStreamValues_SampleRate }
}
pub fn set_sample_rate(sample_rate: i32) {
unsafe {
ffi::oboe_DefaultStreamValues_SampleRate = sample_rate;
}
}
pub fn get_frames_per_burst() -> i32 {
unsafe { ffi::oboe_DefaultStreamValues_FramesPerBurst }
}
pub fn set_frames_per_burst(frames_per_burst: i32) {
unsafe {
ffi::oboe_DefaultStreamValues_FramesPerBurst = frames_per_burst;
}
}
pub fn get_channel_count() -> i32 {
unsafe { ffi::oboe_DefaultStreamValues_ChannelCount }
}
pub fn set_channel_count(channel_count: i32) {
unsafe {
ffi::oboe_DefaultStreamValues_ChannelCount = channel_count;
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct FrameTimestamp {
pub position: i64,
pub timestamp: i64,
}