2
mpg123: main code of the program (not of the decoder...)
4
copyright 1995-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
5
see COPYING and AUTHORS files in distribution or http://mpg123.de
6
initially written by Michael Hipp
9
used source: musicout.h from mpegaudio package
17
#include <sys/signal.h>
20
/* want to suport large files in future */
21
#ifdef HAVE_SYS_TYPES_H
22
#include <sys/types.h>
34
typedef unsigned char byte;
41
#define REMOTE_BUFFER_SIZE 2048
49
#ifdef _WIN32 /* Win32 Additions By Tony Million */
53
# define M_PI 3.14159265358979323846
54
# define M_SQRT2 1.41421356237309504880
55
# define REAL_IS_FLOAT
59
# define srandom srand
61
# undef MPG123_REMOTE /* Get rid of this stuff for Win32 */
67
#define memmove(dst,src,size) bcopy(src,dst,size)
72
#elif defined(REAL_IS_LONG_DOUBLE)
73
# define real long double
74
#elif defined(REAL_IS_FIXED)
77
# define REAL_RADIX 15
78
# define REAL_FACTOR (32.0 * 1024.0)
80
# define REAL_PLUS_32767 ( 32767 << REAL_RADIX )
81
# define REAL_MINUS_32768 ( -32768 << REAL_RADIX )
83
# define DOUBLE_TO_REAL(x) ((int)((x) * REAL_FACTOR))
84
# define REAL_TO_SHORT(x) ((x) >> REAL_RADIX)
85
# define REAL_MUL(x, y) (((long long)(x) * (long long)(y)) >> REAL_RADIX)
91
#ifndef DOUBLE_TO_REAL
92
# define DOUBLE_TO_REAL(x) (x)
95
# define REAL_TO_SHORT(x) (x)
97
#ifndef REAL_PLUS_32767
98
# define REAL_PLUS_32767 32767.0
100
#ifndef REAL_MINUS_32768
101
# define REAL_MINUS_32768 -32768.0
104
# define REAL_MUL(x, y) ((x) * (y))
108
#define INLINE inline
115
/* AUDIOBUFSIZE = n*64 with n=1,2,3 ... */
116
#define AUDIOBUFSIZE 16384
121
#define MAX_NAME_SIZE 81
123
#define SCALE_BLOCK 12
126
#define MPG_MD_STEREO 0
127
#define MPG_MD_JOINT_STEREO 1
128
#define MPG_MD_DUAL_CHANNEL 2
129
#define MPG_MD_MONO 3
131
/* I suspect that 32767 would be a better idea here, but Michael put this in... */
132
#define MAXOUTBURST 32768
134
/* Pre Shift fo 16 to 8 bit converter table */
145
struct al_table *alloc;
146
int (*synth)(real *,int,unsigned char *,int *);
147
int (*synth_mono)(real *,unsigned char *,int *);
149
void (*dct36)(real *,real *,real *,real *,real *);
151
int stereo; /* I _think_ 1 for mono and 2 for stereo */
155
int down_sample_sblimit;
156
int lsf; /* 0: MPEG 1.0; 1: MPEG 2.0/2.5 -- both used as bool and array index! */
161
int (*do_layer)(struct frame *fr,int,struct audio_info_struct *);
162
int error_protection;
164
int sampling_frequency;
172
int framesize; /* computed framesize */
173
int vbr; /* 1 if variable bitrate was detected */
174
unsigned long num; /* the nth frame in some stream... */
178
int aggressive; /* renice to max. priority */
179
int shuffle; /* shuffle/random play */
180
int remote; /* remote operation */
181
int remote_err; /* remote operation to stderr */
182
int outmode; /* where to out the decoded sampels */
183
int quiet; /* shut up! */
184
int xterm_title; /* Change xterm title to song names? */
185
long usebuffer; /* second level buffer size */
186
int tryresync; /* resync stream after error */
187
int verbose; /* verbose level */
201
int stat_3dnow; /* automatic/force/force-off 3DNow! optimized code */
207
int gapless; /* (try to) remove silence padding/delay to enable gapless playback */
209
long listentry; /* possibility to choose playback of one entry in playlist (0: off, > 0 : select, < 0; just show list*/
210
int rva; /* (which) rva to do: <0: nothing, 0: radio/mix/track 1: album/audiophile */
211
char* listname; /* name of playlist */
214
/* start to use off_t to properly do LFS in future ... used to be long */
216
int (*init)(struct reader *);
217
void (*close)(struct reader *);
218
int (*head_read)(struct reader *,unsigned long *newhead);
219
int (*head_shift)(struct reader *,unsigned long *head);
220
off_t (*skip_bytes)(struct reader *,off_t len);
221
int (*read_frame_body)(struct reader *,unsigned char *,int size);
222
int (*back_bytes)(struct reader *,off_t bytes);
223
int (*back_frame)(struct reader *,struct frame *,long num);
224
off_t (*tell)(struct reader *);
225
void (*rewind)(struct reader *);
230
unsigned char id3buf[128];
232
#define READER_FD_OPENED 0x1
233
#define READER_ID3TAG 0x2
234
#define READER_SEEKABLE 0x4
236
extern struct reader *rd,readers[];
237
extern char *equalfile;
238
/*ThOr: No fiddling with the pointer in control_generic! */
239
extern int have_eq_settings;
241
extern int halfspeed;
242
extern int buffer_fd[2];
243
extern txfermem *buffermem;
246
extern void buffer_loop(struct audio_info_struct *ai,sigset_t *oldsigset);
249
/* ------ Declarations from "httpget.c" ------ */
251
extern char *proxyurl;
252
extern unsigned long proxyip;
253
/* takes url and content type string address, opens resource, returns fd for data, allocates and sets content type */
254
extern int http_open (char* url, char** content_type);
255
extern char *httpauth;
257
/* ------ Declarations from "common.c" ------ */
259
extern void audio_flush(int, struct audio_info_struct *);
260
extern void (*catchsignal(int signum, void(*handler)()))();
262
extern void print_header(struct frame *);
263
extern void print_header_compact(struct frame *);
264
extern void print_id3_tag(unsigned char *buf);
266
extern int split_dir_file(const char *path, char **dname, char **fname);
268
extern unsigned int get1bit(void);
269
extern unsigned int getbits(int);
270
extern unsigned int getbits_fast(int);
271
extern void backbits(int);
272
extern int getbitoffset(void);
273
extern int getbyte(void);
275
extern void set_pointer(long);
277
extern unsigned char *pcm_sample;
278
extern int pcm_point;
279
extern int audiobufsize;
281
extern int OutputDescriptor;
283
#ifdef VARMODESUPPORT
285
extern int playlimit;
290
unsigned part2_3_length;
292
unsigned scalefac_compress;
294
unsigned mixed_block_flag;
295
unsigned table_select[3];
296
unsigned subblock_gain[3];
300
unsigned region1start;
301
unsigned region2start;
303
unsigned scalefac_scale;
304
unsigned count1table_select;
311
unsigned main_data_begin;
312
unsigned private_bits;
314
struct gr_info_s gr[2];
318
extern int open_stream(char *,int fd);
319
extern void read_frame_init (struct frame* fr);
320
extern int read_frame(struct frame *fr);
322
void prepare_audioinfo(struct frame *fr, struct audio_info_struct *nai);
323
extern void play_frame(int init,struct frame *fr);
324
extern int do_layer3(struct frame *fr,int,struct audio_info_struct *);
325
extern int do_layer2(struct frame *fr,int,struct audio_info_struct *);
326
extern int do_layer1(struct frame *fr,int,struct audio_info_struct *);
327
extern void do_equalizer(real *bandPtr,int channel);
330
extern int synth_1to1_pent (real *,int,unsigned char *);
332
extern int synth_1to1 (real *,int,unsigned char *,int *);
333
extern int synth_1to1_8bit (real *,int,unsigned char *,int *);
334
extern int synth_1to1_mono (real *,unsigned char *,int *);
335
extern int synth_1to1_mono2stereo (real *,unsigned char *,int *);
336
extern int synth_1to1_8bit_mono (real *,unsigned char *,int *);
337
extern int synth_1to1_8bit_mono2stereo (real *,unsigned char *,int *);
339
extern int synth_2to1 (real *,int,unsigned char *,int *);
340
extern int synth_2to1_8bit (real *,int,unsigned char *,int *);
341
extern int synth_2to1_mono (real *,unsigned char *,int *);
342
extern int synth_2to1_mono2stereo (real *,unsigned char *,int *);
343
extern int synth_2to1_8bit_mono (real *,unsigned char *,int *);
344
extern int synth_2to1_8bit_mono2stereo (real *,unsigned char *,int *);
346
extern int synth_4to1 (real *,int,unsigned char *,int *);
347
extern int synth_4to1_8bit (real *,int,unsigned char *,int *);
348
extern int synth_4to1_mono (real *,unsigned char *,int *);
349
extern int synth_4to1_mono2stereo (real *,unsigned char *,int *);
350
extern int synth_4to1_8bit_mono (real *,unsigned char *,int *);
351
extern int synth_4to1_8bit_mono2stereo (real *,unsigned char *,int *);
353
extern int synth_ntom (real *,int,unsigned char *,int *);
354
extern int synth_ntom_8bit (real *,int,unsigned char *,int *);
355
extern int synth_ntom_mono (real *,unsigned char *,int *);
356
extern int synth_ntom_mono2stereo (real *,unsigned char *,int *);
357
extern int synth_ntom_8bit_mono (real *,unsigned char *,int *);
358
extern int synth_ntom_8bit_mono2stereo (real *,unsigned char *,int *);
360
extern void rewindNbits(int bits);
361
extern int hsstell(void);
362
extern void set_pointer(long);
363
extern void huffman_decoder(int ,int *);
364
extern void huffman_count1(int,int *);
365
extern void print_stat(struct frame *fr,unsigned long no,long buffsize,struct audio_info_struct *ai);
366
extern int get_songlen(struct frame *fr,int no);
368
extern void init_layer3(int);
369
extern void init_layer2(void);
370
extern void make_decode_tables(long scale);
371
extern void make_conv16to8_table(int);
372
extern void dct64(real *,real *,real *);
375
extern void dct64_MMX(short *a,short *b,real *c);
376
extern int synth_1to1_MMX(real *, int, short *, short *, int *);
379
extern void synth_ntom_set_step(long,long);
381
extern int control_generic(struct frame *fr);
383
extern int cdr_open(struct audio_info_struct *ai, char *ame);
384
extern int au_open(struct audio_info_struct *ai, char *name);
385
extern int wav_open(struct audio_info_struct *ai, char *wavfilename);
386
extern int wav_write(unsigned char *buf,int len);
387
extern int cdr_close(void);
388
extern int au_close(void);
389
extern int wav_close(void);
391
extern int au_open(struct audio_info_struct *ai, char *aufilename);
392
extern int au_close(void);
394
extern int cdr_open(struct audio_info_struct *ai, char *cdrfilename);
395
extern int cdr_close(void);
397
extern unsigned char *conv16to8;
398
extern long freqs[9];
399
extern real muls[27][64];
400
extern real decwin[512+32];
402
extern real *pnts[5];
405
extern real equalizer[2][32];
406
extern real equalizer_sum[2][32];
407
extern int equalizer_cnt;
409
extern struct audio_name audio_val2name[];
411
extern struct parameter param;
413
/* 486 optimizations */
414
#define FIR_BUFFER_SIZE 128
415
extern void dct64_486(int *a,int *b,real *c);
416
extern int synth_1to1_486(real *bandPtr,int channel,unsigned char *out,int nb_blocks);
418
/* 3DNow! optimizations */
420
extern int getcpuflags(void);
421
extern void dct36(real *,real *,real *,real *,real *);
422
extern void dct36_3dnow(real *,real *,real *,real *,real *);
423
extern int synth_1to1_3dnow(real *,int,unsigned char *,int *);
426
/* avoid the SIGINT in terminal control */
427
void next_track(void);
428
extern long outscale;