1 /*
2  * Copyright 2008-2013 Various Authors
3  * Copyright 2004 Timo Hirvonen
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #ifndef CMUS_NOMAD_H
20 #define CMUS_NOMAD_H
21 
22 #include <sys/types.h>
23 
24 #ifndef __GNUC__
25 #include <unistd.h>
26 #endif
27 
28 /* default callbacks use read, lseek, close */
29 struct nomad_callbacks {
30 	ssize_t (*read)(void *datasource, void *buffer, size_t count);
31 	off_t (*lseek)(void *datasource, off_t offset, int whence);
32 	int (*close)(void *datasource);
33 };
34 
35 enum {
36 	XING_FRAMES = 0x00000001L,
37 	XING_BYTES  = 0x00000002L,
38 	XING_TOC    = 0x00000004L,
39 	XING_SCALE  = 0x00000008L
40 };
41 
42 struct nomad_xing {
43 	unsigned int is_info : 1;
44 	unsigned int flags;
45 	unsigned int nr_frames;
46 	unsigned int bytes;
47 	unsigned int scale;
48 	unsigned char toc[100];
49 };
50 
51 struct nomad_lame {
52 	char encoder[10];   /* 9 byte encoder name/version ("LAME3.97b") */
53 	int vbr_method;     /* VBR method */
54 	float peak;         /* replaygain peak */
55 	float trackGain;    /* replaygain track gain */
56 	float albumGain;    /* replaygain album gain */
57 	int encoderDelay;   /* # of added samples at start of mp3 */
58 	int encoderPadding; /* # of added samples at end of mp3 */
59 };
60 
61 /* always 16-bit signed little-endian */
62 struct nomad_info {
63 	double duration;
64 	int sample_rate;
65 	int channels;
66 	int nr_frames;
67 	int layer;
68 	/* guessed */
69 	int vbr;
70 	/* guessed */
71 	int avg_bitrate;
72 	/* -1 if file not seekable */
73 	off_t filesize;
74 	unsigned int joint_stereo : 1;
75 	unsigned int dual_channel : 1;
76 };
77 
78 enum {
79 	NOMAD_ERROR_SUCCESS,
80 	NOMAD_ERROR_ERRNO,
81 	NOMAD_ERROR_FILE_FORMAT
82 };
83 
84 struct nomad;
85 
86 /* -NOMAD_ERROR_ERRNO -NOMAD_ERROR_FILE_FORMAT */
87 int nomad_open_callbacks(struct nomad **nomadp, void *datasource,
88 		struct nomad_callbacks *cbs);
89 
90 void nomad_close(struct nomad *nomad);
91 
92 /* -NOMAD_ERROR_ERRNO */
93 int nomad_read(struct nomad *nomad, char *buffer, int count);
94 
95 /* -NOMAD_ERROR_ERRNO */
96 int nomad_time_seek(struct nomad *nomad, double pos);
97 
98 const struct nomad_xing *nomad_xing(struct nomad *nomad);
99 const struct nomad_lame *nomad_lame(struct nomad *nomad);
100 const struct nomad_info *nomad_info(struct nomad *nomad);
101 long nomad_current_bitrate(struct nomad *nomad);
102 
103 #endif
104