summaryrefslogtreecommitdiff
path: root/psdl.c
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2009-07-06 03:01:41 +0200
committerGravatar waker <wakeroid@gmail.com>2009-07-06 03:01:41 +0200
commitd05d431ebad5767f3afa9b6c76639e83233e2d9c (patch)
tree0ab32f81a39f5ce3fab292892aee97ee1f85e6c5 /psdl.c
parentb7a872069ad3990b65d8ebe6d53de8768841980f (diff)
fixed inter-thread conflict for codec access
Diffstat (limited to 'psdl.c')
-rw-r--r--psdl.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/psdl.c b/psdl.c
index 3f4c92b9..3bba6916 100644
--- a/psdl.c
+++ b/psdl.c
@@ -139,7 +139,9 @@ psdl_callback (void* userdata, Uint8 *stream, int len) {
memset (stream, 0, len);
}
else if (codec->info.samplesPerSecond == sdl_player_freq) {
+ codec_lock ();
codecret = codec->read (stream, len);
+ codec_unlock ();
}
else {
int nsamples = len/4;
@@ -147,6 +149,7 @@ psdl_callback (void* userdata, Uint8 *stream, int len) {
// add 5 extra samples for SRC
nsamples = nsamples * codec->info.samplesPerSecond / sdl_player_freq + 5;
// read data at source samplerate (with some room for SRC)
+ codec_lock ();
codecret = codec->read (sdl_buffer, (nsamples - codecleft) * 2 * codec->info.channels);
// convert to float, and apply soft volume
int i;
@@ -178,6 +181,7 @@ psdl_callback (void* userdata, Uint8 *stream, int len) {
codecleft = nsamples - srcdata.input_frames_used;
// copy spare samples for next update
memmove (sdl_fbuffer, &sdl_fbuffer[srcdata.input_frames_used*2], codecleft * 8);
+ codec_unlock ();
}
sdl_eof = codecret == -1 ? 1 : 0;
}