use new style InitFlags

This commit is contained in:
Andelf
2014-04-14 19:49:50 +08:00
parent c3beb759d0
commit 9a18d31b53
2 changed files with 50 additions and 24 deletions
+2 -1
View File
@@ -5,6 +5,7 @@ extern crate sdl2;
extern crate sdl2_mixer;
use std::os;
use std::default::Default;
use mix = sdl2_mixer;
@@ -22,7 +23,7 @@ fn main() {
fn dump_info(filename: &Path) -> Result<(), ~str> {
println!("linked version: {}", mix::get_linked_version());
sdl2::init([sdl2::InitAudio, sdl2::InitTimer]);
println!("inited => {}", mix::init([mix::InitMp3, mix::InitFlac]));
println!("inited => {}", mix::init(Default::default()));
// TODO: 0x8010 is SDL_audio flag
try!(mix::open_audio(mix::DEFAULT_FREQUENCY, 0x8010u16, 2, 1024));
+48 -23
View File
@@ -20,6 +20,8 @@ use std::default;
use std::ptr;
use std::cast;
use std::raw;
use std::ops::BitOr;
use std::default::Default;
use sdl2::get_error;
use sdl2::rwops::RWops;
@@ -133,35 +135,58 @@ pub fn get_linked_version() -> SDLVersion {
}
}
#[repr(C)]
#[deriving(Clone, Eq, Hash, Show)]
pub enum InitFlag {
InitFlac = ffi::MIX_INIT_FLAC as int,
InitMod = ffi::MIX_INIT_MOD as int,
InitModPlug = ffi::MIX_INIT_MODPLUG as int,
InitMp3 = ffi::MIX_INIT_MP3 as int,
InitOgg = ffi::MIX_INIT_OGG as int,
InitFluidSynth = ffi::MIX_INIT_FLUIDSYNTH as int,
InitFlac,
InitMod,
InitModPlug,
InitMp3,
InitOgg,
InitFluidSynth,
InitRaw(int),
}
pub fn init(flags: &[InitFlag]) -> ~[InitFlag] {
//! Loads dynamic libraries and prepares them for use. Flags should be
//! one or more flags from InitFlag.
//! It returns the flags successfully initialized, or [] on failure.
let mut used = ~[];
unsafe {
let used_flags = ffi::Mix_Init(
flags.iter().fold(0, |flags, &flag| {
flags | flag as ffi::MIX_InitFlags
}) as c_int
);
for flag in flags.iter() {
if used_flags & *flag as c_int != 0 {
used.push(*flag)
}
impl InitFlag {
#[inline]
pub fn to_ll(self) -> c_int {
match self {
InitFlac => ffi::MIX_INIT_FLAC as c_int,
InitMod => ffi::MIX_INIT_MOD as c_int,
InitModPlug => ffi::MIX_INIT_MODPLUG as c_int,
InitMp3 => ffi::MIX_INIT_MP3 as c_int,
InitOgg => ffi::MIX_INIT_OGG as c_int,
InitFluidSynth => ffi::MIX_INIT_FLUIDSYNTH as c_int,
InitRaw(n) => n as c_int,
}
}
used
pub fn from_ll(n: c_int) -> InitFlag {
InitRaw(n as int)
}
pub fn mask(self, flag: InitFlag) -> bool {
self.to_ll() & flag.to_ll() == flag.to_ll()
}
}
impl BitOr<InitFlag, InitFlag> for InitFlag {
fn bitor(&self, rhs: &InitFlag) -> InitFlag {
InitRaw(self.to_ll() as int | rhs.to_ll() as int)
}
}
impl Default for InitFlag {
fn default() -> InitFlag {
InitFlag::from_ll((ffi::MIX_INIT_FLAC | ffi::MIX_INIT_MOD | ffi::MIX_INIT_MODPLUG |
ffi::MIX_INIT_MP3 | ffi::MIX_INIT_OGG | ffi::MIX_INIT_FLUIDSYNTH) as c_int)
}
}
pub fn init(flags: InitFlag) -> InitFlag {
//! Loads dynamic libraries and prepares them for use. Flags should be
//! one or more flags from InitFlag.
let ret = unsafe { ffi::Mix_Init(flags.to_ll()) };
InitFlag::from_ll(ret)
}
pub fn quit() {