|
|
|
How to write a codec for RockboxCodec structureThe entry point for a codec is in apps/codecs/codec_name.c (e.g. flac.c). This code handles control of the codec using the API as in the example below. Decoding itself is usually handled one level further down (e.g. apps/codecs/libcodec_name/).
#include "codeclib.h"
CODEC_HEADER
/* this is the codec entry point */
enum codec_status codec_main(enum codec_entry_call_reason reason)
{
/* Check reason if actually doing something useful with it */
if (reason == CODEC_LOAD)
{
/* Codec is being loaded and initialized; do load-time inits here */
/* May include creating threads or setting DSP parameters that do not
change on a per-track basis */
return CODEC_OK; /* OR return CODEC_ERROR if init fails */
}
else if (reason == CODEC_UNLOAD)
{
/* Codec is about to be removed from memory; clean up any resouces
allocated */
return CODEC_OK; /* Return value ignored */
}
else
{
/* Default response in cases where codec has nothing to do when
codec_main is called for a particular reason */
return CODEC_OK;
}
}
/* this is called for each file to process */
enum codec_status codec_run(void)
{
/* param that receives data for a command */
intptr_t param;
if (codec_init()) {
DEBUGF("codec init failed\n");
return CODEC_ERROR;
}
codec_set_replaygain(ci->id3);
/* Init Codec for Track */
/* Make use of 44.1khz */
ci->configure(DSP_SET_FREQUENCY, 44100);
/* Sample depth is 16 bit little endian */
ci->configure(DSP_SET_SAMPLE_DEPTH, 16);
/* Stereo or Mono output ? */
ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO);
/* reset eleapsed */
ci->set_elapsed(0);
/* The main decoder loop */
while (1)
{
enum codec_command_action action = ci->get_command(¶m);
if (action == CODEC_ACTION_HALT)
{
/* Playback said codec should stop */
break;
}
if (action == CODEC_ACTION_SEEK_TIME) {
/* New time is ready in param */
/* absolute position in ms */
/* seek to pos */
/* update elapsed */
ci->set_elapsed(param);
/* seek ready */
ci->seek_complete();
}
/* Generate a buffer full of Audio */
/* Insert a buffer full of samples */
ci->pcmbuf_insert(sample_buffer, NULL, numberOfSamples);
/* Update elapsed in ms */
ci->set_elapsed(current_Pos);
if( EndOfFile )
break;
}
return CODEC_OK;
}
Adding a decoder to RockboxThis is of course subject to change as things move around in the source.
Edit | Attach | Print version | History: r11 < r10 < r9 < r8 | Backlinks | View wiki text | More topic actions r11 - 01 May 2011 - 21:53:18 - MichaelSevakis
Copyright © by the contributing authors.
|