use std::error::Error; use std::fmt; #[derive(Debug)] pub enum AsioError { NoResult(String), BufferError(String), DriverLoadError, TypeError, } #[derive(Debug)] enum AsioErrorWrapper { ASE_OK = 0, // This value will be returned whenever the call succeeded ASE_SUCCESS = 0x3f4847a0, // unique success return value for ASIOFuture calls ASE_NotPresent = -1000, // hardware input or output is not present or available ASE_HWMalfunction, // hardware is malfunctioning (can be returned by any ASIO function) ASE_InvalidParameter, // input parameter invalid ASE_InvalidMode, // hardware is in a bad mode or used in a bad mode ASE_SPNotAdvancing, // hardware is not running when sample position is inquired ASE_NoClock, // sample clock or rate cannot be determined or is not present ASE_NoMemory, // not enough memory for completing the request Invalid, } impl fmt::Display for AsioError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { ASIOError::NoResult(ref e) => write!(f, "Driver {} not found", e), ASIOError::BufferError(ref e) => write!(f, "Buffer Error: {}", e), ASIOError::DriverLoadError => write!(f, "Couldn't load the driver"), ASIOError::TypeError => write!(f, "Couldn't convert sample type"), AsioError::NoDrivers => { write!(f, "hardware input or output is not present or available") }, AsioError::HardwareMalfunction => write!( f, "hardware is malfunctioning (can be returned by any ASIO function)" ), AsioError::InvalidInput => write!(f, "input parameter invalid"), AsioError::BadMode => write!(f, "hardware is in a bad mode or used in a bad mode"), AsioError::HardwareStuck => write!( f, "hardware is not running when sample position is inquired" ), AsioError::NoRate => write!( f, "sample clock or rate cannot be determined or is not present" ), AsioError::ASE_NoMemory => write!(f, "not enough memory for completing the request"), AsioError::UnknownError => write!(f, "Error not in SDK"), } } } impl Error for ASIOError { fn description(&self) -> &str { match *self { ASIOError::NoResult(_) => "Couln't find driver", ASIOError::BufferError(_) => "Error creating the buffer", ASIOError::DriverLoadError => "Error loading the driver", ASIOError::TypeError => "Error getting sample type", AsioError::NoDrivers => "hardware input or output is not present or available", AsioError::HardwareMalfunction => { "hardware is malfunctioning (can be returned by any ASIO function)" }, AsioError::InvalidInput => "input parameter invalid", AsioError::BadMode => "hardware is in a bad mode or used in a bad mode", AsioError::HardwareStuck => "hardware is not running when sample position is inquired", AsioError::NoRate => "sample clock or rate cannot be determined or is not present", AsioError::ASE_NoMemory => "not enough memory for completing the request", AsioError::UnknownError => "Error not in SDK", } } } macro_rules! asio_error_helper { ($x:expr, $ae:ident{ $($v:ident),+ }, $inval:ident) => { match $x { $(_ if $x == $ae::$v as i32 => $ae::$v,)+ _ => $ae::$inval, } }; } macro_rules! asio_result { ($result:expr) => { match asio_error!( $result, AsioErrorWrapper { ASE_OK, ASE_SUCCESS, ASE_NotPresent, ASE_HWMalfunction, ASE_InvalidParameter, ASE_InvalidMode, ASE_SPNotAdvancing, ASE_NoClock, ASE_NoMemory }, Invalid ) { ASE_OK => Ok(()), ASE_SUCCESS => Ok(()), ASE_NotPresent => Err(AsioError::NoDrivers), ASE_HWMalfunction => Err(AsioError::HardwareMalfunction), ASE_InvalidParameter => Err(AsioError::InvalidInput), ASE_InvalidMode => Err(AsioError::BadMode), ASE_SPNotAdvancing => Err(AsioError::HardwareStuck), ASE_NoClock => Err(AsioError::NoRate), ASE_NoMemory => Err(AsioError::ASE_NoMemory), Invalid => Err(AsioError::UnknownError), } }; }