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



Search | Go
Wiki > Main > DocsIndex > HowToWriteCodecs (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.
Edit | Attach | Print version | History: r12 | r10 < r9 < r8 < r7 | Backlinks | View wiki text | More topic actions...
r9 - 22 Nov 2009 - 19:53:35 - MichaelGiacomelli

Parents: DocsIndex
Copyright by the contributing authors.