From e3cdf3ab3855c7d372623205fac65491629bf166 Mon Sep 17 00:00:00 2001 From: Dan Spencer Date: Thu, 27 Nov 2014 00:54:51 -0700 Subject: [PATCH] Audio callback sends silence in case of Task panic --- src/sdl2/audio.rs | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/sdl2/audio.rs b/src/sdl2/audio.rs index 1a26dce4..8bfae491 100644 --- a/src/sdl2/audio.rs +++ b/src/sdl2/audio.rs @@ -282,19 +282,40 @@ impl Drop for AudioCallbackTask { /// All format types are returned as native-endian. /// /// Example: `assert_eq!(AudioFormatNum::::get_audio_format(), ll::AUDIO_F32);`` -pub trait AudioFormatNum { fn get_audio_format() -> ll::SDL_AudioFormat; } +pub trait AudioFormatNum { + fn get_audio_format() -> ll::SDL_AudioFormat; + fn zero() -> Self; +} /// AUDIO_S8 -impl AudioFormatNum for i8 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S8 } } +impl AudioFormatNum for i8 { + fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S8 } + fn zero() -> i8 { 0 } +} /// AUDIO_U8 -impl AudioFormatNum for u8 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U8 } } +impl AudioFormatNum for u8 { + fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U8 } + fn zero() -> u8 { 0 } +} /// AUDIO_S16 -impl AudioFormatNum for i16 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S16SYS } } +impl AudioFormatNum for i16 { + fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S16SYS } + fn zero() -> i16 { 0 } +} /// AUDIO_U16 -impl AudioFormatNum for u16 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U16SYS } } +impl AudioFormatNum for u16 { + fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_U16SYS } + fn zero() -> u16 { 0 } +} /// AUDIO_S32 -impl AudioFormatNum for i32 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S32SYS } } +impl AudioFormatNum for i32 { + fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_S32SYS } + fn zero() -> i32 { 0 } +} /// AUDIO_F32 -impl AudioFormatNum for f32 { fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_F32SYS } } +impl AudioFormatNum for f32 { + fn get_audio_format() -> ll::SDL_AudioFormat { ll::AUDIO_F32SYS } + fn zero() -> f32 { 0.0 } +} extern "C" fn audio_callback_marshall, CB: AudioCallback> (userdata: *const c_void, stream: *const uint8_t, len: c_int) { @@ -317,7 +338,12 @@ extern "C" fn audio_callback_marshall, CB: AudioCallback 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);