diff options
| author | Thom Johansen <thomj@rockbox.org> | 2005-06-22 22:02:11 +0000 |
|---|---|---|
| committer | Thom Johansen <thomj@rockbox.org> | 2005-06-22 22:02:11 +0000 |
| commit | 8b2531be27bf8ce70acca3a126827b3afc133f08 (patch) | |
| tree | 185e99846a562d2bd4ed3b4e1ce5c9abe128d0d8 /apps | |
| parent | 44bba0f2c05c4ecb6655f274d581eabc6a13cf90 (diff) | |
| download | rockbox-8b2531be27bf8ce70acca3a126827b3afc133f08.zip rockbox-8b2531be27bf8ce70acca3a126827b3afc133f08.tar.gz rockbox-8b2531be27bf8ce70acca3a126827b3afc133f08.tar.bz2 rockbox-8b2531be27bf8ce70acca3a126827b3afc133f08.tar.xz | |
Nicer code, removed rb references.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6829 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/codecs/mpc.c | 264 |
1 files changed, 120 insertions, 144 deletions
diff --git a/apps/codecs/mpc.c b/apps/codecs/mpc.c index fb8412e..e3a13c5 100644 --- a/apps/codecs/mpc.c +++ b/apps/codecs/mpc.c @@ -22,60 +22,54 @@ #include "lib/codeclib.h" #include <codecs/libmusepack/musepack.h> -static struct codec_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) +/* Our implementations of the mpc_reader callback functions. */ +mpc_int32_t read_impl(void *data, void *ptr, mpc_int32_t size) { - struct codec_api* ci = (struct codec_api*)data; + struct codec_api *ci = (struct codec_api*)data; - return((mpc_int32_t)(ci->read_filebuf(ptr,size))); + return ((mpc_int32_t)(ci->read_filebuf(ptr, size))); } -bool -seek_impl(void *data, mpc_int32_t offset) +bool seek_impl(void *data, mpc_int32_t offset) { - struct codec_api* ci = (struct codec_api*)data; + struct codec_api *ci = (struct codec_api*)data; - /* WARNING: assumes we don't need to skip too far into the past, - this might not be supported by the buffering layer yet */ - return ci->seek_buffer(offset); + /* WARNING: assumes we don't need to skip too far into the past, + this might not be supported by the buffering layer yet */ + return ci->seek_buffer(offset); } -mpc_int32_t -tell_impl(void *data) +mpc_int32_t tell_impl(void *data) { - struct codec_api* ci = (struct codec_api*)data; + struct codec_api *ci = (struct codec_api*)data; - return ci->curpos; + return ci->curpos; } -mpc_int32_t -get_size_impl(void *data) +mpc_int32_t get_size_impl(void *data) { - struct codec_api* ci = (struct codec_api*)data; - return ci->filesize; + struct codec_api *ci = (struct codec_api*)data; + + return ci->filesize; } -bool -canseek_impl(void *data) +bool canseek_impl(void *data) { (void)data; - return false; + + /* doesn't much matter, libmusepack ignores this anyway */ + return true; } -static int -shift_signed(MPC_SAMPLE_FORMAT val, int shift) +inline int shift_signed(MPC_SAMPLE_FORMAT val, int shift) { - if (shift > 0) - val <<= shift; - else if (shift < 0) - val >>= -shift; - return (int)val; + 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. */ @@ -83,8 +77,8 @@ shift_signed(MPC_SAMPLE_FORMAT val, int shift) unsigned char OutputBuffer[OUTPUT_BUFFER_SIZE]; /* temporary, we probably have better use for iram than this */ MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH] IDATA_ATTR; -unsigned char *OutputPtr=OutputBuffer; -const unsigned char *OutputBufferEnd=OutputBuffer+OUTPUT_BUFFER_SIZE; +unsigned char *OutputPtr; +const unsigned char *OutputBufferEnd; #ifdef USE_IRAM extern char iramcopy[]; @@ -93,122 +87,104 @@ extern char iramend[]; #endif /* this is the codec entry point */ -enum codec_status codec_start(struct codec_api* api) +enum codec_status codec_start(struct codec_api *api) { - struct codec_api* ci = api; - unsigned short Sample; - unsigned long samplesdone; - unsigned long frequency; - unsigned status = 1; - unsigned int i; - mpc_reader reader; - - /* Generic codec inititialisation */ - - TEST_CODEC_API(api); - rb = api; - -#ifndef SIMULATOR - rb->memcpy(iramstart, iramcopy, iramend-iramstart); -#endif - - ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*2)); - ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*16)); - - next_track: - - if (codec_init(api)) { - return CODEC_ERROR; - } - - /* Create a decoder instance */ - - reader.read = read_impl; - reader.seek = seek_impl; - reader.tell = tell_impl; - reader.get_size = get_size_impl; - reader.canseek = canseek_impl; - reader.data = ci; - - /* read file's streaminfo data */ - mpc_streaminfo info; - mpc_streaminfo_init(&info); - if (mpc_streaminfo_read(&info, &reader) != ERROR_CODE_OK) { - return CODEC_ERROR; - } - frequency=info.sample_freq; - - /* instantiate a decoder with our file reader */ - mpc_decoder_setup(&decoder, &reader); - if (!mpc_decoder_initialize(&decoder, &info)) { - return CODEC_ERROR; - } - - /* Initialise the output buffer. */ - OutputPtr=OutputBuffer; - OutputBufferEnd=OutputBuffer+OUTPUT_BUFFER_SIZE; - - /* This is the decoding loop. */ - samplesdone=0; - while (status != 0) { - if (ci->stop_codec || ci->reload_codec) { - break; - } - - status = mpc_decoder_decode(&decoder, sample_buffer, 0, 0); - if (status == (unsigned)(-1)) { - //decode error - return CODEC_ERROR; - } - else //status>0 - { - // file_info.current_sample += status; - // file_info.frames_decoded++; - /* Convert musepack's numbers to an array of 16-bit BE signed integers */ - 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>>8; - *(OutputPtr++)=Sample&0xff; - - /* 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>>8; - *(OutputPtr++)=Sample&0xff; - - samplesdone++; - - /* Flush the buffer if it is full. */ - if(OutputPtr==OutputBufferEnd) - { - rb->yield(); - while (!ci->audiobuffer_insert(OutputBuffer, OUTPUT_BUFFER_SIZE)) { - rb->yield(); - } - - ci->set_elapsed(samplesdone/(frequency/1000)); - OutputPtr=OutputBuffer; + struct codec_api *ci = api; + unsigned short Sample; + unsigned long samplesdone; + unsigned long frequency; + unsigned status = 1; + unsigned int i; + mpc_reader reader; + + /* Generic codec inititialisation */ + TEST_CODEC_API(api); + + #ifndef SIMULATOR + ci->memcpy(iramstart, iramcopy, iramend - iramstart); + #endif + + ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*2)); + ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*16)); + + next_track: + if (codec_init(api)) + return CODEC_ERROR; + + /* Create a decoder instance */ + reader.read = read_impl; + reader.seek = seek_impl; + reader.tell = tell_impl; + reader.get_size = get_size_impl; + reader.canseek = canseek_impl; + reader.data = ci; + + /* read file's streaminfo data */ + mpc_streaminfo info; + mpc_streaminfo_init(&info); + if (mpc_streaminfo_read(&info, &reader) != ERROR_CODE_OK) + return CODEC_ERROR; + frequency = info.sample_freq; + + /* instantiate a decoder with our file reader */ + mpc_decoder_setup(&decoder, &reader); + if (!mpc_decoder_initialize(&decoder, &info)) + return CODEC_ERROR; + + /* Initialise the output buffer. */ + OutputPtr = OutputBuffer; + OutputBufferEnd = OutputBuffer + OUTPUT_BUFFER_SIZE; + + /* This is the decoding loop. */ + samplesdone = 0; + while (status != 0) { + if (ci->stop_codec || ci->reload_codec) + break; + + status = mpc_decoder_decode(&decoder, sample_buffer, 0, 0); + if (status == (unsigned)(-1)) { + /* decode error */ + return CODEC_ERROR; + } else { /* status > 0 */ + /* Convert musepack's numbers to an array of 16-bit BE signed integers */ + 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 >> 8; + *(OutputPtr++) = Sample & 0xff; + + /* 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 >> 8; + *(OutputPtr++) = Sample & 0xff; + samplesdone++; + + /* Flush the buffer if it is full. */ + if (OutputPtr == OutputBufferEnd) { + ci->yield(); + while (!ci->audiobuffer_insert(OutputBuffer, OUTPUT_BUFFER_SIZE)) + ci->yield(); + ci->set_elapsed(samplesdone/(frequency/1000)); + OutputPtr = OutputBuffer; + } + } } - } } - } - /* Flush the remaining data in the output buffer */ - if (OutputPtr > OutputBuffer) { - rb->yield(); - while (!ci->audiobuffer_insert(OutputBuffer, OutputPtr-OutputBuffer)) { - rb->yield(); + /* Flush the remaining data in the output buffer */ + if (OutputPtr > OutputBuffer) { + ci->yield(); + while (!ci->audiobuffer_insert(OutputBuffer, OutputPtr - OutputBuffer)) + ci->yield(); } - } - if (ci->request_next_track()) - goto next_track; + if (ci->request_next_track()) + goto next_track; - return CODEC_OK; + return CODEC_OK; } |