1#[macro_use]
17extern crate lazy_static;
18extern crate parking_lot;
19extern crate al_sys;
20
21use std::error::Error as StdError;
22use std::fmt;
23use std::io;
24
25
26mod alc;
27pub use alc::*;
28
29
30mod al;
31pub use al::*;
32
33
34pub mod ext;
35
36
37pub mod efx;
38
39
40pub mod sys {
41 pub use al_sys::*;
42}
43
44
45#[derive(Debug)]
47pub enum AltoError {
48 InvalidDevice,
50 InvalidContext,
52 InvalidName,
54 InvalidEnum,
56 InvalidValue,
58 InvalidOperation,
60 OutOfMemory,
62 UnknownAlcError(sys::ALCint),
63 UnknownAlError(sys::ALint),
64
65 UnsupportedVersion{major: sys::ALCint, minor: sys::ALCint},
67 ExtensionNotPresent,
69 NullError,
71 WrongDevice,
73 WrongContext,
75 Io(io::Error),
77}
78
79
80pub type AltoResult<T> = ::std::result::Result<T, AltoError>;
81
82
83impl AltoError {
84 fn from_alc(alc: sys::ALCenum) -> AltoError {
85 match alc {
86 sys::ALC_INVALID_DEVICE => AltoError::InvalidDevice,
87 sys::ALC_INVALID_CONTEXT => AltoError::InvalidContext,
88 sys::ALC_INVALID_ENUM => AltoError::InvalidEnum,
89 sys::ALC_INVALID_VALUE => AltoError::InvalidValue,
90 sys::ALC_OUT_OF_MEMORY => AltoError::OutOfMemory,
91 e => AltoError::UnknownAlcError(e),
92 }
93 }
94
95
96 fn from_al(al: sys::ALenum) -> AltoError {
97 match al {
98 sys::AL_INVALID_NAME => AltoError::InvalidName,
99 sys::AL_INVALID_ENUM => AltoError::InvalidEnum,
100 sys::AL_INVALID_VALUE => AltoError::InvalidValue,
101 sys::AL_INVALID_OPERATION => AltoError::InvalidOperation,
102 sys::AL_OUT_OF_MEMORY => AltoError::OutOfMemory,
103 e => AltoError::UnknownAlError(e),
104 }
105 }
106}
107
108
109impl fmt::Display for AltoError {
110 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
111 write!(f, "{}", self.description())
112 }
113}
114
115
116impl StdError for AltoError {
117 fn description(&self) -> &str {
118 match *self {
119 AltoError::InvalidDevice => "ALTO ERROR: ALC Invalid Device",
120 AltoError::InvalidContext => "ALTO ERROR: ALC Invalid Context",
121 AltoError::InvalidName => "ALTO ERROR: AL Invalid Name",
122 AltoError::InvalidEnum => "ALTO ERROR: ALC Invalid Enum",
123 AltoError::InvalidValue => "ALTO ERROR: ALC Invalid Value",
124 AltoError::InvalidOperation => "ALTO ERROR: AL Invalid Operation",
125 AltoError::OutOfMemory => "ALTO ERROR: ALC Out of Memory",
126 AltoError::UnknownAlcError(..) => "ALTO ERROR: Unknown ALC error",
127 AltoError::UnknownAlError(..) => "ALTO ERROR: Unknown AL error",
128
129 AltoError::UnsupportedVersion{..} => "ALTO ERROR: Unsupported Version",
130 AltoError::ExtensionNotPresent => "ALTO ERROR: Extension Not Present",
131 AltoError::NullError => "ALTO ERROR: Return value is NULL with no error code",
132 AltoError::WrongDevice => "ALTO ERROR: Resource used on wrong device",
133 AltoError::WrongContext => "ALTO ERROR: Resource used on wrong device",
134 AltoError::Io(ref io) => io.description(),
135 }
136 }
137}
138
139
140impl From<io::Error> for AltoError {
141 fn from(io: io::Error) -> AltoError {
142 AltoError::Io(io)
143 }
144}
145
146
147impl From<ext::ExtensionError> for AltoError {
148 fn from(_: ext::ExtensionError) -> AltoError {
149 AltoError::ExtensionNotPresent
150 }
151}