mp3 playback "engine" now in plugin API, rocks can make sound


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4285 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/plugin.c b/apps/plugin.c
index e91cba0..e010ebe 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -34,6 +34,9 @@
 #include "lang.h"
 #include "keyboard.h"
 #include "mpeg.h"
+#include "buffer.h"
+#include "mp3_playback.h"
+#include "backlight.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "widgets.h"
@@ -58,6 +61,7 @@
 static unsigned char pluginbuf[PLUGIN_BUFFER_SIZE];
 #else
 extern unsigned char pluginbuf[];
+extern void bitswap(unsigned char *data, int length);
 #endif
 
 static bool plugin_loaded = false;
@@ -163,6 +167,19 @@
     lcd_blit,
 #endif
     yield,
+
+    plugin_get_mp3_buffer,
+    mpeg_sound_set,
+#ifndef SIMULATOR
+    mp3_play_init,
+    mp3_play_data,
+    mp3_play_pause,
+    mp3_play_stop,
+    mp3_is_playing,
+    bitswap,
+#endif
+    &global_settings,
+    backlight_set_timeout,
 };
 
 int plugin_load(char* plugin, void* parameter)
@@ -294,6 +311,21 @@
     return &pluginbuf[buffer_pos];
 }
 
+/* Returns a pointer to the mp3 buffer. 
+   Playback gets stopped, to avoid conflicts. */
+void* plugin_get_mp3_buffer(int* buffer_size)
+{
+#ifdef SIMULATOR
+    static unsigned char buf[1700*1024];
+    *buffer_size = sizeof(buf);
+    return buf;
+#else
+    mpeg_stop();
+    *buffer_size = mp3end - mp3buf;
+    return mp3buf;
+#endif 
+}
+
 static int plugin_test(int api_version, int model, int memsize)
 {
     if (api_version < PLUGIN_MIN_API_VERSION ||
diff --git a/apps/plugin.h b/apps/plugin.h
index b46d9a7..be08091 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -41,9 +41,11 @@
 #include "lcd.h"
 #include "id3.h"
 #include "mpeg.h"
+#include "mp3_playback.h"
+#include "settings.h"
 
 /* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 9
+#define PLUGIN_API_VERSION 10
 
 /* update this to latest version if a change to the api struct breaks
    backwards compatibility */
@@ -181,18 +183,33 @@
     int (*atoi)(const char *str);
     struct tm* (*get_time)(void);
     void* (*plugin_get_buffer)(int* buffer_size);
-    /* new stuff */
+
+    /* new stuff, sort in next time the API gets broken! */
 #ifndef HAVE_LCD_CHARCELLS
     unsigned char* lcd_framebuffer;
     /* performance function */
     void (*lcd_blit) (unsigned char* p_data, int x, int y, int width, int height, int stride);
 #endif
     void (*yield)(void);
+
+    void* (*plugin_get_mp3_buffer)(int* buffer_size);
+    void (*mpeg_sound_set)(int setting, int value);
+#ifndef SIMULATOR
+    void (*mp3_play_init)(void);
+    void (*mp3_play_data)(unsigned char* start, int size, void (*get_more)(unsigned char** start, int* size));
+    void (*mp3_play_pause)(bool play);
+    void (*mp3_play_stop)(void);
+    bool (*mp3_is_playing)(void);
+    void (*bitswap)(unsigned char *data, int length);
+#endif
+    struct user_settings* global_settings;
+    void (*backlight_set_timeout)(unsigned int index);
 };
 
 /* defined by the plugin loader (plugin.c) */
 int plugin_load(char* plugin, void* parameter);
 void* plugin_get_buffer(int *buffer_size);
+void* plugin_get_mp3_buffer(int *buffer_size);
 
 /* defined by the plugin */
 enum plugin_status plugin_start(struct plugin_api* rockbox, void* parameter)
diff --git a/firmware/export/mp3_playback.h b/firmware/export/mp3_playback.h
index 3c190f2..15f5347 100644
--- a/firmware/export/mp3_playback.h
+++ b/firmware/export/mp3_playback.h
@@ -46,7 +46,7 @@
 void demand_irq_enable(bool on);
 #endif
 
-/* new functions, to be exported to plugin API */
+/* new functions, exported to plugin API */
 void mp3_play_init(void);
 void mp3_play_data(unsigned char* start, int size,
     void (*get_more)(unsigned char** start, int* size) /* callback fn */
@@ -55,6 +55,7 @@
 void mp3_play_stop(void);
 long mp3_get_playtime(void);
 void mp3_reset_playtime(void);
+bool mp3_is_playing(void);
 
 
 #define SOUND_VOLUME 0
diff --git a/firmware/mp3_playback.c b/firmware/mp3_playback.c
index fe16676..422a0e6 100644
--- a/firmware/mp3_playback.c
+++ b/firmware/mp3_playback.c
@@ -1086,4 +1086,10 @@
     playstart_tick = current_tick;
 }
 
+
+bool mp3_is_playing(void)
+{
+    return playing;
+}
+
 #endif /* #ifndef SIMULATOR */