diff options
Diffstat (limited to 'apps/codecs/spc.c')
-rw-r--r-- | apps/codecs/spc.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/apps/codecs/spc.c b/apps/codecs/spc.c index d4ed741f7e..4db2878964 100644 --- a/apps/codecs/spc.c +++ b/apps/codecs/spc.c | |||
@@ -244,7 +244,7 @@ static inline void samples_release_wrbuf(void) | |||
244 | 244 | ||
245 | static inline struct sample_queue_chunk * samples_get_wrbuf(void) | 245 | static inline struct sample_queue_chunk * samples_get_wrbuf(void) |
246 | { | 246 | { |
247 | ci->semaphore_wait(&sample_queue.emu_sem_tail); | 247 | ci->semaphore_wait(&sample_queue.emu_sem_tail, TIMEOUT_BLOCK); |
248 | return &sample_queue.wav_chunk[sample_queue.tail & WAV_CHUNK_MASK]; | 248 | return &sample_queue.wav_chunk[sample_queue.tail & WAV_CHUNK_MASK]; |
249 | } | 249 | } |
250 | 250 | ||
@@ -259,7 +259,7 @@ static inline void samples_release_rdbuf(void) | |||
259 | 259 | ||
260 | static inline int32_t * samples_get_rdbuf(void) | 260 | static inline int32_t * samples_get_rdbuf(void) |
261 | { | 261 | { |
262 | ci->semaphore_wait(&sample_queue.emu_sem_head); | 262 | ci->semaphore_wait(&sample_queue.emu_sem_head, TIMEOUT_BLOCK); |
263 | 263 | ||
264 | if (ci->stop_codec || ci->new_track) | 264 | if (ci->stop_codec || ci->new_track) |
265 | { | 265 | { |
@@ -275,7 +275,7 @@ static intptr_t emu_thread_send_msg(long id, intptr_t data) | |||
275 | { | 275 | { |
276 | struct sample_queue_chunk *chunk; | 276 | struct sample_queue_chunk *chunk; |
277 | /* Grab an audio output buffer */ | 277 | /* Grab an audio output buffer */ |
278 | ci->semaphore_wait(&sample_queue.emu_sem_head); | 278 | ci->semaphore_wait(&sample_queue.emu_sem_head, TIMEOUT_BLOCK); |
279 | chunk = &sample_queue.wav_chunk[sample_queue.head & WAV_CHUNK_MASK]; | 279 | chunk = &sample_queue.wav_chunk[sample_queue.head & WAV_CHUNK_MASK]; |
280 | /* Place a message in it instead of audio */ | 280 | /* Place a message in it instead of audio */ |
281 | chunk->id = id; | 281 | chunk->id = id; |
@@ -285,7 +285,7 @@ static intptr_t emu_thread_send_msg(long id, intptr_t data) | |||
285 | 285 | ||
286 | if (id != SPC_EMU_QUIT) { | 286 | if (id != SPC_EMU_QUIT) { |
287 | /* Wait for a response */ | 287 | /* Wait for a response */ |
288 | ci->semaphore_wait(&sample_queue.emu_evt_reply); | 288 | ci->semaphore_wait(&sample_queue.emu_evt_reply, TIMEOUT_BLOCK); |
289 | } | 289 | } |
290 | 290 | ||
291 | return sample_queue.retval; | 291 | return sample_queue.retval; |
@@ -308,11 +308,10 @@ static bool emu_thread_process_msg(struct sample_queue_chunk *chunk) | |||
308 | sample_queue.retval = SPC_load_spc(&spc_emu, ld->buf, ld->size); | 308 | sample_queue.retval = SPC_load_spc(&spc_emu, ld->buf, ld->size); |
309 | 309 | ||
310 | /* Empty the audio queue */ | 310 | /* Empty the audio queue */ |
311 | /* This is a dirty hack a timeout based wait would make unnescessary but | 311 | ci->semaphore_release(&sample_queue.emu_sem_tail); |
312 | still safe because the other thread is known to be waiting for a reply | 312 | ci->semaphore_release(&sample_queue.emu_sem_tail); |
313 | and is not using the objects. */ | 313 | ci->semaphore_wait(&sample_queue.emu_sem_head, TIMEOUT_NOBLOCK); |
314 | ci->semaphore_init(&sample_queue.emu_sem_tail, 2, 2); | 314 | ci->semaphore_wait(&sample_queue.emu_sem_head, TIMEOUT_NOBLOCK); |
315 | ci->semaphore_init(&sample_queue.emu_sem_head, 2, 0); | ||
316 | sample_queue.head = sample_queue.tail = 0; | 315 | sample_queue.head = sample_queue.tail = 0; |
317 | } | 316 | } |
318 | 317 | ||