1 /*
2     mp3tech.h - Headers for mp3tech.c
3 
4     Copyright (C) 2000-2006 Cedric Tefft <cedric@phreaker.net>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 
20   ***************************************************************************
21 
22   This file is based in part on:
23 
24 	* MP3Info 0.5 by Ricardo Cerqueira <rmc@rccn.net>
25 	* MP3Stat 0.9 by Ed Sweetman <safemode@voicenet.com> and
26 			 Johannes Overmann <overmann@iname.com>
27 
28 */
29 
30 /* MIN_CONSEC_GOOD_FRAMES defines how many consecutive valid MP3 frames
31    we need to see before we decide we are looking at a real MP3 file */
32 #define MIN_CONSEC_GOOD_FRAMES 4
33 #define FRAME_HEADER_SIZE 4
34 #define MIN_FRAME_SIZE 21
35 #define NUM_SAMPLES 4
36 
37 enum VBR_REPORT { VBR_VARIABLE, VBR_AVERAGE, VBR_MEDIAN };
38 enum SCANTYPE { SCAN_NONE, SCAN_QUICK, SCAN_FULL };
39 
40 typedef struct {
41 	unsigned long	sync;
42 	unsigned int	version;
43 	unsigned int	layer;
44 	unsigned int	crc;
45 	unsigned int	bitrate;
46 	unsigned int	freq;
47 	unsigned int	padding;
48 	unsigned int	extension;
49 	unsigned int	mode;
50 	unsigned int	mode_extension;
51 	unsigned int	copyright;
52 	unsigned int	original;
53 	unsigned int	emphasis;
54 } mp3header;
55 
56 typedef struct {
57 	char title[31];
58 	char artist[31];
59 	char album[31];
60 	char year[5];
61 	char comment[31];
62 	unsigned char track[1];
63 	unsigned char genre[1];
64 } id3tag;
65 
66 typedef struct {
67 	char *filename;
68 	FILE *file;
69 	off_t datasize;
70 	int header_isvalid;
71 	mp3header header;
72 	int id3_isvalid;
73 	id3tag id3;
74 	int vbr;
75 	float vbr_average;
76 	int seconds;
77 	int frames;
78 	int badframes;
79 } mp3info;
80 
81 
82 int get_header(FILE *file,mp3header *header);
83 int frame_length(mp3header *header);
84 int header_layer(mp3header *h);
85 int header_bitrate(mp3header *h);
86 int sameConstant(mp3header *h1, mp3header *h2);
87 int get_mp3_info(mp3info *mp3,int scantype, int fullscan_vbr);
88 int get_id3(mp3info *mp3);
89 char *pad(char *string, int length);
90 char *unpad(char *string);
91 int write_tag(mp3info *mp3);
92 int header_frequency(mp3header *h);
93 char *header_emphasis(mp3header *h);
94 char *header_mode(mp3header *h);
95 int get_first_header(mp3info *mp3,long startpos);
96 int get_next_header(mp3info *mp3);
97