summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2006-11-06 14:24:18 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2006-11-06 14:24:18 +0000
commit0b22795e26ee09de14f6ac23219adeda12f2fd5b (patch)
treec1ccbda32170de48111a4b75e1f723ba953096bf /apps
parente543901777843a1734474aba7aa5d96cf61708ab (diff)
downloadrockbox-0b22795e26ee09de14f6ac23219adeda12f2fd5b.tar.gz
rockbox-0b22795e26ee09de14f6ac23219adeda12f2fd5b.zip
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.c2
-rw-r--r--apps/playback.c48
2 files changed, 42 insertions, 8 deletions
diff --git a/apps/main.c b/apps/main.c
index 4249fd0b8b..c4ee45cb89 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 6d277f7153..f8372665a4 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)