diff options
Diffstat (limited to 'apps/plugins/mpa2wav.c')
-rw-r--r-- | apps/plugins/mpa2wav.c | 269 |
1 files changed, 0 insertions, 269 deletions
diff --git a/apps/plugins/mpa2wav.c b/apps/plugins/mpa2wav.c deleted file mode 100644 index bf40fa3b81..0000000000 --- a/apps/plugins/mpa2wav.c +++ /dev/null @@ -1,269 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2005 Dave Chapman - * - * 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/libmad/mad.h> - -#include "lib/xxx2wav.h" /* Helper functions common to test decoders */ - -static struct plugin_api* rb; - -struct mad_stream Stream IDATA_ATTR; -struct mad_frame Frame IDATA_ATTR; -struct mad_synth Synth IDATA_ATTR; -mad_timer_t Timer; -struct dither d0, d1; - -/* The following function is used inside libmad - let's hope it's never - called. -*/ - -void abort(void) { -} - -/* The "dither" code to convert the 24-bit samples produced by libmad was - taken from the coolplayer project - coolplayer.sourceforge.net */ - -struct dither { - mad_fixed_t error[3]; - mad_fixed_t random; -}; - -# define SAMPLE_DEPTH 16 -# define scale(x, y) dither((x), (y)) - -/* - * NAME: prng() - * DESCRIPTION: 32-bit pseudo-random number generator - */ -static __inline -unsigned long prng(unsigned long state) -{ - return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL; -} - -/* - * NAME: dither() - * DESCRIPTION: dither and scale sample - */ -static __inline -signed int dither(mad_fixed_t sample, struct dither *dither) -{ - unsigned int scalebits; - mad_fixed_t output, mask, random; - - enum { - MIN = -MAD_F_ONE, - MAX = MAD_F_ONE - 1 - }; - - /* noise shape */ - sample += dither->error[0] - dither->error[1] + dither->error[2]; - - dither->error[2] = dither->error[1]; - dither->error[1] = dither->error[0] / 2; - - /* bias */ - output = sample + (1L << (MAD_F_FRACBITS + 1 - SAMPLE_DEPTH - 1)); - - scalebits = MAD_F_FRACBITS + 1 - SAMPLE_DEPTH; - mask = (1L << scalebits) - 1; - - /* dither */ - random = prng(dither->random); - output += (random & mask) - (dither->random & mask); - - dither->random = random; - - /* clip */ - if (output > MAX) { - output = MAX; - - if (sample > MAX) - sample = MAX; - } - else if (output < MIN) { - output = MIN; - - if (sample < MIN) - sample = MIN; - } - - /* quantize */ - output &= ~mask; - - /* error feedback */ - dither->error[0] = sample - output; - - /* scale */ - return output >> scalebits; -} - -#define SHRT_MAX 32767 - -#define INPUT_BUFFER_SIZE (10*8192) -#define OUTPUT_BUFFER_SIZE 65536 /* Must be an integer multiple of 4. */ - -unsigned char InputBuffer[INPUT_BUFFER_SIZE+MAD_BUFFER_GUARD]; -unsigned char OutputBuffer[OUTPUT_BUFFER_SIZE]; -unsigned char *OutputPtr=OutputBuffer; -unsigned char *GuardPtr=NULL; -const unsigned char *OutputBufferEnd=OutputBuffer+OUTPUT_BUFFER_SIZE; - -mad_fixed_t mad_frame_overlap[2][32][18] IDATA_ATTR; -unsigned char mad_main_data[MAD_BUFFER_MDLEN] IDATA_ATTR; - -#ifdef USE_IRAM -extern char iramcopy[]; -extern char iramstart[]; -extern char iramend[]; -#endif - -/* this is the plugin entry point */ -enum plugin_status plugin_start(struct plugin_api* api, void* file) -{ - file_info_struct file_info; - int Status=0; - unsigned short Sample; - int i; - - /* Generic plugin inititialisation */ - - TEST_PLUGIN_API(api); - rb = api; - -#ifdef USE_IRAM - rb->memcpy(iramstart, iramcopy, iramend-iramstart); -#endif - - /* This function sets up the buffers and reads the file into RAM */ - - if (local_init(file,"/libmadtest.wav",&file_info,api)) { - return PLUGIN_ERROR; - } - - /* Create a decoder instance */ - - mad_stream_init(&Stream); - mad_frame_init(&Frame); - mad_synth_init(&Synth); - mad_timer_reset(&Timer); - - /* We do this so libmad doesn't try to call codec_calloc() */ - memset(mad_frame_overlap, 0, sizeof(mad_frame_overlap)); - Frame.overlap = &mad_frame_overlap; - Stream.main_data = &mad_main_data; - - GuardPtr = &filebuf[file_info.filesize]; - memset(GuardPtr,0,MAD_BUFFER_GUARD); - mad_stream_buffer(&Stream, filebuf,file_info.filesize); - - file_info.curpos=0; - file_info.start_tick=*(rb->current_tick); - - rb->button_clear_queue(); - - /* This is the decoding loop. */ - while (file_info.curpos < file_info.filesize && - Stream.this_frame != GuardPtr && - Stream.error != MAD_ERROR_BUFLEN) { - file_info.curpos += (int)Stream.next_frame - (int)Stream.this_frame; - - if(mad_frame_decode(&Frame,&Stream)) - { - if(MAD_RECOVERABLE(Stream.error)) - { - if(Stream.error!=MAD_ERROR_LOSTSYNC || Stream.this_frame!=GuardPtr) - { - rb->splash(HZ*1, true, "Recoverable...!"); - } - continue; - } - else - if(Stream.error==MAD_ERROR_BUFLEN) - continue; - else - { - rb->splash(HZ*1, true, "Recoverable...!"); - //fprintf(stderr,"%s: unrecoverable frame level error.\n",ProgName); - Status=1; - break; - } - } - - /* We assume all frames have same samplerate as the first */ - if(file_info.frames_decoded==0) { - file_info.samplerate=Frame.header.samplerate; - } - - file_info.frames_decoded++; - - /* ?? Do we need the timer module? */ - mad_timer_add(&Timer,Frame.header.duration); - -/* DAVE: This can be used to attenuate the audio */ -// if(DoFilter) -// ApplyFilter(&Frame); - - mad_synth_frame(&Synth,&Frame); - - /* Convert MAD's numbers to an array of 16-bit LE signed integers */ - for(i=0;i<Synth.pcm.length;i++) - { - /* Left channel */ - Sample=scale(Synth.pcm.samples[0][i],&d0); - *(OutputPtr++)=Sample&0xff; - *(OutputPtr++)=Sample>>8; - - /* Right channel. If the decoded stream is monophonic then - * the right output channel is the same as the left one. - */ - if(MAD_NCHANNELS(&Frame.header)==2) - Sample=scale(Synth.pcm.samples[1][i],&d1); - *(OutputPtr++)=Sample&0xff; - *(OutputPtr++)=Sample>>8; - - /* Flush the buffer if it is full. */ - if(OutputPtr==OutputBufferEnd) - { - rb->write(file_info.outfile,OutputBuffer,OUTPUT_BUFFER_SIZE); - OutputPtr=OutputBuffer; - } - } - - file_info.current_sample+=Synth.pcm.length; - - 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 */ |