From b7e0e1a0a3b44868ddb9ad60210158ccbe220e90 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Thu, 16 May 2013 16:15:34 -0400 Subject: buflib: Remove compulsory IRQ disable during buffer move. It can cause excessively long interrupt outages if moving a larger buffer and disrupt audio where DMA is not at a higher interrupt priority such as FIQ. Some targets, like Gigabeat S, have very low audio interrupt latency requirements and will even channel swap if they are missed. Pictureflow will make the issue very obvious. Even then, moves could take milliseconds or more depending on the buffer size which is far too long for any target. Change-Id: I8e7817213e901da67c36b7eb25d7cb1c1e3ba802 Reviewed-on: http://gerrit.rockbox.org/472 Reviewed-by: Michael Sevakis Tested-by: Michael Sevakis --- firmware/buflib.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/firmware/buflib.c b/firmware/buflib.c index a007603161..9b591ad786 100644 --- a/firmware/buflib.c +++ b/firmware/buflib.c @@ -208,18 +208,10 @@ move_block(struct buflib_context* ctx, union buflib_data* block, int shift) new_block = block + shift; new_start = tmp->alloc + shift*sizeof(union buflib_data); - /* disable IRQs to make accessing the buffer from interrupt context safe. */ - /* protect the move callback, as a cached global pointer might be updated - * in it. and protect "tmp->alloc = new_start" for buflib_get_data() */ - /* call the callback before moving */ + /* If move must be synchronized with use, user should have specified a + callback that handles this */ if (ops && ops->sync_callback) - { ops->sync_callback(handle, true); - } - else - { - disable_irq(); - } bool retval = false; if (!ops || ops->move_callback(handle, tmp->alloc, new_start) @@ -231,13 +223,7 @@ move_block(struct buflib_context* ctx, union buflib_data* block, int shift) } if (ops && ops->sync_callback) - { ops->sync_callback(handle, false); - } - else - { - enable_irq(); - } return retval; } -- cgit v1.2.3