mirror of
https://github.com/encounter/rust-sdl2.git
synced 2026-07-10 21:18:41 -07:00
Audio callback sends silence in case of Task panic
This commit is contained in:
+34
-8
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user