|
|
|
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(void)
{
next_track:
if (codec_init()) {
DEBUGF("codec init failed\n");
return CODEC_ERROR;
}
while (!*ci->taginfo_ready && !ci->stop_codec)
ci->sleep(1);
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)
{
ci->yield();
if (ci->stop_codec || ci->new_track)
break;
if (ci->seek_time) {
/* New time is ready in ci->seek_time */
/* absolute position in ms */
/* seek to pos */
/* update elapsed */
ci->set_elapsed(ci->seek_time);
/* 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;
}
if (ci->request_next_track())
goto next_track;
return CODEC_OK;
}
Adding a decoder to RockboxThis is of course subject to change as things move around in the source.
r10 - 12 Nov 2010 - 21:12:10 - MichaelGiacomelli
Copyright © by the contributing authors.
|