forked from len0rd/rockbox
removed old codec leftovers
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6919 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
fa9cea64b1
commit
1c56afad5d
9 changed files with 0 additions and 1574 deletions
|
@ -67,15 +67,6 @@ alpine_cdc.c
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_HWCODEC == MASNONE /* software codec platforms */
|
#if CONFIG_HWCODEC == MASNONE /* software codec platforms */
|
||||||
#if 0
|
|
||||||
mpa2wav.c
|
|
||||||
a52towav.c
|
|
||||||
flac2wav.c
|
|
||||||
vorbis2wav.c
|
|
||||||
wv2wav.c
|
|
||||||
mpc2wav.c
|
|
||||||
midi2wav.c
|
|
||||||
#endif
|
|
||||||
iriverify.c
|
iriverify.c
|
||||||
#else
|
#else
|
||||||
splitedit.c
|
splitedit.c
|
||||||
|
|
|
@ -1,217 +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 <inttypes.h> /* Needed by a52.h */
|
|
||||||
|
|
||||||
#include <codecs/liba52/config-a52.h>
|
|
||||||
#include <codecs/liba52/a52.h>
|
|
||||||
|
|
||||||
#include "lib/xxx2wav.h" /* Helper functions common to test decoders */
|
|
||||||
|
|
||||||
static struct plugin_api* rb;
|
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
#define LE_S16(x) ( (uint16_t) ( ((uint16_t)(x) >> 8) | ((uint16_t)(x) << 8) ) )
|
|
||||||
#else
|
|
||||||
#define LE_S16(x) (x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static float gain = 1;
|
|
||||||
static a52_state_t * state;
|
|
||||||
|
|
||||||
static inline int16_t convert (int32_t i)
|
|
||||||
{
|
|
||||||
i >>= 15;
|
|
||||||
return (i > 32767) ? 32767 : ((i < -32768) ? -32768 : i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ao_play(file_info_struct* file_info,sample_t* samples,int flags) {
|
|
||||||
int i;
|
|
||||||
static int16_t int16_samples[256*2];
|
|
||||||
|
|
||||||
flags &= A52_CHANNEL_MASK | A52_LFE;
|
|
||||||
|
|
||||||
if (flags==A52_STEREO) {
|
|
||||||
for (i = 0; i < 256; i++) {
|
|
||||||
int16_samples[2*i] = LE_S16(convert (samples[i]));
|
|
||||||
int16_samples[2*i+1] = LE_S16(convert (samples[i+256]));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DEBUGF("ERROR: unsupported format: %d\n",flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIX: Buffer the disk write to write larger amounts at one */
|
|
||||||
i=rb->write(file_info->outfile,int16_samples,256*2*2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void a52_decode_data (file_info_struct* file_info, uint8_t * start, uint8_t * end)
|
|
||||||
{
|
|
||||||
static uint8_t buf[3840];
|
|
||||||
static uint8_t * bufptr = buf;
|
|
||||||
static uint8_t * bufpos = buf + 7;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sample_rate and flags are static because this routine could
|
|
||||||
* exit between the a52_syncinfo() and the ao_setup(), and we want
|
|
||||||
* to have the same values when we get back !
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int sample_rate;
|
|
||||||
static int flags;
|
|
||||||
int bit_rate;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
len = end - start;
|
|
||||||
if (!len)
|
|
||||||
break;
|
|
||||||
if (len > bufpos - bufptr)
|
|
||||||
len = bufpos - bufptr;
|
|
||||||
memcpy (bufptr, start, len);
|
|
||||||
bufptr += len;
|
|
||||||
start += len;
|
|
||||||
if (bufptr == bufpos) {
|
|
||||||
if (bufpos == buf + 7) {
|
|
||||||
int length;
|
|
||||||
|
|
||||||
length = a52_syncinfo (buf, &flags, &sample_rate, &bit_rate);
|
|
||||||
if (!length) {
|
|
||||||
DEBUGF("skip\n");
|
|
||||||
for (bufptr = buf; bufptr < buf + 6; bufptr++)
|
|
||||||
bufptr[0] = bufptr[1];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
bufpos = buf + length;
|
|
||||||
} else {
|
|
||||||
// The following two defaults are taken from audio_out_oss.c:
|
|
||||||
level_t level;
|
|
||||||
sample_t bias;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* This is the configuration for the downmixing: */
|
|
||||||
flags=A52_STEREO|A52_ADJUST_LEVEL|A52_LFE;
|
|
||||||
level=(1 << 26);
|
|
||||||
bias=0;
|
|
||||||
|
|
||||||
level = (level_t) (level * gain);
|
|
||||||
|
|
||||||
if (a52_frame (state, buf, &flags, &level, bias))
|
|
||||||
goto error;
|
|
||||||
file_info->frames_decoded++;
|
|
||||||
|
|
||||||
/* We assume this never changes */
|
|
||||||
file_info->samplerate=sample_rate;
|
|
||||||
|
|
||||||
// An A52 frame consists of 6 blocks of 256 samples
|
|
||||||
// So we decode and output them one block at a time
|
|
||||||
for (i = 0; i < 6; i++) {
|
|
||||||
if (a52_block (state)) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
ao_play (file_info, a52_samples (state),flags);
|
|
||||||
file_info->current_sample+=256;
|
|
||||||
}
|
|
||||||
bufptr = buf;
|
|
||||||
bufpos = buf + 7;
|
|
||||||
continue;
|
|
||||||
error:
|
|
||||||
DEBUGF("error\n");
|
|
||||||
bufptr = buf;
|
|
||||||
bufpos = buf + 7;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define BUFFER_SIZE 4096
|
|
||||||
|
|
||||||
#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;
|
|
||||||
|
|
||||||
/* Generic plugin initialisation */
|
|
||||||
|
|
||||||
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,"/ac3test.wav",&file_info,api)) {
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Intialise the A52 decoder and check for success */
|
|
||||||
state = a52_init (0); // Parameter is "accel"
|
|
||||||
|
|
||||||
if (state == NULL) {
|
|
||||||
rb->splash(HZ*2, true, "a52_init failed");
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The main decoding loop */
|
|
||||||
|
|
||||||
file_info.start_tick=*(rb->current_tick);
|
|
||||||
rb->button_clear_queue();
|
|
||||||
|
|
||||||
while (file_info.curpos < file_info.filesize) {
|
|
||||||
|
|
||||||
if ((file_info.curpos+BUFFER_SIZE) < file_info.filesize) {
|
|
||||||
a52_decode_data(&file_info,&filebuf[file_info.curpos],&filebuf[file_info.curpos+BUFFER_SIZE]);
|
|
||||||
file_info.curpos+=BUFFER_SIZE;
|
|
||||||
} else {
|
|
||||||
a52_decode_data(&file_info,&filebuf[file_info.curpos],&filebuf[file_info.filesize-1]);
|
|
||||||
file_info.curpos=file_info.filesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
display_status(&file_info);
|
|
||||||
|
|
||||||
if (rb->button_get(false)!=BUTTON_NONE) {
|
|
||||||
close_wav(&file_info);
|
|
||||||
return PLUGIN_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close_wav(&file_info);
|
|
||||||
|
|
||||||
/* Cleanly close and exit */
|
|
||||||
|
|
||||||
//NOT NEEDED: a52_free (state);
|
|
||||||
|
|
||||||
rb->splash(HZ*2, true, "FINISHED!");
|
|
||||||
return PLUGIN_OK;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_HWCODEC == MASNONE */
|
|
|
@ -1,237 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* __________ __ ___.
|
|
||||||
* 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/libFLAC/include/FLAC/seekable_stream_decoder.h>
|
|
||||||
|
|
||||||
#include "lib/xxx2wav.h" /* Helper functions common to test decoders */
|
|
||||||
|
|
||||||
#define FLAC_MAX_SUPPORTED_BLOCKSIZE 4608
|
|
||||||
#define FLAC_MAX_SUPPORTED_CHANNELS 2
|
|
||||||
|
|
||||||
static struct plugin_api* rb;
|
|
||||||
|
|
||||||
/* Called when the FLAC decoder needs some FLAC data to decode */
|
|
||||||
FLAC__SeekableStreamDecoderReadStatus flac_read_handler(const FLAC__SeekableStreamDecoder *dec,
|
|
||||||
FLAC__byte buffer[], unsigned *bytes, void *data)
|
|
||||||
{ (void)dec;
|
|
||||||
|
|
||||||
file_info_struct *p = (file_info_struct *) data;
|
|
||||||
|
|
||||||
if (p->curpos >= p->filesize) {
|
|
||||||
return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
rb->memcpy(buffer,&filebuf[p->curpos],*bytes);
|
|
||||||
p->curpos+=*bytes;
|
|
||||||
|
|
||||||
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called when the FLAC decoder has some decoded PCM data to write */
|
|
||||||
FLAC__StreamDecoderWriteStatus flac_write_handler(const FLAC__SeekableStreamDecoder *dec,
|
|
||||||
const FLAC__Frame *frame,
|
|
||||||
const FLAC__int32 * const buf[],
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
unsigned int c_samp, c_chan, d_samp;
|
|
||||||
file_info_struct *p = (file_info_struct *) data;
|
|
||||||
uint32_t data_size = frame->header.blocksize * frame->header.channels * (p->bitspersample / 8);
|
|
||||||
uint32_t samples = frame->header.blocksize;
|
|
||||||
|
|
||||||
// FIXME: This should not be on the stack!
|
|
||||||
static unsigned char ldb[FLAC_MAX_SUPPORTED_BLOCKSIZE*FLAC_MAX_SUPPORTED_CHANNELS*2];
|
|
||||||
|
|
||||||
if (samples*frame->header.channels > (FLAC_MAX_SUPPORTED_BLOCKSIZE*FLAC_MAX_SUPPORTED_CHANNELS)) {
|
|
||||||
// ERROR!!!
|
|
||||||
DEBUGF("ERROR: samples*frame->header.channels=%d\n",samples*frame->header.channels);
|
|
||||||
return(FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void)dec;
|
|
||||||
(void)data_size;
|
|
||||||
for(c_samp = d_samp = 0; c_samp < samples; c_samp++) {
|
|
||||||
for(c_chan = 0; c_chan < frame->header.channels; c_chan++, d_samp++) {
|
|
||||||
ldb[d_samp*2] = buf[c_chan][c_samp]&0xff;
|
|
||||||
ldb[(d_samp*2)+1] = (buf[c_chan][c_samp]&0xff00)>>8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rb->write(p->outfile,ldb,data_size);
|
|
||||||
|
|
||||||
p->current_sample += samples;
|
|
||||||
|
|
||||||
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void flac_metadata_handler(const FLAC__SeekableStreamDecoder *dec,
|
|
||||||
const FLAC__StreamMetadata *meta, void *data)
|
|
||||||
{
|
|
||||||
file_info_struct *p = (file_info_struct *) data;
|
|
||||||
(void)dec;
|
|
||||||
|
|
||||||
if(meta->type == FLAC__METADATA_TYPE_STREAMINFO) {
|
|
||||||
p->bitspersample = meta->data.stream_info.bits_per_sample;
|
|
||||||
p->samplerate = meta->data.stream_info.sample_rate;
|
|
||||||
p->channels = meta->data.stream_info.channels;
|
|
||||||
// FLAC__ASSERT(meta->data.stream_info.total_samples < 0x100000000); /* we can handle < 4 gigasamples */
|
|
||||||
p->total_samples = (unsigned)
|
|
||||||
(meta->data.stream_info.total_samples & 0xffffffff);
|
|
||||||
p->current_sample = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void flac_error_handler(const FLAC__SeekableStreamDecoder *dec,
|
|
||||||
FLAC__StreamDecoderErrorStatus status, void *data)
|
|
||||||
{
|
|
||||||
(void)dec;
|
|
||||||
(void)status;
|
|
||||||
(void)data;
|
|
||||||
}
|
|
||||||
|
|
||||||
FLAC__SeekableStreamDecoderSeekStatus flac_seek_handler (const FLAC__SeekableStreamDecoder *decoder,
|
|
||||||
FLAC__uint64 absolute_byte_offset,
|
|
||||||
void *client_data)
|
|
||||||
{
|
|
||||||
(void)decoder;
|
|
||||||
file_info_struct *p = (file_info_struct *) client_data;
|
|
||||||
rb->lseek(p->infile,SEEK_SET,absolute_byte_offset);
|
|
||||||
return(FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
FLAC__SeekableStreamDecoderTellStatus flac_tell_handler (const FLAC__SeekableStreamDecoder *decoder,
|
|
||||||
FLAC__uint64 *absolute_byte_offset, void *client_data)
|
|
||||||
{
|
|
||||||
file_info_struct *p = (file_info_struct *) client_data;
|
|
||||||
|
|
||||||
(void)decoder;
|
|
||||||
*absolute_byte_offset=rb->lseek(p->infile,SEEK_CUR,0);
|
|
||||||
return(FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
FLAC__SeekableStreamDecoderLengthStatus flac_length_handler (const FLAC__SeekableStreamDecoder *decoder,
|
|
||||||
FLAC__uint64 *stream_length, void *client_data)
|
|
||||||
{
|
|
||||||
file_info_struct *p = (file_info_struct *) client_data;
|
|
||||||
|
|
||||||
(void)decoder;
|
|
||||||
*stream_length=p->filesize;
|
|
||||||
return(FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
FLAC__bool flac_eof_handler (const FLAC__SeekableStreamDecoder *decoder,
|
|
||||||
void *client_data)
|
|
||||||
{
|
|
||||||
file_info_struct *p = (file_info_struct *) client_data;
|
|
||||||
|
|
||||||
(void)decoder;
|
|
||||||
if (p->curpos >= p->filesize) {
|
|
||||||
return(true);
|
|
||||||
} else {
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef SIMULATOR
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
FLAC__SeekableStreamDecoder* flacDecoder;
|
|
||||||
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;
|
|
||||||
|
|
||||||
#ifndef SIMULATOR
|
|
||||||
rb->memcpy(iramstart, iramcopy, iramend-iramstart);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This function sets up the buffers and reads the file into RAM */
|
|
||||||
|
|
||||||
if (local_init(file,"/flactest.wav",&file_info,api)) {
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a decoder instance */
|
|
||||||
|
|
||||||
flacDecoder=FLAC__seekable_stream_decoder_new();
|
|
||||||
|
|
||||||
/* Set up the decoder and the callback functions - this must be done before init */
|
|
||||||
|
|
||||||
/* The following are required for stream_decoder and higher */
|
|
||||||
FLAC__seekable_stream_decoder_set_client_data(flacDecoder,&file_info);
|
|
||||||
FLAC__seekable_stream_decoder_set_write_callback(flacDecoder, flac_write_handler);
|
|
||||||
FLAC__seekable_stream_decoder_set_read_callback(flacDecoder, flac_read_handler);
|
|
||||||
FLAC__seekable_stream_decoder_set_metadata_callback(flacDecoder, flac_metadata_handler);
|
|
||||||
FLAC__seekable_stream_decoder_set_error_callback(flacDecoder, flac_error_handler);
|
|
||||||
FLAC__seekable_stream_decoder_set_metadata_respond(flacDecoder, FLAC__METADATA_TYPE_STREAMINFO);
|
|
||||||
|
|
||||||
/* The following are only for the seekable_stream_decoder */
|
|
||||||
FLAC__seekable_stream_decoder_set_seek_callback(flacDecoder, flac_seek_handler);
|
|
||||||
FLAC__seekable_stream_decoder_set_tell_callback(flacDecoder, flac_tell_handler);
|
|
||||||
FLAC__seekable_stream_decoder_set_length_callback(flacDecoder, flac_length_handler);
|
|
||||||
FLAC__seekable_stream_decoder_set_eof_callback(flacDecoder, flac_eof_handler);
|
|
||||||
|
|
||||||
if (FLAC__seekable_stream_decoder_init(flacDecoder)) {
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The first thing to do is to parse the metadata */
|
|
||||||
FLAC__seekable_stream_decoder_process_until_end_of_metadata(flacDecoder);
|
|
||||||
|
|
||||||
file_info.frames_decoded=0;
|
|
||||||
file_info.start_tick=*(rb->current_tick);
|
|
||||||
rb->button_clear_queue();
|
|
||||||
|
|
||||||
while (FLAC__seekable_stream_decoder_get_state(flacDecoder)!=2) {
|
|
||||||
FLAC__seekable_stream_decoder_process_single(flacDecoder);
|
|
||||||
file_info.frames_decoded++;
|
|
||||||
|
|
||||||
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!");
|
|
||||||
|
|
||||||
/* Flush internal buffers etc */
|
|
||||||
//No need for this. flacResult=FLAC__seekable_stream_decoder_reset(flacDecoder);
|
|
||||||
|
|
||||||
// audio_close();
|
|
||||||
|
|
||||||
return PLUGIN_OK;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_HWCODEC == MASNONE */
|
|
|
@ -34,8 +34,3 @@ gray_verline.c
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
#ifdef HAVE_LCD_CHARCELLS
|
||||||
playergfx.c
|
playergfx.c
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
|
||||||
#if CONFIG_HWCODEC == MASNONE /* software codec platforms */
|
|
||||||
xxx2wav.c
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,232 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* __________ __ ___.
|
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
||||||
* \/ \/ \/ \/ \/
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 Stepan Moskovchenko
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#define SAMPLE_RATE 22050
|
|
||||||
#define MAX_VOICES 100
|
|
||||||
|
|
||||||
|
|
||||||
/* Only define LOCAL_DSP on Simulator or else we're asking for trouble */
|
|
||||||
#if defined(SIMULATOR)
|
|
||||||
/*Enable this to write to the soundcard via a /dsv/dsp symlink in */
|
|
||||||
// #define LOCAL_DSP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(LOCAL_DSP)
|
|
||||||
/* This is for writing to the DSP directly from the Simulator */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <linux/soundcard.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../../firmware/export/system.h"
|
|
||||||
|
|
||||||
#include "../../plugin.h"
|
|
||||||
|
|
||||||
#include "lib/xxx2wav.h"
|
|
||||||
|
|
||||||
int numberOfSamples IDATA_ATTR;
|
|
||||||
long bpm;
|
|
||||||
|
|
||||||
#include "midi/midiutil.c"
|
|
||||||
#include "midi/guspat.h"
|
|
||||||
#include "midi/guspat.c"
|
|
||||||
#include "midi/sequencer.c"
|
|
||||||
#include "midi/midifile.c"
|
|
||||||
#include "midi/synth.c"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int fd=-1; /* File descriptor where the output is written */
|
|
||||||
|
|
||||||
extern long tempo; /* The sequencer keeps track of this */
|
|
||||||
|
|
||||||
|
|
||||||
struct plugin_api * rb;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
|
||||||
{
|
|
||||||
TEST_PLUGIN_API(api);
|
|
||||||
rb = api;
|
|
||||||
TEST_PLUGIN_API(api);
|
|
||||||
(void)parameter;
|
|
||||||
rb = api;
|
|
||||||
|
|
||||||
if(parameter == NULL)
|
|
||||||
{
|
|
||||||
rb->splash(HZ*2, true, " Play .MID file ");
|
|
||||||
return PLUGIN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
rb->splash(HZ, true, parameter);
|
|
||||||
if(midimain(parameter) == -1)
|
|
||||||
{
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
rb->splash(HZ*3, true, "FINISHED PLAYING");
|
|
||||||
return PLUGIN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
signed char outputBuffer[3000] IDATA_ATTR; /* signed char.. gonna run out of iram ... ! */
|
|
||||||
|
|
||||||
|
|
||||||
int currentSample IDATA_ATTR;
|
|
||||||
int outputBufferPosition IDATA_ATTR;
|
|
||||||
int outputSampleOne IDATA_ATTR;
|
|
||||||
int outputSampleTwo IDATA_ATTR;
|
|
||||||
|
|
||||||
|
|
||||||
int midimain(void * filename)
|
|
||||||
{
|
|
||||||
|
|
||||||
printf("\nHello.\n");
|
|
||||||
|
|
||||||
rb->splash(HZ/5, true, "LOADING MIDI");
|
|
||||||
|
|
||||||
struct MIDIfile * mf = loadFile(filename);
|
|
||||||
|
|
||||||
rb->splash(HZ/5, true, "LOADING PATCHES");
|
|
||||||
if (initSynth(mf, "/.rockbox/patchset/patchset.cfg", "/.rockbox/patchset/drums.cfg") == -1)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This lets you hear the music through the sound card if you are on Simulator
|
|
||||||
* Make a symlink, archos/dsp.raw and make it point to /dev/dsp or whatever
|
|
||||||
* your sound device is.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(LOCAL_DSP)
|
|
||||||
fd=rb->open("/dsp.raw", O_WRONLY);
|
|
||||||
int arg, status;
|
|
||||||
int bit, samp, ch;
|
|
||||||
|
|
||||||
arg = 16; /* sample size */
|
|
||||||
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
|
|
||||||
status = ioctl(fd, SOUND_PCM_READ_BITS, &arg);
|
|
||||||
bit=arg;
|
|
||||||
|
|
||||||
|
|
||||||
arg = 2; /* Number of channels, 1=mono */
|
|
||||||
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
|
|
||||||
status = ioctl(fd, SOUND_PCM_READ_CHANNELS, &arg);
|
|
||||||
ch=arg;
|
|
||||||
|
|
||||||
arg = SAMPLE_RATE; /* Yeah. sampling rate */
|
|
||||||
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
|
|
||||||
status = ioctl(fd, SOUND_PCM_READ_RATE, &arg);
|
|
||||||
samp=arg;
|
|
||||||
#else
|
|
||||||
file_info_struct file_info;
|
|
||||||
file_info.samplerate = SAMPLE_RATE;
|
|
||||||
file_info.infile = fd;
|
|
||||||
file_info.channels = 2;
|
|
||||||
file_info.bitspersample = 16;
|
|
||||||
local_init("/miditest.tmp", "/miditest.wav", &file_info, rb);
|
|
||||||
fd = file_info.outfile;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
rb->splash(HZ/5, true, " I hope this works... ");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* tick() will do one MIDI clock tick. Then, there's a loop here that
|
|
||||||
* will generate the right number of samples per MIDI tick. The whole
|
|
||||||
* MIDI playback is timed in terms of this value.. there are no forced
|
|
||||||
* delays or anything. It just produces enough samples for each tick, and
|
|
||||||
* the playback of these samples is what makes the timings right.
|
|
||||||
*
|
|
||||||
* This seems to work quite well.
|
|
||||||
*/
|
|
||||||
|
|
||||||
printf("\nOkay, starting sequencing");
|
|
||||||
|
|
||||||
|
|
||||||
currentSample=0; /* Sample counting variable */
|
|
||||||
outputBufferPosition = 0;
|
|
||||||
|
|
||||||
|
|
||||||
bpm=mf->div*1000000/tempo;
|
|
||||||
numberOfSamples=SAMPLE_RATE/bpm;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Tick() will return 0 if there are no more events left to play */
|
|
||||||
while(tick(mf))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Tempo recalculation moved to sequencer.c to be done on a tempo event only
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
for(currentSample=0; currentSample<numberOfSamples; currentSample++)
|
|
||||||
{
|
|
||||||
|
|
||||||
synthSample(&outputSampleOne, &outputSampleTwo);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 16-bit audio because, well, it's better
|
|
||||||
* But really because ALSA's OSS emulation sounds extremely
|
|
||||||
* noisy and distorted when in 8-bit mode. I still do not know
|
|
||||||
* why this happens.
|
|
||||||
*/
|
|
||||||
|
|
||||||
outputBuffer[outputBufferPosition]=outputSampleOne&0XFF; // Low byte first
|
|
||||||
outputBufferPosition++;
|
|
||||||
outputBuffer[outputBufferPosition]=outputSampleOne>>8; //High byte second
|
|
||||||
outputBufferPosition++;
|
|
||||||
|
|
||||||
outputBuffer[outputBufferPosition]=outputSampleTwo&0XFF; // Low byte first
|
|
||||||
outputBufferPosition++;
|
|
||||||
outputBuffer[outputBufferPosition]=outputSampleTwo>>8; //High byte second
|
|
||||||
outputBufferPosition++;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* As soon as we produce 2000 bytes of sound,
|
|
||||||
* write it to the sound card. Why 2000? I have
|
|
||||||
* no idea. It's 1 AM and I am dead tired.
|
|
||||||
*/
|
|
||||||
if(outputBufferPosition>=2000)
|
|
||||||
{
|
|
||||||
rb->write(fd, outputBuffer, 2000);
|
|
||||||
outputBufferPosition=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
#if !defined(LOCAL_DSP)
|
|
||||||
|
|
||||||
close_wav(&file_info);
|
|
||||||
#else
|
|
||||||
rb->close(fd);
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -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 */
|
|
|
@ -1,208 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* __________ __ ___.
|
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
||||||
* \/ \/ \/ \/ \/
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 Thom Johansen
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* This is a lovely mishmash of sample.c from libmusepack and mpa2wav.c,
|
|
||||||
* but happens to work, so no whining!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "plugin.h"
|
|
||||||
|
|
||||||
#if (CONFIG_HWCODEC == MASNONE)
|
|
||||||
/* software codec platforms */
|
|
||||||
|
|
||||||
#include <codecs/libmusepack/musepack.h>
|
|
||||||
|
|
||||||
#include "lib/xxx2wav.h" /* Helper functions common to test decoders */
|
|
||||||
|
|
||||||
static struct plugin_api* rb;
|
|
||||||
mpc_decoder decoder;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Our implementations of the mpc_reader callback functions.
|
|
||||||
*/
|
|
||||||
mpc_int32_t
|
|
||||||
read_impl(void *data, void *ptr, mpc_int32_t size)
|
|
||||||
{
|
|
||||||
file_info_struct *f = (file_info_struct *)data;
|
|
||||||
mpc_int32_t num = f->filesize - f->curpos;
|
|
||||||
if (num > size)
|
|
||||||
num = size;
|
|
||||||
rb->memcpy(ptr, filebuf + f->curpos, num);
|
|
||||||
f->curpos += num;
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
seek_impl(void *data, mpc_int32_t offset)
|
|
||||||
{
|
|
||||||
file_info_struct *f = (file_info_struct *)data;
|
|
||||||
if (offset > f->filesize) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
f->curpos = offset;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mpc_int32_t
|
|
||||||
tell_impl(void *data)
|
|
||||||
{
|
|
||||||
file_info_struct *f = (file_info_struct *)data;
|
|
||||||
return f->curpos;
|
|
||||||
}
|
|
||||||
|
|
||||||
mpc_int32_t
|
|
||||||
get_size_impl(void *data)
|
|
||||||
{
|
|
||||||
file_info_struct *f = (file_info_struct *)data;
|
|
||||||
return f->filesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
canseek_impl(void *data)
|
|
||||||
{
|
|
||||||
(void)data;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
shift_signed(MPC_SAMPLE_FORMAT val, int shift)
|
|
||||||
{
|
|
||||||
if (shift > 0)
|
|
||||||
val <<= shift;
|
|
||||||
else if (shift < 0)
|
|
||||||
val >>= -shift;
|
|
||||||
return (int)val;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define OUTPUT_BUFFER_SIZE 65536 /* Must be an integer multiple of 4. */
|
|
||||||
|
|
||||||
unsigned char OutputBuffer[OUTPUT_BUFFER_SIZE];
|
|
||||||
MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH];
|
|
||||||
unsigned char *OutputPtr=OutputBuffer;
|
|
||||||
const unsigned char *OutputBufferEnd=OutputBuffer+OUTPUT_BUFFER_SIZE;
|
|
||||||
|
|
||||||
#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;
|
|
||||||
unsigned short Sample;
|
|
||||||
unsigned status = 1;
|
|
||||||
unsigned int i;
|
|
||||||
mpc_reader reader;
|
|
||||||
|
|
||||||
/* Generic plugin inititialisation */
|
|
||||||
|
|
||||||
TEST_PLUGIN_API(api);
|
|
||||||
rb = api;
|
|
||||||
|
|
||||||
#ifdef USE_IRAM
|
|
||||||
rb->memcpy(iramstart, iramcopy, iramend-iramstart);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
reader.read = read_impl;
|
|
||||||
reader.seek = seek_impl;
|
|
||||||
reader.tell = tell_impl;
|
|
||||||
reader.get_size = get_size_impl;
|
|
||||||
reader.canseek = canseek_impl;
|
|
||||||
reader.data = &file_info;
|
|
||||||
|
|
||||||
/* This function sets up the buffers and reads the file into RAM */
|
|
||||||
|
|
||||||
if (local_init(file, "/libmusepacktest.wav", &file_info, api)) {
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read file's streaminfo data */
|
|
||||||
mpc_streaminfo info;
|
|
||||||
mpc_streaminfo_init(&info);
|
|
||||||
if (mpc_streaminfo_read(&info, &reader) != ERROR_CODE_OK) {
|
|
||||||
rb->splash(HZ, true, "Not an MPC file.");
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
file_info.samplerate=info.sample_freq;
|
|
||||||
/* instantiate a decoder with our file reader */
|
|
||||||
mpc_decoder_setup(&decoder, &reader);
|
|
||||||
if (!mpc_decoder_initialize(&decoder, &info)) {
|
|
||||||
rb->splash(HZ, true, "Error in init.");
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
file_info.frames_decoded = 0;
|
|
||||||
file_info.start_tick = *(rb->current_tick);
|
|
||||||
|
|
||||||
rb->button_clear_queue();
|
|
||||||
|
|
||||||
/* This is the decoding loop. */
|
|
||||||
while (status != 0) {
|
|
||||||
status = mpc_decoder_decode(&decoder, sample_buffer, 0, 0);
|
|
||||||
if (status == (unsigned)(-1)) {
|
|
||||||
//decode error
|
|
||||||
rb->splash(HZ, true, "Error decoding file.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else //status>0
|
|
||||||
{
|
|
||||||
file_info.current_sample += status;
|
|
||||||
file_info.frames_decoded++;
|
|
||||||
/* Convert musepack's numbers to an array of 16-bit LE signed integers */
|
|
||||||
#if 1 /* uncomment to time without byte swapping and disk writing */
|
|
||||||
for(i = 0; i < status*info.channels; i += info.channels)
|
|
||||||
{
|
|
||||||
/* Left channel */
|
|
||||||
Sample=shift_signed(sample_buffer[i], 16 - MPC_FIXED_POINT_SCALE_SHIFT);
|
|
||||||
*(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(info.channels==2)
|
|
||||||
Sample=shift_signed(sample_buffer[i + 1], 16 - MPC_FIXED_POINT_SCALE_SHIFT);
|
|
||||||
*(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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
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 */
|
|
|
@ -1,180 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* __________ __ ___.
|
|
||||||
* 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 "kernel.h"
|
|
||||||
#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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_IRAM
|
|
||||||
extern char iramcopy[];
|
|
||||||
extern char iramstart[];
|
|
||||||
extern char iramend[];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* reserve the PCM buffer in the IRAM area */
|
|
||||||
static char pcmbuf[4096] IDATA_ATTR;
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
int i;
|
|
||||||
char x;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
#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,"/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) {
|
|
||||||
DEBUGF("Error decoding frame\n");
|
|
||||||
} else {
|
|
||||||
file_info.frames_decoded++;
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
for (i=0;i<n;i+=2) {
|
|
||||||
x=pcmbuf[i]; pcmbuf[i]=pcmbuf[i+1]; pcmbuf[i+1]=x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
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 */
|
|
|
@ -1,217 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* __________ __ ___.
|
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
||||||
* \/ \/ \/ \/ \/
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 Christian Gmeiner
|
|
||||||
*
|
|
||||||
* 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 "lib/xxx2wav.h" /* Helper functions common to test decoders */
|
|
||||||
#include <codecs/libwavpack/wavpack.h>
|
|
||||||
|
|
||||||
#define BUFFER_SIZE 4096
|
|
||||||
|
|
||||||
static struct plugin_api* rb;
|
|
||||||
static file_info_struct file_info;
|
|
||||||
static long temp_buffer [BUFFER_SIZE] IDATA_ATTR;
|
|
||||||
|
|
||||||
/* Reformat samples from longs in processor's native endian mode to
|
|
||||||
little-endian data with 2 bytes / sample. */
|
|
||||||
uchar* format_samples (int bps, uchar *dst, long *src, ulong samcnt)
|
|
||||||
{
|
|
||||||
long temp;
|
|
||||||
|
|
||||||
switch (bps)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
while (samcnt--)
|
|
||||||
{
|
|
||||||
*dst++ = (uchar)(temp = (*src++ << 8));
|
|
||||||
*dst++ = (uchar)(temp >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
while (samcnt--)
|
|
||||||
{
|
|
||||||
*dst++ = (uchar)(temp = *src++);
|
|
||||||
*dst++ = (uchar)(temp >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
while (samcnt--)
|
|
||||||
{
|
|
||||||
*dst++ = (uchar)(temp = (*src++ >> 8));
|
|
||||||
*dst++ = (uchar)(temp >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
while (samcnt--)
|
|
||||||
{
|
|
||||||
*dst++ = (uchar)(temp = (*src++ >> 16));
|
|
||||||
*dst++ = (uchar)(temp >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this is our function to decode a memory block from a file */
|
|
||||||
void wvpack_decode_data(file_info_struct* file_info, int samples_to_decode, WavpackContext **wpc)
|
|
||||||
{
|
|
||||||
int bps = WavpackGetBytesPerSample(*wpc);
|
|
||||||
/* nothing to decode */
|
|
||||||
if (!samples_to_decode)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* decode now */
|
|
||||||
ulong samples_unpacked = WavpackUnpackSamples(*wpc, temp_buffer, samples_to_decode);
|
|
||||||
|
|
||||||
if (samples_unpacked)
|
|
||||||
{
|
|
||||||
/* update some infos */
|
|
||||||
file_info->current_sample += samples_unpacked;
|
|
||||||
|
|
||||||
/* for now, convert mono to stereo here, in place */
|
|
||||||
if (WavpackGetReducedChannels (*wpc) == 1) {
|
|
||||||
long *dst = temp_buffer + (samples_unpacked * 2);
|
|
||||||
long *src = temp_buffer + samples_unpacked;
|
|
||||||
long count = samples_unpacked;
|
|
||||||
|
|
||||||
while (count--) {
|
|
||||||
*--dst = *--src;
|
|
||||||
*--dst = *src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
format_samples (bps, (uchar *) temp_buffer, temp_buffer, samples_unpacked * file_info->channels);
|
|
||||||
rb->write(file_info->outfile, temp_buffer, samples_unpacked * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* callback function for wavpack
|
|
||||||
Maybe we do this at a lower level, but the
|
|
||||||
first thing is to get all working */
|
|
||||||
long Read(void* buffer, long size)
|
|
||||||
{
|
|
||||||
long oldpos = file_info.curpos;
|
|
||||||
|
|
||||||
if ((file_info.curpos + size) < file_info.filesize)
|
|
||||||
{
|
|
||||||
memcpy(buffer, &filebuf[file_info.curpos], size);
|
|
||||||
file_info.curpos += size;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy(buffer, &filebuf[file_info.curpos], file_info.filesize-file_info.curpos);
|
|
||||||
file_info.curpos = file_info.filesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (file_info.curpos - oldpos);
|
|
||||||
}
|
|
||||||
|
|
||||||
#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)
|
|
||||||
{
|
|
||||||
WavpackContext *wpc;
|
|
||||||
char error[80];
|
|
||||||
|
|
||||||
/* generic plugin initialisation */
|
|
||||||
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,"/wvtest.wav",&file_info,api))
|
|
||||||
{
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* setup wavpack */
|
|
||||||
wpc = WavpackOpenFileInput(Read, error);
|
|
||||||
|
|
||||||
/* was there an error? */
|
|
||||||
if (!wpc)
|
|
||||||
{
|
|
||||||
rb->splash(HZ*2, true, error);
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* grap/set some infos (forcing some to temp values) */
|
|
||||||
file_info.channels = 2;
|
|
||||||
file_info.total_samples = WavpackGetNumSamples(wpc);
|
|
||||||
file_info.bitspersample = 16;
|
|
||||||
file_info.samplerate = WavpackGetSampleRate(wpc);
|
|
||||||
file_info.current_sample = 0;
|
|
||||||
|
|
||||||
/* deciding loop */
|
|
||||||
file_info.start_tick=*(rb->current_tick);
|
|
||||||
rb->button_clear_queue();
|
|
||||||
|
|
||||||
while (file_info.current_sample < file_info.total_samples)
|
|
||||||
{
|
|
||||||
wvpack_decode_data(&file_info, BUFFER_SIZE / file_info.channels, &wpc);
|
|
||||||
|
|
||||||
display_status(&file_info);
|
|
||||||
|
|
||||||
if (rb->button_get(false)!=BUTTON_NONE)
|
|
||||||
{
|
|
||||||
close_wav(&file_info);
|
|
||||||
return PLUGIN_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close_wav(&file_info);
|
|
||||||
|
|
||||||
/* do some last checks */
|
|
||||||
if ((WavpackGetNumSamples (wpc) != (ulong) -1) && (file_info.current_sample != WavpackGetNumSamples (wpc)))
|
|
||||||
{
|
|
||||||
rb->splash(HZ*2, true, "incorrect number of samples!");
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (WavpackGetNumErrors (wpc)) {
|
|
||||||
rb->splash(HZ*2, true, "crc errors detected!");
|
|
||||||
return PLUGIN_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
rb->splash(HZ*2, true, "FINISHED!");
|
|
||||||
|
|
||||||
return PLUGIN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_HWCODEC == MASNONE */
|
|
Loading…
Add table
Add a link
Reference in a new issue