diff options
author | Dave Chapman <dave@dchapman.com> | 2005-02-19 12:11:18 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2005-02-19 12:11:18 +0000 |
commit | 4d961f21285de89360173ccc76ee82eb504d726e (patch) | |
tree | e41a8acd5f2879abd572de666bec36b8266e6a47 /apps/plugins | |
parent | 1839a956ba67fc601706bfd9d5f46a22c60bfc70 (diff) |
First version of vorbis decoder
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6017 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins')
-rw-r--r-- | apps/plugins/Makefile | 2 | ||||
-rw-r--r-- | apps/plugins/SOURCES | 1 | ||||
-rw-r--r-- | apps/plugins/lib/xxx2wav.c | 14 | ||||
-rw-r--r-- | apps/plugins/lib/xxx2wav.h | 9 | ||||
-rw-r--r-- | apps/plugins/viewers.config | 1 | ||||
-rw-r--r-- | apps/plugins/vorbis2wav.c | 159 |
6 files changed, 185 insertions, 1 deletions
diff --git a/apps/plugins/Makefile b/apps/plugins/Makefile index 1ecf3809fe..9549959bbd 100644 --- a/apps/plugins/Makefile +++ b/apps/plugins/Makefile @@ -17,7 +17,7 @@ ifdef APPEXTRA endif ifdef SOFTWARECODECS - CODECLIBS = -lmad -la52 -lFLAC + CODECLIBS = -lmad -la52 -lFLAC -lTremor endif LDS := plugin.lds diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index abdc10453f..d29bd3cb32 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -67,4 +67,5 @@ alpine_cdc.c mpa2wav.c a52towav.c flac2wav.c +vorbis2wav.c #endif diff --git a/apps/plugins/lib/xxx2wav.c b/apps/plugins/lib/xxx2wav.c index cc8c31a11e..052de9ad37 100644 --- a/apps/plugins/lib/xxx2wav.c +++ b/apps/plugins/lib/xxx2wav.c @@ -53,6 +53,12 @@ void* calloc(size_t nmemb, size_t size) { return(x); } +void* alloca(size_t size) { + void* x; + x=malloc(size); + return(x); +} + void free(void* ptr) { (void)ptr; } @@ -76,6 +82,14 @@ int memcmp(const void *s1, const void *s2, size_t n) { return(local_rb->memcmp(s1,s2,n)); } +void* memchr(const void *s, int c, size_t n) { + /* TO DO: Implement for Tremor */ + (void)s; + (void)c; + (void)n; + return(NULL); +} + void* memmove(const void *s1, const void *s2, size_t n) { char* dest=(char*)s1; char* src=(char*)s2; diff --git a/apps/plugins/lib/xxx2wav.h b/apps/plugins/lib/xxx2wav.h index e89361c46a..501aaa3933 100644 --- a/apps/plugins/lib/xxx2wav.h +++ b/apps/plugins/lib/xxx2wav.h @@ -19,6 +19,15 @@ /* Various "helper functions" common to all the xxx2wav decoder plugins */ + +/* A macro to enable printf for the simulator only */ + +#ifdef SIMULATOR +#define dprintf(...) printf(__VA_ARGS__) +#else +#define dprintf(...) +#endif + /* the main data structure of the program */ typedef struct { int infile; diff --git a/apps/plugins/viewers.config b/apps/plugins/viewers.config index d22e53dba0..aa25d6fe81 100644 --- a/apps/plugins/viewers.config +++ b/apps/plugins/viewers.config @@ -11,3 +11,4 @@ mp3,mpa2wav.rock, 00 00 00 00 00 00 ac3,a52towav.rock, 00 00 00 00 00 00 a52,a52towav.rock, 00 00 00 00 00 00 flac,flac2wav.rock, 00 00 00 00 00 00 +ogg,vorbis2wav.rock, 00 00 00 00 00 00 diff --git a/apps/plugins/vorbis2wav.c b/apps/plugins/vorbis2wav.c new file mode 100644 index 0000000000..3b5de72c74 --- /dev/null +++ b/apps/plugins/vorbis2wav.c @@ -0,0 +1,159 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 Björn Stenberg + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "plugin.h" + +#if (CONFIG_HWCODEC == MASNONE) +/* software codec platforms */ + +#include <codecs/Tremor/ivorbisfile.h> + +#include "lib/xxx2wav.h" /* Helper functions common to test decoders */ + +static struct plugin_api* rb; + +/* Some standard functions and variables needed by Tremor */ + +int errno; + +size_t strlen(const char *s) { + return(rb->strlen(s)); +} + +char *strcpy(char *dest, const char *src) { + return(rb->strcpy(dest,src)); +} + +char *strcat(char *dest, const char *src) { + return(rb->strcat(dest,src)); +} + +size_t read_handler(void *ptr, size_t size, size_t nmemb, void *datasource) { + size_t len; + file_info_struct *p = (file_info_struct *) datasource; + + if (p->curpos >= p->filesize) { + return 0; /* EOF */ + } + + len=nmemb*size; + if ((long)(p->curpos+len) > (long)p->filesize) { len=p->filesize-p->curpos; } + + rb->memcpy(ptr,&filebuf[p->curpos],len); + p->curpos+=len; + + return(len); +} + +int seek_handler(void *datasource, ogg_int64_t offset, int whence) { + /* We are not seekable at the moment */ + (void)datasource; + (void)offset; + (void)whence; + return -1; +} + +int close_handler(void *datasource) { + (void)datasource; + return 0; +} + +long tell_handler(void *datasource) { + file_info_struct *p = (file_info_struct *) datasource; + return p->curpos; +} + + +/* this is the plugin entry point */ +enum plugin_status plugin_start(struct plugin_api* api, void* file) +{ + ov_callbacks callbacks; + OggVorbis_File vf; + vorbis_info* vi; + + int error; + long n; + int current_section; + int eof; + static char pcmbuf[4096]; + + file_info_struct file_info; + + TEST_PLUGIN_API(api); + + /* if you are using a global api pointer, don't forget to copy it! + otherwise you will get lovely "I04: IllInstr" errors... :-) */ + rb = api; + + + /* This function sets up the buffers and reads the file into RAM */ + + if (local_init(file,"/vorbistest.wav",&file_info,api)) { + return PLUGIN_ERROR; + } + + /* Create a decoder instance */ + + callbacks.read_func=read_handler; + callbacks.seek_func=seek_handler; + callbacks.tell_func=tell_handler; + callbacks.close_func=close_handler; + + file_info.frames_decoded=0; + file_info.start_tick=*(rb->current_tick); + rb->button_clear_queue(); + + error=ov_open_callbacks(&file_info,&vf,NULL,0,callbacks); + + vi=ov_info(&vf,-1); + + if (vi==NULL) { + rb->splash(HZ*2, true, "Error"); + } + file_info.samplerate=vi->rate; + + eof=0; + while (!eof) { + /* Read host-endian signed 16 bit PCM samples */ + n=ov_read(&vf,pcmbuf,sizeof(pcmbuf),¤t_section); + + if (n==0) { + eof=1; + } else if (n < 0) { + dprintf("Error decoding frame\n"); + } else { + file_info.frames_decoded++; + rb->write(file_info.outfile,pcmbuf,n); + file_info.current_sample+=(n/4); + } + + display_status(&file_info); + + if (rb->button_get(false)!=BUTTON_NONE) { + close_wav(&file_info); + return PLUGIN_OK; + } + } + + close_wav(&file_info); + rb->splash(HZ*2, true, "FINISHED!"); + + return PLUGIN_OK; +} +#endif /* CONFIG_HWCODEC == MASNONE */ |