diff options
| author | Jonathan Gordon <rockbox@jdgordon.info> | 2006-11-06 14:24:18 +0000 |
|---|---|---|
| committer | Jonathan Gordon <rockbox@jdgordon.info> | 2006-11-06 14:24:18 +0000 |
| commit | 0b22795e26ee09de14f6ac23219adeda12f2fd5b (patch) | |
| tree | c1ccbda32170de48111a4b75e1f723ba953096bf /apps | |
| parent | e543901777843a1734474aba7aa5d96cf61708ab (diff) | |
| download | rockbox-0b22795e26ee09de14f6ac23219adeda12f2fd5b.zip rockbox-0b22795e26ee09de14f6ac23219adeda12f2fd5b.tar.gz rockbox-0b22795e26ee09de14f6ac23219adeda12f2fd5b.tar.bz2 rockbox-0b22795e26ee09de14f6ac23219adeda12f2fd5b.tar.xz | |
adds ata_idle_notify system which allows callbacks in apps/ to be called
when the hard disk is idle but spinning, and just before shutting down.
on SWCODEC targets with > 8MB RAM the playback engine will try to
refill the buffer if it is less than 75% full while the disk is spinning
(temporarily disabled on the nano)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11451 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/main.c | 2 | ||||
| -rw-r--r-- | apps/playback.c | 48 |
2 files changed, 42 insertions, 8 deletions
diff --git a/apps/main.c b/apps/main.c index 4249fd0..c4ee45c 100644 --- a/apps/main.c +++ b/apps/main.c @@ -19,6 +19,7 @@ #include "config.h" #include "ata.h" +#include "ata_idle_notify.h" #include "disk.h" #include "fat.h" #include "lcd.h" @@ -364,6 +365,7 @@ void init(void) } #endif + ata_idle_notify_init(); rc = ata_init(); if(rc) { diff --git a/apps/playback.c b/apps/playback.c index 6d277f7..f837266 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -74,6 +74,7 @@ #include "metadata.h" #include "splash.h" #include "talk.h" +#include "ata_idle_notify.h" #ifdef HAVE_RECORDING #include "recording.h" @@ -118,6 +119,9 @@ enum { Q_AUDIO_NEW_PLAYLIST, Q_AUDIO_POSTINIT, Q_AUDIO_FILL_BUFFER, +#if MEM > 8 + Q_AUDIO_FILL_BUFFER_IF_ACTIVE_ATA, +#endif Q_CODEC_REQUEST_PENDING, Q_CODEC_REQUEST_COMPLETE, @@ -2664,11 +2668,6 @@ static void audio_fill_file_buffer( audio_generate_postbuffer_events(); filling = false; - -#ifndef SIMULATOR - if (playing) - ata_sleep(); -#endif } } @@ -3228,14 +3227,30 @@ static void audio_playback_init(void) sound_settings_apply(); } +#if MEM > 8 +/* we dont want this rebuffering on targets with little ram + because the disk may never spin down */ +bool ata_fillbuffer_callback(void) +{ +#ifndef IPOD_NANO + queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER_IF_ACTIVE_ATA, 0); +#endif + return true; +} +#endif static void audio_thread(void) { struct event ev; - +#if MEM > 8 + size_t high_watermark; +#endif /* At first initialize audio system in background. */ audio_playback_init(); - +#if MEM > 8 + high_watermark = (3*filebuflen)/4; +#endif + while (1) { if (filling) @@ -3244,10 +3259,27 @@ static void audio_thread(void) if (ev.id == SYS_TIMEOUT) ev.id = Q_AUDIO_FILL_BUFFER; } +#if MEM > 8 else + { queue_wait_w_tmo(&audio_queue, &ev, HZ/2); - + if ( (ev.id == SYS_TIMEOUT) && + (FILEBUFUSED < high_watermark)) + register_ata_idle_func(ata_fillbuffer_callback); + } +#else + queue_wait_w_tmo(&audio_queue, &ev, HZ/2); +#endif switch (ev.id) { +#if MEM > 8 + case Q_AUDIO_FILL_BUFFER_IF_ACTIVE_ATA: + /* only fill if the disk is still spining */ +#ifndef SIMULATOR + if (!ata_disk_is_active()) + break; +#endif +#endif /* MEM > 8 */ + /* else fall through to Q_AUDIO_FILL_BUFFER */ case Q_AUDIO_FILL_BUFFER: LOGFQUEUE("audio < Q_AUDIO_FILL_BUFFER"); if (!filling) |