summaryrefslogtreecommitdiff
path: root/apps/codecs
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-03-02 08:49:38 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-03-02 08:49:38 +0000
commit12375d1d3aa41f7d277a9af584c7b810b636ec95 (patch)
treefc9ce8029a6910a8dac71b3bf60c71155a01eea4 /apps/codecs
parent05e180a1308a095d51d51d0e047fcd44425ea88f (diff)
downloadrockbox-12375d1d3aa41f7d277a9af584c7b810b636ec95.tar.gz
rockbox-12375d1d3aa41f7d277a9af584c7b810b636ec95.zip
Merge functionality of wakeups and semaphores-- fewer APIs and object types. semaphore_wait takes a timeout now so codecs and plugins have to be made incompatible. Don't make semaphores for targets not using them.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29492 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs')
-rw-r--r--apps/codecs/mpa.c4
-rw-r--r--apps/codecs/spc.c17
2 files changed, 10 insertions, 11 deletions
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c
index d3da63b430..4d6c52f2b3 100644
--- a/apps/codecs/mpa.c
+++ b/apps/codecs/mpa.c
@@ -211,7 +211,7 @@ static void mad_synth_thread(void)
211{ 211{
212 while(1) { 212 while(1) {
213 ci->semaphore_release(&synth_done_sem); 213 ci->semaphore_release(&synth_done_sem);
214 ci->semaphore_wait(&synth_pending_sem); 214 ci->semaphore_wait(&synth_pending_sem, TIMEOUT_BLOCK);
215 215
216 if(die) 216 if(die)
217 break; 217 break;
@@ -224,7 +224,7 @@ static void mad_synth_thread(void)
224 * synthesized */ 224 * synthesized */
225static inline void mad_synth_thread_wait_pcm(void) 225static inline void mad_synth_thread_wait_pcm(void)
226{ 226{
227 ci->semaphore_wait(&synth_done_sem); 227 ci->semaphore_wait(&synth_done_sem, TIMEOUT_BLOCK);
228} 228}
229 229
230/* increment the done semaphore - used after a wait for idle to preserve the 230/* increment the done semaphore - used after a wait for idle to preserve the
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
245static inline struct sample_queue_chunk * samples_get_wrbuf(void) 245static 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
260static inline int32_t * samples_get_rdbuf(void) 260static 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