diff --git a/src/sdl2/audio.rs b/src/sdl2/audio.rs index 48aefbcd..f25349be 100644 --- a/src/sdl2/audio.rs +++ b/src/sdl2/audio.rs @@ -263,9 +263,13 @@ impl, CB: AudioCallback> AudioSpecDesired { true => AudioDeviceID::RecordingDevice(id), false => AudioDeviceID::PlaybackDevice(id) }; + + let (spec, callback) = AudioSpec::convert_from_ll(obtained); + Ok(AudioDevice { device_id: device_id, - spec: AudioSpec::convert_from_ll(obtained) + spec: spec, + callback: callback }) } } @@ -273,27 +277,27 @@ impl, CB: AudioCallback> AudioSpecDesired { } } -pub struct AudioSpec, CB: AudioCallback> { +#[deriving(Clone, Show)] +pub struct AudioSpec { pub freq: i32, pub channels: u8, pub silence: u8, pub samples: u16, - pub size: u32, - pub callback: Box, + pub size: u32 } -impl, CB: AudioCallback> AudioSpec { - fn convert_from_ll(spec: ll::SDL_AudioSpec) -> AudioSpec { +impl AudioSpec { + fn convert_from_ll, CB: AudioCallback>(spec: ll::SDL_AudioSpec) + -> (AudioSpec, Box) { use std::mem::transmute; unsafe { - AudioSpec { + (AudioSpec { freq: spec.freq, channels: spec.channels, silence: spec.silence, samples: spec.samples, - size: spec.size, - callback: transmute(spec.userdata) - } + size: spec.size + }, transmute(spec.userdata)) } } } @@ -322,8 +326,9 @@ impl Drop for AudioDeviceID { pub struct AudioDevice, CB: AudioCallback> { device_id: AudioDeviceID, /// Every audio device corresponds to an SDL_AudioSpec. - /// Store it in `AudioDevice` to keep it and its callback data alive. - spec: AudioSpec + spec: AudioSpec, + /// Store the callback to keep it alive for the entire duration of `AudioDevice`. + callback: Box } impl, CB: AudioCallback> AudioDevice { @@ -334,6 +339,8 @@ impl, CB: AudioCallback> AudioDevice { } } + pub fn get_spec(&self) -> &AudioSpec { &self.spec } + pub fn pause(&self) { unsafe { ll::SDL_PauseAudioDevice(self.device_id.id(), 1) } } @@ -349,9 +356,9 @@ impl, CB: AudioCallback> AudioDevice { } } - pub fn close_and_get_spec(self) -> AudioSpec { + pub fn close_and_get_callback(self) -> Box { drop(self.device_id); - self.spec + self.callback } } @@ -361,11 +368,11 @@ pub struct AudioDeviceLockGuard<'a, T: AudioFormat, CB: AudioCallback + 'a } impl<'a, T: AudioFormat, CB: AudioCallback> Deref for AudioDeviceLockGuard<'a, T, CB> { - fn deref(&self) -> &CB { &*self.device.spec.callback } + fn deref(&self) -> &CB { &*self.device.callback } } impl<'a, T: AudioFormat, CB: AudioCallback> DerefMut for AudioDeviceLockGuard<'a, T, CB> { - fn deref_mut(&mut self) -> &mut CB { &mut *self.device.spec.callback } + fn deref_mut(&mut self) -> &mut CB { &mut *self.device.callback } } #[unsafe_destructor]