diff options
| author | Sean Bartell <wingedtachikoma@gmail.com> | 2011-06-25 21:32:25 -0400 |
|---|---|---|
| committer | Nils Wallménius <nils@rockbox.org> | 2012-04-25 22:13:20 +0200 |
| commit | f40bfc9267b13b54e6379dfe7539447662879d24 (patch) | |
| tree | 9b20069d5e62809ff434061ad730096836f916f2 /apps/codecs/mpc.c | |
| parent | a0009907de7a0107d49040d8a180f140e2eff299 (diff) | |
| download | rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.zip rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.gz rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.bz2 rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.xz | |
Add codecs to librbcodec.
Change-Id: Id7f4717d51ed02d67cb9f9cb3c0ada4a81843f97
Reviewed-on: http://gerrit.rockbox.org/137
Reviewed-by: Nils Wallménius <nils@rockbox.org>
Tested-by: Nils Wallménius <nils@rockbox.org>
Diffstat (limited to 'apps/codecs/mpc.c')
| -rw-r--r-- | apps/codecs/mpc.c | 186 |
1 files changed, 0 insertions, 186 deletions
diff --git a/apps/codecs/mpc.c b/apps/codecs/mpc.c deleted file mode 100644 index b2628f9..0000000 --- a/apps/codecs/mpc.c +++ /dev/null @@ -1,186 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2005 Thom Johansen - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "codeclib.h" -#include <codecs/libmusepack/mpcdec.h> -#include <codecs/libmusepack/internal.h> - -CODEC_HEADER - -static MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH] IBSS_ATTR; - -/* Our implementations of the mpc_reader callback functions. */ -static mpc_int32_t read_impl(mpc_reader *reader, void *ptr, mpc_int32_t size) -{ - (void)reader; - return ((mpc_int32_t)(ci->read_filebuf(ptr, size))); -} - -static mpc_bool_t seek_impl(mpc_reader *reader, mpc_int32_t offset) -{ - (void)reader; - return ci->seek_buffer(offset); -} - -static mpc_int32_t tell_impl(mpc_reader *reader) -{ - (void)reader; - return ci->curpos; -} - -static mpc_int32_t get_size_impl(mpc_reader *reader) -{ - (void)reader; - return ci->filesize; -} - -/* this is the codec entry point */ -enum codec_status codec_main(enum codec_entry_call_reason reason) -{ - if (reason == CODEC_LOAD) { - /* musepack's sample representation is 18.14 - * DSP_SET_SAMPLE_DEPTH = 14 (FRACT) + 16 (NATIVE) - 1 (SIGN) = 29 */ - ci->configure(DSP_SET_SAMPLE_DEPTH, 29); - } - - return CODEC_OK; -} - -/* this is called for each file to process */ -enum codec_status codec_run(void) -{ - mpc_int64_t samplesdone; - uint32_t frequency; /* 0.1 kHz accuracy */ - uint32_t elapsed_time; /* milliseconds */ - uint32_t byterate; /* bytes per second */ - mpc_status status; - mpc_reader reader; - mpc_streaminfo info; - mpc_frame_info frame; - mpc_demux *demux = NULL; - intptr_t param; - - frame.buffer = sample_buffer; - - /* Create a decoder instance */ - reader.read = read_impl; - reader.seek = seek_impl; - reader.tell = tell_impl; - reader.get_size = get_size_impl; - - if (codec_init()) - return CODEC_ERROR; - - /* Prep position */ - ci->seek_buffer(0); - - /* Initialize demux/decoder. */ - demux = mpc_demux_init(&reader); - if (NULL == demux) - return CODEC_ERROR; - - /* Read file's streaminfo data. */ - mpc_demux_get_info(demux, &info); - - byterate = (mpc_uint32_t)(info.average_bitrate) / 8; - frequency = info.sample_freq / 100; /* 0.1 kHz accuracy */ - ci->configure(DSP_SWITCH_FREQUENCY, info.sample_freq); - - /* Remark: rockbox offset is the file offset in bytes. So, estimate the - * sample seek position from the file offset, the sampling frequency and - * the bitrate. As the saved position is exactly calculated the reverse way - * there is no loss of information except rounding. */ - samplesdone = 100 * (((mpc_uint64_t)ci->id3->offset * frequency) / byterate); - - /* Set up digital signal processing for correct number of channels */ - /* NOTE: current musepack format only allows for stereo files - but code is here to handle other configurations anyway */ - if (info.channels == 2) - ci->configure(DSP_SET_STEREO_MODE, STEREO_NONINTERLEAVED); - else if (info.channels == 1) - ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO); - else - return CODEC_ERROR; - - codec_set_replaygain(ci->id3); - - /* Resume to saved sample offset. */ - elapsed_time = 0; - - if (samplesdone > 0) - { - if (mpc_demux_seek_sample(demux, samplesdone) == MPC_STATUS_OK) - { - elapsed_time = (samplesdone*10)/frequency; - } - else - { - samplesdone = 0; - } - } - - ci->set_elapsed(elapsed_time); - - /* This is the decoding loop. */ - do - { - enum codec_command_action action = ci->get_command(¶m); - - if (action == CODEC_ACTION_HALT) - return CODEC_OK; - - /* Complete seek handler. */ - if (action == CODEC_ACTION_SEEK_TIME) - { - mpc_int64_t new_offset = (param/10)*frequency; - if (mpc_demux_seek_sample(demux, new_offset) == MPC_STATUS_OK) - { - samplesdone = new_offset; - } - - elapsed_time = (samplesdone*10)/frequency; - ci->set_elapsed(elapsed_time); - ci->seek_complete(); - } - - /* Decode one frame. */ - status = mpc_demux_decode(demux, &frame); - ci->yield(); - if (frame.bits == -1) - { - /* Decoding error, exit decoding loop. */ - return (status == MPC_STATUS_OK) ? CODEC_OK : CODEC_ERROR; - } - else - { - /* Decoding passed, insert samples to PCM buffer. */ - ci->pcmbuf_insert(frame.buffer, - frame.buffer + MPC_FRAME_LENGTH, - frame.samples); - samplesdone += frame.samples; - elapsed_time = (samplesdone*10)/frequency; - ci->set_elapsed(elapsed_time); - /* Remark: rockbox offset is the file offset in bytes. So estimate - * this offset from the samples, sampling frequency and bitrate */ - ci->set_offset( (samplesdone * byterate)/(frequency*100) ); - } - } while (true); -} |