From 9a18d31b535bc78b6889c4ea4ed32dc891bf921c Mon Sep 17 00:00:00 2001 From: Andelf Date: Mon, 14 Apr 2014 19:49:50 +0800 Subject: [PATCH] use new style InitFlags --- src/demo/demo.rs | 3 +- src/sdl2_mixer/lib.rs | 71 +++++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/demo/demo.rs b/src/demo/demo.rs index 5dbf93a8..46aebb15 100644 --- a/src/demo/demo.rs +++ b/src/demo/demo.rs @@ -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)); diff --git a/src/sdl2_mixer/lib.rs b/src/sdl2_mixer/lib.rs index 39f2ed33..4e138f43 100644 --- a/src/sdl2_mixer/lib.rs +++ b/src/sdl2_mixer/lib.rs @@ -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 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() {