summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/mpegplayer.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-04-11 11:02:45 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-04-11 11:02:45 +0000
commitdfa9f440349d7532423373b2bac5993ee5e958a9 (patch)
tree1bdd5c62fbb48995948b24fdb939482a28399001 /apps/plugins/mpegplayer/mpegplayer.c
parent7c4b786851ec90364c0335b46d093fb6dba1af01 (diff)
downloadrockbox-dfa9f440349d7532423373b2bac5993ee5e958a9.zip
rockbox-dfa9f440349d7532423373b2bac5993ee5e958a9.tar.gz
rockbox-dfa9f440349d7532423373b2bac5993ee5e958a9.tar.bz2
rockbox-dfa9f440349d7532423373b2bac5993ee5e958a9.tar.xz
mpegplayer: Hopefully help some problems on dual core. Make USB mode exit correctly.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13109 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/mpegplayer/mpegplayer.c')
-rw-r--r--apps/plugins/mpegplayer/mpegplayer.c32
1 files changed, 15 insertions, 17 deletions
diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c
index b39f318..440bbd7 100644
--- a/apps/plugins/mpegplayer/mpegplayer.c
+++ b/apps/plugins/mpegplayer/mpegplayer.c
@@ -929,7 +929,6 @@ static inline int32_t clip_sample(int32_t sample)
return sample;
}
-static void audio_thread(void) __attribute__((noreturn));
static void audio_thread(void)
{
uint8_t *mpabuf = mpa_buffer;
@@ -1197,12 +1196,10 @@ done:
rb->sleep(HZ/4);
}
- /* Don't really terminate but just signal that it's ok for this thread
- to be killed */
- audiostatus = THREAD_TERMINATED;
+ pcm_playback_stop();
- while (1)
- rb->yield();
+ audiostatus = THREAD_TERMINATED;
+ rb->remove_thread(NULL);
}
/* End of libmad stuff */
@@ -1744,20 +1741,21 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
#endif
/* Stop the threads and wait for them to terminate */
- if (audiothread_id != NULL)
- audiostatus = PLEASE_STOP;
-
- if (videothread_id != NULL)
+ if (videostatus != THREAD_TERMINATED)
+ {
videostatus = PLEASE_STOP;
+ while (videostatus != THREAD_TERMINATED)
+ rb->yield();
+ }
- while (audiostatus != THREAD_TERMINATED ||
- videostatus != THREAD_TERMINATED)
- rb->yield();
-
- if (audiothread_id != NULL)
- rb->remove_thread(audiothread_id);
+ if (audiostatus != THREAD_TERMINATED)
+ {
+ audiostatus = PLEASE_STOP;
+ while (audiostatus != THREAD_TERMINATED)
+ rb->yield();
+ }
- pcm_playback_stop();
+ rb->sleep(HZ/10);
rb->lcd_clear_display();
rb->lcd_update();