~ubuntu-branches/ubuntu/lucid/mpg123/lucid

« back to all changes in this revision

Viewing changes to src/mpg123.h

Tags: upstream-0.60
ImportĀ upstreamĀ versionĀ 0.60

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
        mpg123: main code of the program (not of the decoder...)
 
3
 
 
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
 
7
 
 
8
        mpg123 defines 
 
9
        used source: musicout.h from mpegaudio package
 
10
*/
 
11
 
 
12
#include        <stdio.h>
 
13
#include        <string.h>
 
14
#include        <signal.h>
 
15
 
 
16
#ifndef WIN32
 
17
#include        <sys/signal.h>
 
18
#include        <unistd.h>
 
19
#endif
 
20
/* want to suport large files in future */
 
21
#ifdef HAVE_SYS_TYPES_H
 
22
        #include <sys/types.h>
 
23
#endif
 
24
#ifndef off_t
 
25
        #define off_t long
 
26
#endif
 
27
#include        <math.h>
 
28
 
 
29
 
 
30
 
 
31
#ifndef _AUDIO_H_
 
32
#define _AUDIO_H_
 
33
 
 
34
typedef unsigned char byte;
 
35
 
 
36
#ifdef OS2
 
37
#include <float.h>
 
38
#endif
 
39
 
 
40
#define MPG123_REMOTE
 
41
#define REMOTE_BUFFER_SIZE 2048
 
42
#ifdef HPUX
 
43
#define random rand
 
44
#define srandom srand
 
45
#endif
 
46
 
 
47
#define SKIP_JUNK 1
 
48
 
 
49
#ifdef _WIN32   /* Win32 Additions By Tony Million */
 
50
# undef WIN32
 
51
# define WIN32
 
52
 
 
53
# define M_PI       3.14159265358979323846
 
54
# define M_SQRT2        1.41421356237309504880
 
55
# define REAL_IS_FLOAT
 
56
# define NEW_DCT9
 
57
 
 
58
# define random rand
 
59
# define srandom srand
 
60
 
 
61
# undef MPG123_REMOTE           /* Get rid of this stuff for Win32 */
 
62
#endif
 
63
 
 
64
#include "xfermem.h"
 
65
 
 
66
#ifdef SUNOS
 
67
#define memmove(dst,src,size) bcopy(src,dst,size)
 
68
#endif
 
69
 
 
70
#ifdef REAL_IS_FLOAT
 
71
#  define real float
 
72
#elif defined(REAL_IS_LONG_DOUBLE)
 
73
#  define real long double
 
74
#elif defined(REAL_IS_FIXED)
 
75
# define real long
 
76
 
 
77
# define REAL_RADIX            15
 
78
# define REAL_FACTOR           (32.0 * 1024.0)
 
79
 
 
80
# define REAL_PLUS_32767       ( 32767 << REAL_RADIX )
 
81
# define REAL_MINUS_32768      ( -32768 << REAL_RADIX )
 
82
 
 
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)
 
86
 
 
87
#else
 
88
#  define real double
 
89
#endif
 
90
 
 
91
#ifndef DOUBLE_TO_REAL
 
92
# define DOUBLE_TO_REAL(x)     (x)
 
93
#endif
 
94
#ifndef REAL_TO_SHORT
 
95
# define REAL_TO_SHORT(x)      (x)
 
96
#endif
 
97
#ifndef REAL_PLUS_32767
 
98
# define REAL_PLUS_32767       32767.0
 
99
#endif
 
100
#ifndef REAL_MINUS_32768
 
101
# define REAL_MINUS_32768      -32768.0
 
102
#endif
 
103
#ifndef REAL_MUL
 
104
# define REAL_MUL(x, y)                ((x) * (y))
 
105
#endif
 
106
 
 
107
#ifdef __GNUC__
 
108
#define INLINE inline
 
109
#else
 
110
#define INLINE
 
111
#endif
 
112
 
 
113
#include "audio.h"
 
