Rockbox Technical Forums

Rockbox Development => Starting Development and Compiling => Topic started by: bharvey63 on March 21, 2012, 03:02:43 PM

Title: Adding a codec
Post by: bharvey63 on March 21, 2012, 03:02:43 PM
I'm trying to add follow the "add new codec" process as described on the site.. I decided to start by "cloning" an existing codec to a new, imaginary format called "foo" just to make sure theprocess works. I chose the flac codec and began by copying flac.c to foo.c in both apps/codecs and apps/metadata.

I can get this working (see below) with one exception, that is to say, if I rename a .flac file to .foo it plays with the new code (proven by DEBUGF statments). The exception is that I cannot get the build prcess to pick up the foo.c file in the metadata directory, hence I cannot present a "get_foo_metadata" function to the linker. If I leave the parse fuction "get_flac_metadata" in the audio_format enum, it works.

So, my question is: How do I integrate a new file in the apps/metadata directory into the build process???

Below is my annotated results of having followed the "add new codec" procedure from the web. Like I said, I seem to be missing only one piece, how to get the build process to "pick up on" the foo.c file in the metadata directory (and hence the get_foo_metadata funtion thereof)

Thanks for any help and please ask for more info if needed.




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
        >>yes, copied flac.c to foo.c

        Add the file name.
            >>yes, added foo.c

        Add a rule like ${OBJDIR}/wav.elf : $(OBJDIR)/wav.o
        >>??? There is no Makefile in apps/codecs, what to do here?
        >>Is it needed? The foo codec gets built anyway.

        Add a value to the Audio file types enum.
        >>yes, AFMT_FOO

        Add a case to the switch in get_metadata()
            >>??? No switch in get_metadata()
        Add an entry or entries to audio_formats[]
            >>[AFMT_FOO] =
            >>AFMT_ENTRY("FOO", "foo", NULL, get_foo_metadata,   "foo\0"),
            >>!!! This is where the problem is. "get_foo_metadata()" in apps/metadata/foo.c never gets built.
            >>Substututing get_flac_metadata in AFMT_FOO above works because apps/metadata/flac.c
            >>is already getting built.

        If one codec supports multiple formats, add a case to get_audio_base_codec_type().
        If the format is atomic audio (must be completely loaded onto the buffer), add a case to get_audio_base_data_type().
        If file can be resumed without loading it from the beginning, add a case to format_buffers_with_offset().
        >>Haven't dealt with these yet

        Add your metadata detection here.
        >>yes, copied flac.c to foo.c
        >>??? foo.c doesn't get built. WHY and HOW!?!?!?

        Add an element to inbuilt_filetypes struct.
        >>yes,  { "gnaural", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
        Because I'm cloning the flac codec, I need this in apps/codecs/codec.make:
        $(CODECDIR)/foo.codec : $(CODECDIR)/libffmpegFLAC.a

Oh yes, one more thing. One time the build did produce a foo.o file but it removed it too. I have not been able to duplicate this.
Title: Re: Adding a codec
Post by: saratoga on March 21, 2012, 05:21:43 PM
Add your new metadata file the the SOURCES file right after flac.c so that the make system knows to compile it.

FWIW I think we got rid of apps/metadata a couple days ago, so if you've got an older checkout you might want to update before putting to much work into this:;a=commit;h=b5716df4cb2837bbbc42195cf1aefcf03e21d6a6

Title: Re: Adding a codec
Post by: bharvey63 on March 21, 2012, 05:56:20 PM
Ah! apps/codecs/SOURCES is mentioned but I never realized that there is also an apps/SOURCES.


Also, thanks for the heads up on changes to the metadata directory, in general.

Title: Re: Adding a codec
Post by: bharvey63 on March 22, 2012, 05:20:17 PM
re refactoring, yes apps/metadata.[ch] moved into metadata directory and that in turn has been relocated into lib/rbcodec.