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