114
 
 
115
/* AUDIOBUFSIZE = n*64 with n=1,2,3 ...  */
 
116
#define         AUDIOBUFSIZE            16384
 
117
 
 
118
#define         FALSE                   0
 
119
#define         TRUE                    1
 
120
 
 
121
#define         MAX_NAME_SIZE           81
 
122
#define         SBLIMIT                 32
 
123
#define         SCALE_BLOCK             12
 
124
#define         SSLIMIT                 18
 
125
 
 
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
 
130
 
 
131
/* I suspect that 32767 would be a better idea here, but Michael put this in... */
 
132
#define MAXOUTBURST 32768
 
133
 
 
134
/* Pre Shift fo 16 to 8 bit converter table */
 
135
#define AUSHIFT (3)
 
136
 
 
137
 
 
138
struct al_table 
 
139
{
 
140
  short bits;
 
141
  short d;
 
142
};
 
143
 
 
144
struct frame {
 
145
    struct al_table *alloc;
 
146
    int (*synth)(real *,int,unsigned char *,int *);
 
147
    int (*synth_mono)(real *,unsigned char *,int *);
 
148
#ifdef USE_3DNOW
 
149
    void (*dct36)(real *,real *,real *,real *,real *);
 
150
#endif
 
151
    int stereo; /* I _think_ 1 for mono and 2 for stereo */
 
152
    int jsbound;
 
153
    int single;
 
154
    int II_sblimit;
 
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! */
 
157
    int mpeg25;
 
158
    int down_sample;
 
159
    int header_change;
 
160
    int lay;
 
161
    int (*do_layer)(struct frame *fr,int,struct audio_info_struct *);
 
162
    int error_protection;
 
163
    int bitrate_index;
 
164
    int sampling_frequency;
 
165
    int padding;
 
166
    int extension;
 
167
    int mode;
 
168
    int mode_ext;
 
169
    int copyright;
 
170
    int original;
 
171
    int emphasis;
 
172
    int framesize; /* computed framesize */
 
173
    int vbr; /* 1 if variable bitrate was detected */
 
174
                unsigned long num; /* the nth frame in some stream... */
 
175
};
 
176
 
 
177
struct parameter {
 
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 */
 
188
#ifdef HAVE_TERMIOS
 
189
  int term_ctrl;
 
190
#endif
 
191
  int force_mono;
 
192
  int force_stereo;
 
193
  int force_8bit;
 
194
  long force_rate;
 
195
  int down_sample;
 
196
  int checkrange;
 
197
  long doublespeed;
 
198
  long halfspeed;
 
199
  int force_reopen;
 
200
#ifdef USE_3DNOW
 
201
  int stat_3dnow; /* automatic/force/force-off 3DNow! optimized code */
 
202
  int test_3dnow;
 
203
#endif
 
204
  long realtime;
 
205
  char filename[256];
 
206
#ifdef GAPLESS  
 
207
  int gapless; /* (try to) remove silence padding/delay to enable gapless playback */
 
208
#endif
 
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 */
 
212
};
 
213
 
 
214
/* start to use off_t to properly do LFS in future ... used to be long */
 
215
struct reader {
 
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 *);
 
226
  off_t filelen;
 
227
  off_t filepos;
 
228
  int  filept;
 
229
  int  flags;
 
230
  unsigned char id3buf[128];
 
231
};
 
232
#define READER_FD_OPENED 0x1
 
233
#define READER_ID3TAG    0x2
 
234
#define READER_SEEKABLE  0x4
 
235
 
 
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;
 
240
 
 
241
extern int halfspeed;
 
242
extern int buffer_fd[2];
 
243
extern txfermem *buffermem;
 
244
 
 
245
#ifndef NOXFERMEM
 
246
extern void buffer_loop(struct audio_info_struct *ai,sigset_t *oldsigset);
 
247
#endif
 
248
 
 
249
/* ------ Declarations from "httpget.c" ------ */
 
