vlc | branch: master | Thomas Guillem <[email protected]> | Thu Mar 2 15:11:26 2017 +0100| [c6fd228ed7a0034c322ea30a640176c887ba1173] | committer: Thomas Guillem
coreaudio: don't drop blocks if circular buffer is too small But just copy the block in small chuncks. This case is very very unlikely to happen. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c6fd228ed7a0034c322ea30a640176c887ba1173 --- modules/audio_output/coreaudio_common.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/modules/audio_output/coreaudio_common.c b/modules/audio_output/coreaudio_common.c index ebfa342..7470ffa 100644 --- a/modules/audio_output/coreaudio_common.c +++ b/modules/audio_output/coreaudio_common.c @@ -144,13 +144,6 @@ ca_Play(audio_output_t * p_aout, block_t * p_block) while (!TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer)) { - if (unlikely(p_block->i_buffer > - (uint32_t) p_sys->circular_buffer.length)) - { - msg_Err(p_aout, "the block is too big for the circular buffer"); - assert(false); - break; - } if (atomic_load_explicit(&p_sys->b_paused, memory_order_relaxed)) { msg_Warn(p_aout, "dropping block because the circular buffer is " @@ -158,17 +151,23 @@ ca_Play(audio_output_t * p_aout, block_t * p_block) break; } - /* Wait for the render buffer to play the remaining data */ + /* Try to play what we can */ int32_t i_avalaible_bytes; - TPCircularBufferTail(&p_sys->circular_buffer, &i_avalaible_bytes); + TPCircularBufferHead(&p_sys->circular_buffer, &i_avalaible_bytes); assert(i_avalaible_bytes >= 0); if (unlikely((size_t) i_avalaible_bytes >= p_block->i_buffer)) continue; - int32_t i_waiting_bytes = p_block->i_buffer - i_avalaible_bytes; - const mtime_t i_frame_us = - FramesToUs(p_sys, BytesToFrames(p_sys, i_waiting_bytes)); + bool ret = + TPCircularBufferProduceBytes(&p_sys->circular_buffer, + p_block->p_buffer, i_avalaible_bytes); + assert(ret == true); + p_block->p_buffer += i_avalaible_bytes; + p_block->i_buffer -= i_avalaible_bytes; + /* Wait for the render buffer to play the remaining data */ + const mtime_t i_frame_us = + FramesToUs(p_sys, BytesToFrames(p_sys, p_block->i_buffer)); /* Don't sleep less than 10ms */ msleep(__MAX(i_frame_us, 10000)); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
