From 8439e0ce44b895931fd821da5a31fa53e3fcd421 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 23 Aug 2008 21:06:11 -0700 Subject: xfade: copy xfade_time locally to avoid race conditions ob.xfade_time can be changed by the main process without locking, so copy the float value into a local variable and recheck the local variable for zero before continuing. --- src/outputBuffer_xfade.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/outputBuffer_xfade.h b/src/outputBuffer_xfade.h index a2a6b0c38..48084c44b 100644 --- a/src/outputBuffer_xfade.h +++ b/src/outputBuffer_xfade.h @@ -8,6 +8,7 @@ static struct ob_chunk *get_chunk(struct iovec vec[2], size_t i); static size_t calculate_xfade_chunks(struct iovec vec[2]) { + float xfade_time = ob.xfade_time; /* prevent race conditions */ size_t chunks; struct ob_chunk *c; size_t nr; @@ -15,11 +16,13 @@ static size_t calculate_xfade_chunks(struct iovec vec[2]) assert(pthread_equal(ob.thread, pthread_self())); + if (xfade_time <= 0) + return ob.bpp_cur; if (!isCurrentAudioFormat(af)) return 0; if (!ob.total_time || - (ob.elapsed_time + ob.xfade_time) < ob.total_time) + (ob.elapsed_time + xfade_time) < ob.total_time) return ob.bpp_cur; /* too early, don't enable xfade yet */ assert(af->bits > 0); @@ -27,7 +30,7 @@ static size_t calculate_xfade_chunks(struct iovec vec[2]) assert(af->sampleRate > 0); chunks = af->sampleRate * af->bits * af->channels / 8.0 / CHUNK_SIZE; - chunks = chunks * (ob.xfade_time + 0.5); + chunks = chunks * (xfade_time + 0.5); assert(chunks); assert(ob.index->size >= ob.bpp_cur); -- cgit v1.2.3