release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Wiki > Main > HowToWriteCodecs (compare)

Difference: HowToWriteCodecs (r10 vs. r9)

How to write a codec for Rockbox

Codec structure

The 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/).

  • a minimal Codec structure looks like this:
#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 Rockbox

This is of course subject to change as things move around in the source.

  • Put your source in apps/codecs
  • apps/codecs/SOURCES
    • Add the file name.
  • apps/codecs/Makefile
    • Add a rule like ${OBJDIR}/wav.elf : $(OBJDIR)/wav.o
  • apps/metadata.h
    • Add a value to the Audio file types enum.
  • apps/metadata.c
    • Add a case to the switch in get_metadata()
    • Add an entry to audio_formats[]
  • apps/metadata/
    • Add your metadata detection here.
  • apps/filetypes.c
    • Add an element to inbuilt_filetypes struct.

Finally, optimize your codec for your player to maximize battery life: TargetSpecificOptimization

r12 - 13 Mar 2014 - 11:27:59 - MichaelSevakis

Revision r10 - 12 Nov 2010 - 21:12 - MichaelGiacomelli
Revision r9 - 22 Nov 2009 - 19:53 - MichaelGiacomelli
Copyright by the contributing authors.