Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15.  
  16. #include        <stdio.h>
  17. #include        <math.h>
  18. #ifndef _AUDIO_H_
  19. #define _AUDIO_H_
  20.  
  21. typedef unsigned char byte;
  22. #define off_t long
  23.  
  24. //#define I486_OPT 1
  25.  
  26. #define SKIP_JUNK 1
  27. # define M_PI       3.14159265358979323846
  28. # define M_SQRT2        1.41421356237309504880
  29. # define REAL_IS_FLOAT
  30. # define NEW_DCT9
  31.  
  32. #ifdef REAL_IS_FLOAT
  33. #  define real float
  34. #  define REAL_SCANF "%f"
  35. #  define REAL_PRINTF "%f"
  36. #else
  37. #  define real double
  38. #  define REAL_SCANF "%lf"
  39. #  define REAL_PRINTF "%f"
  40. #endif
  41.  
  42. #ifndef DOUBLE_TO_REAL
  43. # define DOUBLE_TO_REAL(x)     (x)
  44. #endif
  45. #ifndef REAL_TO_SHORT
  46. # define REAL_TO_SHORT(x)      (x)
  47. #endif
  48. #ifndef REAL_PLUS_32767
  49. # define REAL_PLUS_32767       32767.0
  50. #endif
  51. #ifndef REAL_MINUS_32768
  52. # define REAL_MINUS_32768      -32768.0
  53. #endif
  54. #ifndef REAL_MUL
  55. # define REAL_MUL(x, y)                ((x) * (y))
  56. #endif
  57.  
  58. #define INLINE
  59. /* AUDIOBUFSIZE = n*64 with n=1,2,3 ...  */
  60. #define         AUDIOBUFSIZE            16384
  61.  
  62. #define         FALSE                   0
  63. #define         TRUE                    1
  64.  
  65. #define         MAX_NAME_SIZE           81
  66. #define         SBLIMIT                 32
  67. #define         SCALE_BLOCK             12
  68. #define         SSLIMIT                 18
  69.  
  70. #define         MPG_MD_STEREO           0
  71. #define         MPG_MD_JOINT_STEREO     1
  72. #define         MPG_MD_DUAL_CHANNEL     2
  73. #define         MPG_MD_MONO             3
  74.  
  75. /* I suspect that 32767 would be a better idea here, but Michael put this in... */
  76. #define MAXOUTBURST 32768
  77.  
  78. /* Pre Shift fo 16 to 8 bit converter table */
  79. #define AUSHIFT (3)
  80.  
  81. struct bitstream_info
  82. {  int bitindex;
  83.     unsigned char *wordpointer;
  84. };
  85. extern struct bitstream_info bsi;
  86.  
  87. struct reader
  88. {  
  89.     char *hFile;
  90.     unsigned char *buffer;
  91.     unsigned char *stream;
  92.     int strpos;
  93.     int strremain;
  94.     int filelen;
  95.     int filepos;
  96.  
  97.     int  (*head_read)(struct reader *,unsigned long *newhead);
  98.     int  (*read_frame_body)(struct reader *,unsigned char *,int size);
  99.  };
  100.  
  101. int parse_new_id3(struct reader *rd, unsigned long newhead);
  102.  
  103. struct al_table
  104. { short bits;
  105.     short d;
  106. };
  107.  
  108. struct frame {
  109.     struct al_table *alloc;
  110.     int (*synth)(real *,int,unsigned char *,int *);
  111.     int (*synth_mono)(real *,unsigned char *,int *);
  112.     int stereo; /* I _think_ 1 for mono and 2 for stereo */
  113.     int jsbound;
  114.     int single;
  115.     int II_sblimit;
  116.     int down_sample_sblimit;
  117.     int lsf; /* 0: MPEG 1.0; 1: MPEG 2.0/2.5 -- both used as bool and array index! */
  118.     int mpeg25;
  119.     int down_sample;
  120.     int header_change;
  121.     int lay;
  122.     int (*do_layer)(struct frame *fr,byte *pcm_out, int *pcm_size);
  123.     int error_protection;
  124.     int bitrate_index;
  125.     int sampling_frequency;
  126.     int padding;
  127.     int extension;
  128.     int mode;
  129.     int mode_ext;
  130.     int copyright;
  131.     int original;
  132.     int emphasis;
  133.     int framesize; /* computed framesize */
  134.     int vbr; /* 1 if variable bitrate was detected */
  135.                 unsigned long num; /* the nth frame in some stream... */
  136. };
  137.  
  138. #if 0
  139. struct parameter {
  140.   int aggressive; /* renice to max. priority */
  141.   int shuffle;  /* shuffle/random play */
  142.   int remote;   /* remote operation */
  143.   int remote_err;       /* remote operation to stderr */
  144.   int outmode;  /* where to out the decoded sampels */
  145.   int quiet;    /* shut up! */
  146.   int xterm_title;      /* Change xterm title to song names? */
  147.   long usebuffer;       /* second level buffer size */
  148.   int tryresync;  /* resync stream after error */
  149.   int verbose;    /* verbose level */
  150.   int force_mono;
  151.   int force_stereo;
  152.   int force_8bit;
  153.   long force_rate;
  154.   int down_sample;
  155.   int checkrange;
  156.   long doublespeed;
  157.   long halfspeed;
  158.   int force_reopen;
  159.   long realtime;
  160.   char filename[256];
  161.   long listentry; /* possibility to choose playback of one entry in playlist (0: off, > 0 : select, < 0; just show list*/
  162.   int rva; /* (which) rva to do: <0: nothing, 0: radio/mix/track 1: album/audiophile */
  163.   char* listname; /* name of playlist */
  164.   int long_id3;
  165. };
  166. #endif
  167.  
  168. #if 0
  169. struct reader {
  170.   int  (*init)(struct reader *);
  171.   void (*close)(struct reader *);
  172.   int  (*head_read)(struct reader *,unsigned long *newhead);
  173.   int  (*head_shift)(struct reader *,unsigned long *head);
  174.   long  (*skip_bytes)(struct reader *,off_t len);
  175.   int  (*read_frame_body)(struct reader *,unsigned char *,int size);
  176.   int  (*back_bytes)(struct reader *,off_t bytes);
  177.   int  (*back_frame)(struct reader *,struct frame *,long num);
  178.   off_t (*tell)(struct reader *);
  179.   void (*rewind)(struct reader *);
  180.   off_t filelen;
  181.   off_t filepos;
  182.   int  filept;
  183.   int  flags;
  184.   unsigned char id3buf[128];
  185. };
  186. #endif
  187.  
  188. #define READER_FD_OPENED 0x1
  189. #define READER_ID3TAG    0x2
  190. #define READER_SEEKABLE  0x4
  191.  
  192. //extern void audio_flush(int, struct audio_info_struct *);
  193.  
  194. //extern void print_header(struct frame *);
  195. //extern void print_header_compact(struct frame *);
  196. //extern void print_id3_tag(unsigned char *buf);
  197.  
  198. //extern int split_dir_file(const char *path, char **dname, char **fname);
  199.  
  200. extern unsigned int   get1bit(void);
  201. extern unsigned int   getbits(int);
  202. extern unsigned int   getbits_fast(int);
  203. //extern void           backbits(int);
  204. //extern int            getbitoffset(void);
  205. //extern int            getbyte(void);
  206.  
  207. //extern void set_pointer(long);
  208.  
  209. //extern unsigned char *pcm_sample;
  210. //extern int pcm_point;
  211. //extern int audiobufsize;
  212.  
  213. //extern int OutputDescriptor;
  214.  
  215. #ifdef VARMODESUPPORT
  216. extern int varmode;
  217. extern int playlimit;
  218. #endif
  219.  
  220. struct gr_info_s {
  221.       int scfsi;
  222.       unsigned part2_3_length;
  223.       unsigned big_values;
  224.       unsigned scalefac_compress;
  225.       unsigned block_type;
  226.       unsigned mixed_block_flag;
  227.       unsigned table_select[3];
  228.       unsigned subblock_gain[3];
  229.       unsigned maxband[3];
  230.       unsigned maxbandl;
  231.       unsigned maxb;
  232.       unsigned region1start;
  233.       unsigned region2start;
  234.       unsigned preflag;
  235.       unsigned scalefac_scale;
  236.       unsigned count1table_select;
  237.       real *full_gain[3];
  238.       real *pow2gain;
  239. };
  240.  
  241. struct III_sideinfo
  242. {
  243.   unsigned main_data_begin;
  244.   unsigned private_bits;
  245.   struct {
  246.     struct gr_info_s gr[2];
  247.   } ch[2];
  248. };
  249.  
  250. extern int open_stream(char *,int fd);
  251. extern void read_frame_init (struct frame* fr);
  252. int read_frame(struct reader *rd, struct frame *fr);
  253.  
  254.  
  255. /* why extern? */
  256. void prepare_audioinfo(struct frame *fr, struct audio_info_struct *nai);
  257. int play_frame(int init,struct frame *fr);
  258. int do_layer1(struct frame *fr,byte *pcm_sample, int *pcm_point);
  259. int do_layer2(struct frame *fr,byte *pcm_sample, int *pcm_point);
  260. int do_layer3(struct frame *fr,byte *pcm_sample, int *pcm_point);
  261. extern void do_equalizer(real *bandPtr,int channel);
  262.  
  263. #ifdef PENTIUM_OPT
  264. extern int synth_1to1_pent (real *,int,unsigned char *);
  265. #endif
  266. extern int synth_1to1 (real *,int,unsigned char *,int *);
  267. extern int synth_1to1_8bit (real *,int,unsigned char *,int *);
  268. extern int synth_1to1_mono (real *,unsigned char *,int *);
  269. extern int synth_1to1_mono2stereo (real *,unsigned char *,int *);
  270. extern int synth_1to1_8bit_mono (real *,unsigned char *,int *);
  271. extern int synth_1to1_8bit_mono2stereo (real *,unsigned char *,int *);
  272.  
  273. extern int synth_2to1 (real *,int,unsigned char *,int *);
  274. extern int synth_2to1_8bit (real *,int,unsigned char *,int *);
  275. extern int synth_2to1_mono (real *,unsigned char *,int *);
  276. extern int synth_2to1_mono2stereo (real *,unsigned char *,int *);
  277. extern int synth_2to1_8bit_mono (real *,unsigned char *,int *);
  278. extern int synth_2to1_8bit_mono2stereo (real *,unsigned char *,int *);
  279.  
  280. extern int synth_4to1 (real *,int,unsigned char *,int *);
  281. extern int synth_4to1_8bit (real *,int,unsigned char *,int *);
  282. extern int synth_4to1_mono (real *,unsigned char *,int *);
  283. extern int synth_4to1_mono2stereo (real *,unsigned char *,int *);
  284. extern int synth_4to1_8bit_mono (real *,unsigned char *,int *);
  285. extern int synth_4to1_8bit_mono2stereo (real *,unsigned char *,int *);
  286.  
  287. extern int synth_ntom (real *,int,unsigned char *,int *);
  288. extern int synth_ntom_8bit (real *,int,unsigned char *,int *);
  289. extern int synth_ntom_mono (real *,unsigned char *,int *);
  290. extern int synth_ntom_mono2stereo (real *,unsigned char *,int *);
  291. extern int synth_ntom_8bit_mono (real *,unsigned char *,int *);
  292. extern int synth_ntom_8bit_mono2stereo (real *,unsigned char *,int *);
  293.  
  294. extern void rewindNbits(int bits);
  295. extern int  hsstell(void);
  296. extern void set_pointer(long);
  297. extern void huffman_decoder(int ,int *);
  298. extern void huffman_count1(int,int *);
  299. extern void print_stat(struct frame *fr,unsigned long no,long buffsize,struct audio_info_struct *ai);
  300. extern int get_songlen(struct frame *fr,int no);
  301.  
  302. extern void init_layer3(int);
  303. extern void init_layer2(void);
  304. extern void make_decode_tables(long scale);
  305. extern int make_conv16to8_table(int);
  306. extern void dct64(real *,real *,real *);
  307.  
  308. #ifdef USE_MMX
  309. extern void dct64_MMX(short *a,short *b,real *c);
  310. extern int synth_1to1_MMX(real *, int, short *, short *, int *);
  311. #endif
  312.  
  313. extern int synth_ntom_set_step(long,long);
  314.  
  315.  
  316. extern unsigned char *conv16to8;
  317. extern long freqs[9];
  318. extern real muls[27][64];
  319. extern real decwin[512+32];
  320. #ifndef USE_MMX
  321. extern real *pnts[5];
  322. #endif
  323.  
  324. extern real equalizer[2][32];
  325. extern real equalizer_sum[2][32];
  326. extern int equalizer_cnt;
  327.  
  328. extern struct audio_name audio_val2name[];
  329.  
  330. //extern struct parameter param;
  331.  
  332. /* 486 optimizations */
  333. #define FIR_BUFFER_SIZE  128
  334. extern void dct64_486(int *a,int *b,real *c);
  335. extern int synth_1to1_486(real *bandPtr,int channel,unsigned char *out,int nb_blocks);
  336.  
  337. /* 3DNow! optimizations */
  338. #ifdef USE_3DNOW
  339. extern int getcpuflags(void);
  340. extern void dct36(real *,real *,real *,real *,real *);
  341. extern void dct36_3dnow(real *,real *,real *,real *,real *);
  342. extern int synth_1to1_3dnow(real *,int,unsigned char *,int *);
  343. #endif
  344.  
  345. /* avoid the SIGINT in terminal control */
  346. void next_track(void);
  347. extern long outscale;
  348.  
  349. #endif
  350.  
  351. void set_pointer(long backstep);
  352. int __stdcall create_reader(struct reader *rd,byte *buffer, int buffsize);
  353. int __stdcall init_reader(struct reader *rd, char *file);
  354. int __stdcall decode_header(struct frame *fr,unsigned long newhead);
  355. int __stdcall set_reader(struct reader *rd, unsigned int filepos);
  356. double pow_test(double, double);
  357. void * __cdecl mem_cpy(void * dst,const void * src,size_t count);
  358. void init_dct();
  359. void reset_mpg();
  360. #ifdef __cplusplus
  361. }
  362. #endif
  363.