/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2002 by Daniel Stenberg * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #ifndef ID3_H #define ID3_H #include #include "config.h" #include "file.h" /* Audio file types. */ /* NOTE: When adding new audio types, also add to codec_labels[] in id3.c */ enum { AFMT_UNKNOWN = 0, /* Unknown file format */ AFMT_MPA_L1, /* MPEG Audio layer 1 */ AFMT_MPA_L2, /* MPEG Audio layer 2 */ AFMT_MPA_L3, /* MPEG Audio layer 3 */ AFMT_PCM_WAV, /* Uncompressed PCM in a WAV file */ AFMT_OGG_VORBIS, /* Ogg Vorbis */ AFMT_FLAC, /* FLAC */ AFMT_MPC, /* Musepack */ AFMT_A52, /* A/52 (aka AC3) audio */ AFMT_WAVPACK, /* WavPack */ AFMT_ALAC, /* Apple Lossless Audio Codec */ AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */ AFMT_SHN, /* Shorten */ AFMT_AIFF, /* Audio Interchange File Format */ /* New formats must be added to the end of this list */ AFMT_NUM_CODECS }; struct mp3entry { char path[MAX_PATH]; char* title; char* artist; char* album; char* genre_string; char* track_string; char* year_string; char* composer; int tracknum; int version; int layer; int year; unsigned char id3version; unsigned char genre; unsigned int codectype; unsigned int bitrate; unsigned long frequency; unsigned long id3v2len; unsigned long id3v1len; unsigned long first_frame_offset; /* Byte offset to first real MP3 frame. Used for skipping leading garbage to avoid gaps between tracks. */ unsigned long vbr_header_pos; unsigned long filesize; /* without headers; in bytes */ unsigned long length; /* song length in ms */ unsigned long elapsed; /* ms played */ int lead_trim; /* Number of samples to skip at the beginning */ int tail_trim; /* Number of samples to remove from the end */ /* Added for Vorbis */ unsigned long samples; /* number of samples in track */ /* MP3 stream specific info */ unsigned long frame_count; /* number of frames in the file (if VBR) */ /* Used for A52/AC3 */ unsigned long bytesperframe; /* number of bytes per frame (if CBR) */ /* Xing VBR fields */ bool vbr; bool has_toc; /* True if there is a VBR header in the file */ unsigned char toc[100]; /* table of contents */ /* these following two fields are used for local buffering */ char id3v2buf[300]; char id3v1buf[3][92]; /* resume related */ unsigned long offset; /* bytes played */ int index; /* playlist index */ /* FileEntry fields */ long fileentryoffset; long filehash; long songentryoffset; long rundbentryoffset; /* runtime database fields */ long rundbhash; short rating; short voladjust; long playcount; long lastplayed; /* replaygain support */ #if CONFIG_CODEC == SWCODEC char* track_gain_string; char* album_gain_string; long track_gain; /* 7.24 signed fixed point. 0 for no gain. */ long album_gain; long track_peak; /* 7.24 signed fixed point. 0 for no peak. */ long album_peak; #endif }; enum { ID3_VER_1_0 = 1, ID3_VER_1_1, ID3_VER_2_2, ID3_VER_2_3, ID3_VER_2_4 }; bool mp3info(struct mp3entry *entry, const char *filename, bool v1first); char* id3_get_genre(const struct mp3entry* id3); char* id3_get_codec(const struct mp3entry* id3); int getid3v2len(int fd); void adjust_mp3entry(struct mp3entry *entry, void *dest, void *orig); void copy_mp3entry(struct mp3entry *dest, struct mp3entry *orig); #endif