Audio callback sends silence in case of Task panic

This commit is contained in:
Dan Spencer
2014-11-27 01:27:51 -07:00
parent f50b630f11
commit e3cdf3ab38
+34 -8
View File
@@ -282,19 +282,40 @@ impl Drop for AudioCallbackTask {
/// All format types are returned as native-endian.
///
/// Example: `assert_eq!(AudioFormatNum::<f32>::get_audio_format(), ll::AUDIO_F32);``
pub trait AudioFormatNum<T> { fn get_audio_format() -> ll::SDL_AudioFormat; }
pub trait AudioFormatNum<T> {
fn get_audio_format() -> ll::SDL_AudioFormat;
fn zero() -> Self;
}
/// AUDIO_S8
impl AudioFormatNum<i8> for i8 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S8 } }
impl AudioFormatNum<i8> for i8 {
fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S8 }
fn zero() -> i8 { 0 }
}
/// AUDIO_U8
impl AudioFormatNum<u8> for u8 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U8 } }
impl AudioFormatNum<u8> for u8 {
fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U8 }
fn zero() -> u8 { 0 }
}
/// AUDIO_S16
impl AudioFormatNum<i16> for i16 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S16SYS } }
impl AudioFormatNum<i16> for i16 {
fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S16SYS }
fn zero() -> i16 { 0 }
}
/// AUDIO_U16
impl AudioFormatNum<u16> for u16 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U16SYS } }
impl AudioFormatNum<u16> for u16 {
fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U16SYS }
fn zero() -> u16 { 0 }
}
/// AUDIO_S32
impl AudioFormatNum<i32> for i32 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S32SYS } }
impl AudioFormatNum<i32> for i32 {
fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S32SYS }
fn zero() -> i32 { 0 }
}
/// AUDIO_F32
impl AudioFormatNum<f32> for f32 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_F32SYS } }
impl AudioFormatNum<f32> for f32 {
fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_F32SYS }
fn zero() -> f32 { 0.0 }
}
extern "C" fn audio_callback_marshall<T: AudioFormatNum<T>, CB: AudioCallback<T>>
(userdata: *const c_void, stream: *const uint8_t, len: c_int) {
@@ -317,7 +338,12 @@ extern "C" fn audio_callback_marshall<T: AudioFormatNum<T>, CB: AudioCallback<T>
if n.is_destroyed() { None }
else { Some(n) }
},
None => None
None => {
// Last callback had an error. Fill buffer with silence.
for x in buf.iter_mut() { *x = AudioFormatNum::zero(); }
None
}
};
replace(&mut cb_userdata.task.task, new_task);