250
 
 
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;
 
256
 
 
257
/* ------ Declarations from "common.c" ------ */
 
258
 
 
259
extern void audio_flush(int, struct audio_info_struct *);
 
260
extern void (*catchsignal(int signum, void(*handler)()))();
 
261
 
 
262
extern void print_header(struct frame *);
 
263
extern void print_header_compact(struct frame *);
 
264
extern void print_id3_tag(unsigned char *buf);
 
265
 
 
266
extern int split_dir_file(const char *path, char **dname, char **fname);
 
267
 
 
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);
 
274
 
 
275
extern void set_pointer(long);
 
276
 
 
277
extern unsigned char *pcm_sample;
 
278
extern int pcm_point;
 
279
extern int audiobufsize;
 
280
 
 
281
extern int OutputDescriptor;
 
282
 
 
283
#ifdef VARMODESUPPORT
 
284
extern int varmode;
 
285
extern int playlimit;
 
286
#endif
 
287
 
 
288
struct gr_info_s {
 
289
      int scfsi;
 
290
      unsigned part2_3_length;
 
291
      unsigned big_values;
 
292
      unsigned scalefac_compress;
 
293
      unsigned block_type;
 
294
      unsigned mixed_block_flag;
 
295
      unsigned table_select[3];
 
296
      unsigned subblock_gain[3];
 
297
      unsigned maxband[3];
 
298
      unsigned maxbandl;
 
299
      unsigned maxb;
 
300
      unsigned region1start;
 
301
      unsigned region2start;
 
302
      unsigned preflag;
 
303
      unsigned scalefac_scale;
 
304
      unsigned count1table_select;
 
305
      real *full_gain[3];
 
306
      real *pow2gain;
 
307
};
 
308
 
 
309
struct III_sideinfo
 
310
{
 
311
  unsigned main_data_begin;
 
312
  unsigned private_bits;
 
313
  struct {
 
314
    struct gr_info_s gr[2];
 
315
  } ch[2];
 
316
};
 
317
 
 
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);
 
321
/* why extern? */
 
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);
 
328
 
 
329
#ifdef PENTIUM_OPT
 
330
extern int synth_1to1_pent (real *,int,unsigned char *);
 
331
#endif
 
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 *);
 
338
 
 
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 *);
 
345
 
 
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 *);
 
352
 
 
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 *);
 
359
 
 
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);
 
367
 
 
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 *);
 
373
 
 
374
#ifdef USE_MMX
 
375
extern void dct64_MMX(short *a,short *b,real *c);
 
376
extern int synth_1to1_MMX(real *, int, short *, short *, int *);
 
377
#endif
 
378
 
 
379
extern void synth_ntom_set_step(long,long);
 
380
 
 
381
extern int control_generic(struct frame *fr);
 
382
 
 
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);
 
390
 
 
391
extern int au_open(struct audio_info_struct *ai, char *aufilename);
 
392
extern int au_close(void);
 
393
 
 
394
extern int cdr_open(struct audio_info_struct *ai, char *cdrfilename);
 
395
extern int cdr_close(void);
 
396
 
 
397
extern unsigned char *conv16to8;
 
398
extern long freqs[9];
 
399
extern real muls[27][64];
 
400
extern real decwin[512+32];
 
401
#ifndef USE_MMX
 
402
extern real *pnts[5];
 
403
#endif
 
404
 
 
405
extern real equalizer[2][32];
 
406
extern real equalizer_sum[2][32];
 
407
extern int equalizer_cnt;
 
408
 
 
409
extern struct audio_name audio_val2name[];
 
410
 
 
411
extern struct parameter param;
 
412
 
 
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);
 
417
 
 
418
/* 3DNow! optimizations */
 
419
#ifdef USE_3DNOW
 
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 *);
 
424
#endif
 
425
 
 
426
/* avoid the SIGINT in terminal control */
 
427
void next_track(void);
 
428
extern long outscale;
 
429
 
 
430
#endif