Author: titmuss
Date: Wed May 14 05:46:17 2008
New Revision: 2452

URL: http://svn.slimdevices.com?rev=2452&root=Jive&view=rev
Log:
Bug: N/A
Description:
Make sure the mutex is used for all fifos.
Fix memcpy used in buffering.


Modified:
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.c
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.h
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=2452&root=Jive&r1=2451&r2=2452&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Wed May 14 
05:46:17 2008
@@ -74,6 +74,8 @@
 
        DEBUG_TRACE("decode_resume_handler start_jiffies=%d", start_jiffies);
 
+       fifo_lock(&decode_fifo);
+
        // XXXX handle start_jiffies
 
        if (decoder) {
@@ -85,6 +87,8 @@
        }
 
        DEBUG_TRACE("resume decode state: %x audio state %x", 
current_decoder_state, current_audio_state);
+
+       fifo_unlock(&decode_fifo);
 }
 
 
@@ -394,7 +398,7 @@
 static int decode_status(lua_State *L) {
        lua_newtable(L);
 
-       // XXXX fifo mutex lock
+       fifo_lock(&decode_fifo);
 
        lua_pushinteger(L, fifo_bytes_used(&decode_fifo));
        lua_setfield(L, -2, "outputFull");
@@ -408,7 +412,7 @@
        lua_pushinteger(L, decode_num_tracks_started);
        lua_setfield(L, -2, "tracksStarted");
 
-       // XXXX fifo mutex unlock
+       fifo_unlock(&decode_fifo);
 
 
        lua_pushinteger(L, streambuf_get_usedbytes());

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c?rev=2452&root=Jive&r1=2451&r2=2452&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c Wed 
May 14 05:46:17 2008
@@ -110,6 +110,8 @@
 
        // XXXX full port from ip3k
 
+       fifo_lock(&decode_fifo);
+
        if (decode_first_buffer) {
                current_sample_rate = sample_rate;
                track_start_point = decode_fifo.wptr;
@@ -139,6 +141,8 @@
        if (start_immediately) {
                current_audio_state = DECODE_STATE_RUNNING;
        }
+
+       fifo_unlock(&decode_fifo);
 }
 
 
@@ -148,7 +152,11 @@
 
        // XXXX full port from ip3k
        
+       fifo_lock(&decode_fifo);
+
        freebytes = fifo_bytes_free(&decode_fifo);
+
+       fifo_unlock(&decode_fifo);
 
        if (freebytes >= buffer_size) {
                return TRUE;

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c?rev=2452&root=Jive&r1=2451&r2=2452&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c 
Wed May 14 05:46:17 2008
@@ -56,6 +56,8 @@
                return 0;
        }
 
+       fifo_lock(&decode_fifo);
+
        bytes_used = fifo_bytes_used(&decode_fifo);     
        if (bytes_used > len) {
                bytes_used = len;
@@ -65,6 +67,8 @@
        if (bytes_used == 0) {
                current_audio_state |= DECODE_STATE_UNDERRUN;
                memset(outputBuffer, 0, len);
+
+               fifo_unlock(&decode_fifo);
                return 0;
        }
 
@@ -98,9 +102,12 @@
        reached_start_point = decode_check_start_point();
        if (reached_start_point && current_sample_rate != stream_sample_rate) {
                change_sample_rate = true;
+
+               fifo_unlock(&decode_fifo);
                return paComplete;
        }
 
+       fifo_unlock(&decode_fifo);
        return paContinue;
 }
 

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.c?rev=2452&root=Jive&r1=2451&r2=2452&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.c (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.c Wed May 14 05:46:17 
2008
@@ -23,6 +23,9 @@
 */
 
 
+#define ASSERT_LOCKED() assert(fifo->lock)
+
+
 void fifo_init(struct fifo *fifo, size_t size) {
        fifo->mutex = SDL_CreateMutex();
        fifo->cond = SDL_CreateCond();
@@ -32,6 +35,8 @@
 }
 
 void fifo_free(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
        SDL_DestroyCond(fifo->cond);
        SDL_DestroyMutex(fifo->mutex);
        fifo->rptr = 0;
@@ -40,26 +45,38 @@
 }
 
 bool_t fifo_empty(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
        return (fifo->rptr == fifo->wptr);
 }
 
 size_t fifo_bytes_used(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
        return (fifo->wptr >= fifo->rptr) ? (fifo->wptr - fifo->rptr ) : 
(fifo->wptr - fifo->rptr + fifo->size);
 }
 
 size_t fifo_bytes_free(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
        return (fifo->rptr > fifo->wptr) ? (fifo->rptr - fifo->wptr - 1) : 
(fifo->rptr - fifo->wptr + fifo->size - 1);
 }
        
 size_t fifo_bytes_until_rptr_wrap(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
        return (fifo->size-fifo->rptr);
 }
 
 size_t fifo_bytes_until_wptr_wrap(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
        return (fifo->size-fifo->wptr);
 }
 
 void fifo_rptr_incby(struct fifo *fifo, size_t incby) {
+       ASSERT_LOCKED();
+
        if (fifo->rptr + incby == fifo->size) {
                fifo->rptr = 0;
        } else {
@@ -68,6 +85,8 @@
 }
 
 void fifo_wptr_incby(struct fifo *fifo, size_t incby) {
+       ASSERT_LOCKED();
+
        if (fifo->wptr + incby == fifo->size) {
                fifo->wptr = 0;
        } else {
@@ -76,17 +95,33 @@
 }
 
 int fifo_lock(struct fifo *fifo) {
-       return SDL_LockMutex(fifo->mutex);
+       int r = SDL_LockMutex(fifo->mutex);
+
+       fifo->lock++;
+       return r;
 }
 
 int fifo_unlock(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
+       fifo->lock--;
        return SDL_UnlockMutex(fifo->mutex);
 }
 
 int fifo_signal(struct fifo *fifo) {
+       ASSERT_LOCKED();
+
        return SDL_CondSignal(fifo->cond);
 }
 
 int fifo_wait_timeout(struct fifo *fifo, Uint32 ms) {
-       return SDL_CondWaitTimeout(fifo->cond, fifo->mutex, ms);
+       int r;
+
+       ASSERT_LOCKED();
+       fifo->lock--;
+
+       r = SDL_CondWaitTimeout(fifo->cond, fifo->mutex, ms);
+
+       fifo->lock++;
+       return 1;
 }

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.h
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.h?rev=2452&root=Jive&r1=2451&r2=2452&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.h (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/fifo.h Wed May 14 05:46:17 
2008
@@ -14,6 +14,7 @@
 struct fifo {
        SDL_mutex *mutex;
        SDL_cond *cond;
+       bool_t lock;
 
        size_t rptr;
        size_t wptr;

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c?rev=2452&root=Jive&r1=2451&r2=2452&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c Wed May 14 
05:46:17 2008
@@ -127,7 +127,7 @@
                        n = size;
                }
 
-               memcpy(buf, streambuf_buf + streambuf_fifo.wptr, n);
+               memcpy(streambuf_buf + streambuf_fifo.wptr, buf, n);
                fifo_wptr_incby(&streambuf_fifo, n);
                size -= n;
        }
@@ -183,7 +183,7 @@
                *streaming = streambuf_streaming;
        }
 
-       sz = streambuf_get_usedbytes();
+       sz = fifo_bytes_used(&streambuf_fifo);
        if (sz < min) {
                fifo_unlock(&streambuf_fifo);
                return 0; /* underrun */
@@ -383,7 +383,7 @@
 
 
        /* read buffer, but we must not overflow the stream fifo */
-       n = fifo_bytes_free(&streambuf_fifo);
+       n = streambuf_get_freebytes();
        if (n > sizeof(buf)) {
                n = sizeof(buf);
        }

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins

Reply via email to