aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/iem_mp3/iem_mp3.c72
-rw-r--r--src/iem_mp3/sigmp3play.c7728
-rw-r--r--src/iem_t3_lib/iem_t3_lib.c132
-rw-r--r--src/iem_t3_lib/sigt3_line.c558
-rw-r--r--src/iem_t3_lib/sigt3_sig.c400
-rw-r--r--src/iem_t3_lib/t3_bpe.c282
-rw-r--r--src/iem_t3_lib/t3_delay.c192
-rw-r--r--src/iem_t3_lib/t3_metro.c240
-rw-r--r--src/iem_t3_lib/t3_timer.c110
-rw-r--r--src/iemlib2/makefile_win1
10 files changed, 4857 insertions, 4858 deletions
diff --git a/src/iem_mp3/iem_mp3.c b/src/iem_mp3/iem_mp3.c
index ada504a..ab1356a 100644
--- a/src/iem_mp3/iem_mp3.c
+++ b/src/iem_mp3/iem_mp3.c
@@ -1,36 +1,36 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_mp3 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-
-static t_class *iem_mp3_class;
-
-static void *iem_mp3_new(void)
-{
- t_object *x = (t_object *)pd_new(iem_mp3_class);
-
- return (x);
-}
-
-void sigmp3play_setup(void);
-
-/* ------------------------ setup routine ------------------------- */
-
-void iem_mp3_setup(void)
-{
- iem_mp3_class = class_new(gensym("iem_mp3"), iem_mp3_new, 0,
- sizeof(t_object), CLASS_NOINLET, 0);
-
- sigmp3play_setup();
-
- post("iem_mp3 (R-1.16) library loaded! (c) Thomas Musil 05.2005");
- post(" musil%ciem.at iem KUG Graz Austria", '@');
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_mp3 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+
+static t_class *iem_mp3_class;
+
+static void *iem_mp3_new(void)
+{
+ t_object *x = (t_object *)pd_new(iem_mp3_class);
+
+ return (x);
+}
+
+void sigmp3play_setup(void);
+
+/* ------------------------ setup routine ------------------------- */
+
+void iem_mp3_setup(void)
+{
+ iem_mp3_class = class_new(gensym("iem_mp3"), iem_mp3_new, 0,
+ sizeof(t_object), CLASS_NOINLET, 0);
+
+ sigmp3play_setup();
+
+ post("iem_mp3 (R-1.16) library loaded! (c) Thomas Musil 05.2005");
+ post(" musil%ciem.at iem KUG Graz Austria", '@');
+}
diff --git a/src/iem_mp3/sigmp3play.c b/src/iem_mp3/sigmp3play.c
index 64304fc..81927a4 100644
--- a/src/iem_mp3/sigmp3play.c
+++ b/src/iem_mp3/sigmp3play.c
@@ -1,3864 +1,3864 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_mp3 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-/*
- sigmp3play.c - Mpeg Layer III Player for PD
- Version:0.1
- 05-18-2000
- written by Thomas Musil (musil_at_iem.kug.ac.at), Norbert Math (math_at_iem.kug.ac.at)
- IEM Graz
-
- debugged for windows 013-03-2003
-
- This MPEG Player is based on the mpglib 0.2 by Michael Hipp which comes with mpg123-0.59r
-
- please see the README file for copyright notices!
-
- */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <ctype.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <math.h>
-
-#ifndef NT
-#include <sys/signal.h>
-#include <unistd.h>
-#endif
-
-
-#define IEM_MPEG1
-
-#ifdef _WIN32
-# undef WIN32
-# define WIN32
-
-# define M_PI 3.14159265358979323846
-# define M_SQRT2 1.41421356237309504880
-# define REAL_IS_FLOAT
-# define NEW_DCT9
-
-# define random rand
-# define srandom srand
-
-#endif
-
-#ifdef REAL_IS_FLOAT
-# define real float
-#elif defined(REAL_IS_LONG_DOUBLE)
-# define real long double
-#else
-# define real double
-#endif
-
-#ifdef __GNUC__
-#define INLINE inline
-#else
-#define INLINE
-#endif
-
-/* AUDIOBUFSIZE = n*64 with n=1,2,3 ... */
-#define AUDIOBUFSIZE 16384
-
-#define FALSE 0
-#define TRUE 1
-#define SBLIMIT 32
-#define SSLIMIT 18
-#define MPG_MD_STEREO 0
-#define MPG_MD_JOINT_STEREO 1
-#define MPG_MD_DUAL_CHANNEL 2
-#define MPG_MD_MONO 3
-
-#define MAXFRAMESIZE 1792
-/* Pre Shift fo 16 to 8 bit converter table */
-#define AUSHIFT (3)
-#define BOOL int
-#define MP3_EX -2
-#define MP3_ERR -1
-#define MP3_OK 0
-#define MP3_NEED_MORE 1
-
-#define WRITE_SAMPLE(samples,sum,clip) \
- if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
- else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
- else { *(samples) = sum; }
-
-
-#define HDRCMPMASK 0xfffffd00
-
-
-#define MY_MP3_MALLOC_IN_SIZE 16384
-#define MY_MP3_MALLOC_IN_SIZE2 8192
-#define MY_MP3_MALLOC_OUT_SIZE 65536
-#define MY_MP3_MALLOC_FN 400
-#define MY_MP3_CHSAMP_PER_FRAME 1152
-
-struct iemmp3_frame
-{
- int stereo;
- int jsbound;
- int single;
- int lsf;
- int mpeg25;
- int header_change;
- int lay;
- int error_protection;
- int bitrate_index;
- int sampling_frequency;
- int padding;
- int extension;
- int mode;
- int mode_ext;
- int copyright;
- int original;
- int emphasis;
- int framesize; /* computed framesize */
-};
-
-struct iemmp3_gr_info_s
-{
- int scfsi;
- unsigned part2_3_length;
- unsigned big_values;
- unsigned scalefac_compress;
- unsigned block_type;
- unsigned mixed_block_flag;
- unsigned table_select[3];
- unsigned subblock_gain[3];
- unsigned maxband[3];
- unsigned maxbandl;
- unsigned maxb;
- unsigned region1start;
- unsigned region2start;
- unsigned preflag;
- unsigned scalefac_scale;
- unsigned count1table_select;
- real *full_gain[3];
- real *pow2gain;
-};
-
-struct iemmp3_III_sideinfo
-{
- unsigned main_data_begin;
- unsigned private_bits;
- struct
- {
- struct iemmp3_gr_info_s gr[2];
- } ch[2];
-};
-
-struct iemmp3_buf
-{
- unsigned char *pnt;
- long size;
- long pos;
- struct iemmp3_buf *next;
- struct iemmp3_buf *prev;
-};
-
-struct iemmp3Struct
-{
- struct iemmp3_buf *head,*tail;
- int bsize;
- int framesize;
- int fsizeold;
- struct iemmp3_frame fr;
- unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */
- real hybrid_block[2][2][SBLIMIT*SSLIMIT];
- int hybrid_blc[2];
- unsigned long header;
- int bsnum;
- real synth_buffs[2][2][0x110];
- int synth_bo;
-};
-
-struct iemmp3_bandInfoStruct
-{
- short longIdx[23];
- short longDiff[22];
- short shortIdx[14];
- short shortDiff[13];
-};
-
-struct iemmp3_newHuff
-{
- unsigned int linbits;
- short *table;
-};
-
-
-typedef struct _sigmp3play
-{
- t_object x_obj;
- float length_sec;
- int samp_per_frame;
- int frame_counter;
- int time1_bang0_handle;
- float time_factor;
- int *begframeseek;
- int curframeseek;
- int maxframeseek;
- char *filename;
- float offset_sec;
- int file_is_open;
- int play_state;
- int mp3_encode_size;
- int mp3_out_index;
- int file_size;
- int file_block_num;
- int file_remain;
- int mp_is_init;
- int mp3_ch;
- int mp3_sr;
- int mp3_byterate;
- int obj_sr;
- int obj_n;
- int down;
- float scale;
- FILE *fh;
- char *mp3inbuf;
- char *mp3outbuf;
- struct iemmp3Struct mp;
- t_clock *x_clock;
- t_outlet *x_bangout;
- t_outlet *x_floatout;
- t_canvas *x_canvas;
-} t_sigmp3play;
-
-
-
-static BOOL InitMP3 (struct iemmp3Struct *mp);
-static BOOL InitAgainMP3(struct iemmp3Struct *mp);
-static void ExitMP3 (struct iemmp3Struct *mp);
-static int decodeMP3 (struct iemmp3Struct *mp, char *in, int isize, char *out, int osize, int *done);
-static void make_decode_tables (long scaleval);
-static void init_layer3 (int down_sample_sblimit);
-static int decode_header (struct iemmp3_frame *fr,unsigned long newhead);
-static int do_layer3(struct iemmp3_frame *fr,unsigned char *pcm_sample,int *pcm_point,int *err);
-static int set_pointer(long backstep);
-static int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt);
-static int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt);
-static struct iemmp3_buf *addbuf(struct iemmp3Struct *mp,char *buf,int size);
-static void remove_buf(struct iemmp3Struct *mp);
-static int read_head(struct iemmp3Struct *mp);
-static int read_buf_byte(struct iemmp3Struct *mp,int *err);
-static int III_get_side_info_2(struct iemmp3_III_sideinfo *si,int stereo, int ms_stereo,long sfreq,int single);
-#ifdef IEM_MPEG1
-static int III_get_side_info_1(struct iemmp3_III_sideinfo *si,int stereo,int ms_stereo,long sfreq,int single);
-static int III_get_scale_factors_1(int *scf,struct iemmp3_gr_info_s *gr_info);
-#endif
-static int III_get_scale_factors_2(int *scf,struct iemmp3_gr_info_s *gr_info,int i_stereo);
-static int III_dequantize_sample(real xr[SBLIMIT][SSLIMIT],int *scf,struct iemmp3_gr_info_s *gr_info,int sfreq,int part2bits);
-static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,struct iemmp3_gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf);
-static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct iemmp3_gr_info_s *gr_info);
-static void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],int ch,struct iemmp3_gr_info_s *gr_info);
-static void dct64(real *a,real *b,real *c);
-static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples);
-static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf);
-static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts);
-static unsigned int getbits(int number_of_bits);
-static unsigned int getbits_fast(int number_of_bits);
-static unsigned int get1bit(void);
-
-static void sigmp3play_tick(t_sigmp3play *x);
-
-
-struct iemmp3Struct *iemmp3_gmp;
-
-int iemmp3_tabsel_123[2][3][16] = {
- { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
- {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
- {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
-
- { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
- {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
- {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
-};
-
-long iemmp3_freqs[9] = { 44100, 48000, 32000,
-22050, 24000, 16000 ,
-11025 , 12000 , 8000 };
-
-int iemmp3_bitindex;
-unsigned char *iemmp3_wordpointer;
-
-static real iemmp3_ispow[8207];
-static real iemmp3_aa_ca[8],iemmp3_aa_cs[8];
-static real iemmp3_COS1[12][6];
-static real iemmp3_win[4][36];
-static real iemmp3_win1[4][36];
-static real iemmp3_gainpow2[256+118+4];
-static real iemmp3_COS9[9];
-static real iemmp3_COS6_1,iemmp3_COS6_2;
-static real iemmp3_tfcos36[9];
-static real iemmp3_tfcos12[3];
-
-int iemmp3_longLimit[9][23];
-int iemmp3_shortLimit[9][14];
-
-struct iemmp3_bandInfoStruct bandInfo[9] = {
-
- /* MPEG 1.0 */
- { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
- {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158},
- {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3},
- {4,4,4,4,6,8,10,12,14,18,22,30,56} } ,
-
- { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576},
- {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192},
- {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3},
- {4,4,4,4,6,6,10,12,14,16,20,26,66} } ,
-
- { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} ,
- {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} ,
- {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} ,
- {4,4,4,4,6,8,12,16,20,26,34,42,12} } ,
-
- /* MPEG 2.0 */
- { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
- {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
- {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
- {4,4,4,6,6,8,10,14,18,26,32,42,18 } } ,
-
- { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
- {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } ,
- {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} ,
- {4,4,4,6,8,10,12,14,18,24,32,44,12 } } ,
-
- { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
- {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 },
- {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3},
- {4,4,4,6,8,10,12,14,18,24,30,40,18 } } ,
- /* MPEG 2.5 */
- { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
- {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
- {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
- {4,4,4,6,8,10,12,14,18,24,30,40,18} },
- { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
- {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
- {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
- {4,4,4,6,8,10,12,14,18,24,30,40,18} },
- { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
- {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2},
- {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576},
- {8,8,8,12,16,20,24,28,36,2,2,2,26} } ,
-};
-
-static int iemmp3_mapbuf0[9][152];
-static int iemmp3_mapbuf1[9][156];
-static int iemmp3_mapbuf2[9][44];
-static int *iemmp3_map[9][3];
-static int *iemmp3_mapend[9][3];
-
-static unsigned int iemmp3_n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
-static unsigned int iemmp3_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
-
-static real iemmp3_tan1_1[16],iemmp3_tan2_1[16],iemmp3_tan1_2[16],iemmp3_tan2_2[16];
-static real iemmp3_pow1_1[2][16],iemmp3_pow2_1[2][16],iemmp3_pow1_2[2][16],iemmp3_pow2_2[2][16];
-
-static int iemmp3_pretab1[22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
-static int iemmp3_pretab2[22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
-real iemmp3_decwin[512+32];
-static real iemmp3_cos64[16],iemmp3_cos32[8],iemmp3_cos16[4],iemmp3_cos8[2],iemmp3_cos4[1];
-real *iemmp3_pnts[] = { iemmp3_cos64,iemmp3_cos32,iemmp3_cos16,iemmp3_cos8,iemmp3_cos4 };
-
-static long iemmp3_intwinbase[] = {
- 0, -1, -1, -1, -1, -1, -1, -2, -2, -2,
- -2, -3, -3, -4, -4, -5, -5, -6, -7, -7,
- -8, -9, -10, -11, -13, -14, -16, -17, -19, -21,
- -24, -26, -29, -31, -35, -38, -41, -45, -49, -53,
- -58, -63, -68, -73, -79, -85, -91, -97, -104, -111,
- -117, -125, -132, -139, -147, -154, -161, -169, -176, -183,
- -190, -196, -202, -208, -213, -218, -222, -225, -227, -228,
- -228, -227, -224, -221, -215, -208, -200, -189, -177, -163,
- -146, -127, -106, -83, -57, -29, 2, 36, 72, 111,
- 153, 197, 244, 294, 347, 401, 459, 519, 581, 645,
- 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356,
- 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962,
- 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000,
- 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970,
- 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388,
- -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
- -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209,
- -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959,
- -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092,
- -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082,
- -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455,
- 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289,
- 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617,
- 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684,
- 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835,
- 73415, 73908, 74313, 74630, 74856, 74992, 75038 };
-
-static short iemmp3_tab0[] =
-{
- 0
-};
-
-static short iemmp3_tab1[] =
-{
- -5, -3, -1, 17, 1, 16, 0
-};
-
-static short iemmp3_tab2[] =
-{
- -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1,
- 16, 0
-};
-
-static short iemmp3_tab3[] =
-{
- -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1,
- 1, 0
-};
-
-static short iemmp3_tab5[] =
-{
- -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19,
- 3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16,
- 0
-};
-
-static short iemmp3_tab6[] =
-{
- -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19,
- 49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16,
- 0
-};
-
-static short iemmp3_tab7[] =
-{
- -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83,
- -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1,
- 80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7,
- -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18,
- -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0
-};
-
-static short iemmp3_tab8[] =
-{
- -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83,
- -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52,
- 67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4,
- 64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1,
- 2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0
-};
-
-static short iemmp3_tab9[] =
-{
- -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1,
- 84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67,
- -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5,
- -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2,
- 18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0
-};
-
-static short iemmp3_tab10[] =
-{
- -125,-121,-111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1, 118,
- 87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3,
- -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1,
- 100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23,
- -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81,
- -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7,
- -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1,
- 50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1,
- 2, 32, 17, -1, 1, 16, 0
-};
-
-static short iemmp3_tab11[] =
-{
- -121,-113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118, 117,
- -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55,
- -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114,
- -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96,
- -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38,
- 6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1,
- 36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50,
- -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2,
- 32, 17, -3, -1, 1, 16, 0
-};
-
-static short iemmp3_tab12[] =
-{
- -115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87,
- 117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115,
- 85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7,
- 112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5,
- -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37,
- 82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4,
- 36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3,
- -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1,
- 2, 32, 0, 17, -1, 1, 16
-};
-
-static short iemmp3_tab13[] =
-{
- -509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13, -9,
- -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238,
- 207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1,
- 236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249,
- 234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158,
- -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1,
- 203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245,
- 231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1,
- 63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15,
- -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1,
- 200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1,
- 240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1,
- 46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3,
- -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1,
- 198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5,
- -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167,
- 151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76,
- 196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137,
- 28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106,
- -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43,
- -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178,
- -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1,
- 58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161,
- -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88,
- -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1,
- 131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25,
- 145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100,
- 40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113,
- -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38,
- -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6,
- 96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81,
- -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11,
- -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3,
- -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16,
- 0
-};
-
-static short iemmp3_tab15[] =
-{
- -495,-445,-355,-263,-183,-115, -77, -43, -27, -13, -7, -3, -1, 255, 239,
- -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237,
- 191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3,
- -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219,
- -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173,
- -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246,
- -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9,
- -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243,
- 216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1,
- 31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1,
- 125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3,
- -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5,
- -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124,
- 199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1,
- 198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183,
- -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76,
- -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1,
- 122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15,
- -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106,
- -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5,
- -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74,
- -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1,
- 42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134,
- 73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29,
- -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7,
- -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7,
- -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86,
- -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100,
- 23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69,
- -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9,
- -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1,
- 5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20,
- 4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48,
- 34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16,
- 0
-};
-
-static short iemmp3_tab16[] =
-{
- -509,-503,-461,-323,-103, -37, -27, -15, -7, -3, -1, 239, 254, -1, 223,
- 253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3,
- -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5,
- -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19,
- -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1,
- 238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5,
- -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125,
- 94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13,
- -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3,
- -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186,
- -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1,
- 214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169,
- -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213,
- -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154,
- 108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1,
- 153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1,
- 192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45,
- -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107,
- -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12,
- -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1,
- 178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74,
- 164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33,
- -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3,
- -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147,
- -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1,
- 145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3,
- -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1,
- 8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3,
- -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1,
- 99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9,
- -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33,
- -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20,
- -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1,
- 3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16,
- 0
-};
-
-static short iemmp3_tab24[] =
-{
- -451,-117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1,
- 207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9,
- -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79,
- 244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31,
- 240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1,
- 236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3,
- -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3,
- -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255,-235,
- -143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3,
- -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9,
- -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1,
- 78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185,
- 170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199,
- 77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3,
- -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3,
- -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196,
- -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1,
- 167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1,
- 137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10,
- 26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9,
- 144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165,
- 27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135,
- -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104,
- -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3,
- -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3,
- -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7,
- -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86,
- 101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15,
- -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84,
- -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1,
- 83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5,
- 80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5,
- -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1,
- 3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16,
- 0
-};
-
-static short iemmp3_tab_c0[] =
-{
- -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5,
- 9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8,
- 0
-};
-
-static short iemmp3_tab_c1[] =
-{
- -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9,
- 8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1,
- 0
-};
-
-
-
-static struct iemmp3_newHuff iemmp3_ht[] =
-{
- { /* 0 */ 0 , iemmp3_tab0 } ,
- { /* 2 */ 0 , iemmp3_tab1 } ,
- { /* 3 */ 0 , iemmp3_tab2 } ,
- { /* 3 */ 0 , iemmp3_tab3 } ,
- { /* 0 */ 0 , iemmp3_tab0 } ,
- { /* 4 */ 0 , iemmp3_tab5 } ,
- { /* 4 */ 0 , iemmp3_tab6 } ,
- { /* 6 */ 0 , iemmp3_tab7 } ,
- { /* 6 */ 0 , iemmp3_tab8 } ,
- { /* 6 */ 0 , iemmp3_tab9 } ,
- { /* 8 */ 0 , iemmp3_tab10 } ,
- { /* 8 */ 0 , iemmp3_tab11 } ,
- { /* 8 */ 0 , iemmp3_tab12 } ,
- { /* 16 */ 0 , iemmp3_tab13 } ,
- { /* 0 */ 0 , iemmp3_tab0 } ,
- { /* 16 */ 0 , iemmp3_tab15 } ,
-
- { /* 16 */ 1 , iemmp3_tab16 } ,
- { /* 16 */ 2 , iemmp3_tab16 } ,
- { /* 16 */ 3 , iemmp3_tab16 } ,
- { /* 16 */ 4 , iemmp3_tab16 } ,
- { /* 16 */ 6 , iemmp3_tab16 } ,
- { /* 16 */ 8 , iemmp3_tab16 } ,
- { /* 16 */ 10, iemmp3_tab16 } ,
- { /* 16 */ 13, iemmp3_tab16 } ,
- { /* 16 */ 4 , iemmp3_tab24 } ,
- { /* 16 */ 5 , iemmp3_tab24 } ,
- { /* 16 */ 6 , iemmp3_tab24 } ,
- { /* 16 */ 7 , iemmp3_tab24 } ,
- { /* 16 */ 8 , iemmp3_tab24 } ,
- { /* 16 */ 9 , iemmp3_tab24 } ,
- { /* 16 */ 11, iemmp3_tab24 } ,
- { /* 16 */ 13, iemmp3_tab24 }
-};
-
-static struct iemmp3_newHuff iemmp3_htc[] =
-{
- { /* 1 , 1 , */ 0 , iemmp3_tab_c0 } ,
- { /* 1 , 1 , */ 0 , iemmp3_tab_c1 }
-};
-
-
-static t_class *sigmp3play_class;
-
-
-
-static BOOL InitMP3(struct iemmp3Struct *mp)
-{
- memset(mp,0,sizeof(struct iemmp3Struct));
-
- mp->framesize = 0;
- mp->fsizeold = -1;
- mp->bsize = 0;
- mp->head = mp->tail = NULL;
- mp->fr.single = -1;
- mp->bsnum = 0;
- mp->synth_bo = 1;
-
- make_decode_tables(32767);
- init_layer3(SBLIMIT);
-
- return !0;
-}
-
-static BOOL InitAgainMP3(struct iemmp3Struct *mp)
-{
- memset(mp,0,sizeof(struct iemmp3Struct));
-
- mp->framesize = 0;
- mp->fsizeold = -1;
- mp->bsize = 0;
- mp->head = mp->tail = NULL;
- mp->fr.single = -1;
- mp->bsnum = 0;
- mp->synth_bo = 1;
-
- return !0;
-}
-
-static void ExitMP3(struct iemmp3Struct *mp)
-{
- struct iemmp3_buf *b,*bn;
-
- b = mp->tail;
- while(b)
- {
- free(b->pnt);
- bn = b->next;
- free(b);
- b = bn;
- }
-}
-
-static int decodeMP3(struct iemmp3Struct *mp, char *in, int isize, char *out, int osize, int *done)
-{
- int len,error=1;
-
- iemmp3_gmp = mp;
-
- if(osize < 4608)
- {
- post("To less out space\n");
- return MP3_ERR;
- }
-
- if(in)
- {
- if(addbuf(mp,in,isize) == NULL)
- {
- return MP3_ERR;
- }
- }
-
- /* First decode header */
- if(mp->framesize == 0)
- {
- if(mp->bsize < 4)
- {
- return MP3_NEED_MORE;
- }
- if(!read_head(mp))
- return MP3_EX;
- if(decode_header(&mp->fr,mp->header) == MP3_EX)
- return MP3_EX;
- mp->framesize = mp->fr.framesize;
- }
-
- if(mp->fr.framesize > mp->bsize)
- return MP3_NEED_MORE;
-
- iemmp3_wordpointer = mp->bsspace[mp->bsnum] + 512;
- mp->bsnum = (mp->bsnum + 1) & 0x1;
- iemmp3_bitindex = 0;
-
- len = 0;
- while(len < mp->framesize)
- {
- int nlen;
- int blen = mp->tail->size - mp->tail->pos;
- if( (mp->framesize - len) <= blen)
- {
- nlen = mp->framesize-len;
- }
- else
- {
- nlen = blen;
- }
- memcpy(iemmp3_wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen);
- len += nlen;
- mp->tail->pos += nlen;
- mp->bsize -= nlen;
- if(mp->tail->pos == mp->tail->size)
- {
- remove_buf(mp);
- }
- }
-
- *done = 0;
- if(mp->fr.error_protection)
- getbits(16);
- do_layer3(&mp->fr,(unsigned char *) out,done,&error);
- if(!error)
- return MP3_EX;
-
- mp->fsizeold = mp->framesize;
- mp->framesize = 0;
-
- return MP3_OK;
-}
-
-static void make_decode_tables(long scaleval)
-{
- int i,j,k,kr,divv;
- real *table,*costab;
-
- for(i=0;i<5;i++)
- {
- kr=0x10>>i; divv=0x40>>i;
- costab = iemmp3_pnts[i];
- for(k=0;k<kr;k++)
- costab[k] = 1.0 / (2.0 * cos(M_PI * ((double) k * 2.0 + 1.0) / (double) divv));
- }
-
- table = iemmp3_decwin;
- scaleval = -scaleval;
- for(i=0,j=0;i<256;i++,j++,table+=32)
- {
- if(table < iemmp3_decwin+512+16)
- table[16] = table[0] = (double) iemmp3_intwinbase[j] / 65536.0 * (double) scaleval;
- if(i % 32 == 31)
- table -= 1023;
- if(i % 64 == 63)
- scaleval = - scaleval;
- }
-
- for( /* i=256 */ ;i<512;i++,j--,table+=32)
- {
- if(table < iemmp3_decwin+512+16)
- table[16] = table[0] = (double) iemmp3_intwinbase[j] / 65536.0 * (double) scaleval;
- if(i % 32 == 31)
- table -= 1023;
- if(i % 64 == 63)
- scaleval = - scaleval;
- }
-}
-
-
-static void init_layer3(int down_sample_sblimit)
-{
- int i,j,k,l;
-
- for(i=-256;i<118+4;i++)
- iemmp3_gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) );
-
- for(i=0;i<8207;i++)
- iemmp3_ispow[i] = pow((double)i,(double)4.0/3.0);
-
- for (i=0;i<8;i++)
- {
- static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
- double sq=sqrt(1.0+Ci[i]*Ci[i]);
- iemmp3_aa_cs[i] = 1.0/sq;
- iemmp3_aa_ca[i] = Ci[i]/sq;
- }
-
- for(i=0;i<18;i++)
- {
- iemmp3_win[0][i] = iemmp3_win[1][i] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 );
- iemmp3_win[0][i+18] = iemmp3_win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
- }
- for(i=0;i<6;i++)
- {
- iemmp3_win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
- iemmp3_win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 );
- iemmp3_win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 );
- iemmp3_win[1][i+30] = iemmp3_win[3][i] = 0.0;
- iemmp3_win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 );
- }
-
- for(i=0;i<9;i++)
- iemmp3_COS9[i] = cos( M_PI / 18.0 * (double) i);
-
- for(i=0;i<9;i++)
- iemmp3_tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 );
- for(i=0;i<3;i++)
- iemmp3_tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 );
-
- iemmp3_COS6_1 = cos( M_PI / 6.0 * (double) 1);
- iemmp3_COS6_2 = cos( M_PI / 6.0 * (double) 2);
-
- for(i=0;i<12;i++)
- {
- iemmp3_win[2][i] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 );
- for(j=0;j<6;j++)
- iemmp3_COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) );
- }
-
- for(j=0;j<4;j++)
- {
- static int len[4] = { 36,36,12,36 };
- for(i=0;i<len[j];i+=2)
- iemmp3_win1[j][i] = + iemmp3_win[j][i];
- for(i=1;i<len[j];i+=2)
- iemmp3_win1[j][i] = - iemmp3_win[j][i];
- }
-
- for(i=0;i<16;i++)
- {
- double t = tan( (double) i * M_PI / 12.0 );
- iemmp3_tan1_1[i] = t / (1.0+t);
- iemmp3_tan2_1[i] = 1.0 / (1.0 + t);
- iemmp3_tan1_2[i] = M_SQRT2 * t / (1.0+t);
- iemmp3_tan2_2[i] = M_SQRT2 / (1.0 + t);
-
- for(j=0;j<2;j++)
- {
- double base = pow(2.0,-0.25*(j+1.0));
- double p1=1.0,p2=1.0;
- if(i > 0)
- {
- if( i & 1 )
- p1 = pow(base,(i+1.0)*0.5);
- else
- p2 = pow(base,i*0.5);
- }
- iemmp3_pow1_1[j][i] = p1;
- iemmp3_pow2_1[j][i] = p2;
- iemmp3_pow1_2[j][i] = M_SQRT2 * p1;
- iemmp3_pow2_2[j][i] = M_SQRT2 * p2;
- }
- }
-
- for(j=0;j<9;j++)
- {
- struct iemmp3_bandInfoStruct *bi = &bandInfo[j];
- int *mp;
- int cb,lwin;
- short *bdf;
-
- mp = iemmp3_map[j][0] = iemmp3_mapbuf0[j];
- bdf = bi->longDiff;
- for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++)
- {
- *mp++ = (*bdf) >> 1;
- *mp++ = i;
- *mp++ = 3;
- *mp++ = cb;
- }
- bdf = bi->shortDiff+3;
- for(cb=3;cb<13;cb++)
- {
- int l = (*bdf++) >> 1;
- for(lwin=0;lwin<3;lwin++)
- {
- *mp++ = l;
- *mp++ = i + lwin;
- *mp++ = lwin;
- *mp++ = cb;
- }
- i += 6*l;
- }
- iemmp3_mapend[j][0] = mp;
-
- mp = iemmp3_map[j][1] = iemmp3_mapbuf1[j];
- bdf = bi->shortDiff+0;
- for(i=0,cb=0;cb<13;cb++)
- {
- int l = (*bdf++) >> 1;
- for(lwin=0;lwin<3;lwin++)
- {
- *mp++ = l;
- *mp++ = i + lwin;
- *mp++ = lwin;
- *mp++ = cb;
- }
- i += 6*l;
- }
- iemmp3_mapend[j][1] = mp;
-
- mp = iemmp3_map[j][2] = iemmp3_mapbuf2[j];
- bdf = bi->longDiff;
- for(cb = 0; cb < 22 ; cb++)
- {
- *mp++ = (*bdf++) >> 1;
- *mp++ = cb;
- }
- iemmp3_mapend[j][2] = mp;
- }
-
- for(j=0;j<9;j++)
- {
- for(i=0;i<23;i++)
- {
- iemmp3_longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
- if(iemmp3_longLimit[j][i] > (down_sample_sblimit) )
- iemmp3_longLimit[j][i] = down_sample_sblimit;
- }
- for(i=0;i<14;i++)
- {
- iemmp3_shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
- if(iemmp3_shortLimit[j][i] > (down_sample_sblimit) )
- iemmp3_shortLimit[j][i] = down_sample_sblimit;
- }
- }
-
- for(i=0;i<5;i++)
- {
- for(j=0;j<6;j++)
- {
- for(k=0;k<6;k++)
- {
- int n = k + j * 6 + i * 36;
- iemmp3_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
- }
- }
- }
- for(i=0;i<4;i++)
- {
- for(j=0;j<4;j++)
- {
- for(k=0;k<4;k++)
- {
- int n = k + j * 4 + i * 16;
- iemmp3_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
- }
- }
- }
- for(i=0;i<4;i++)
- {
- for(j=0;j<3;j++)
- {
- int n = j + i * 3;
- iemmp3_slen2[n+244] = i|(j<<3) | (5<<12);
- iemmp3_n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
- }
- }
-
- for(i=0;i<5;i++)
- {
- for(j=0;j<5;j++)
- {
- for(k=0;k<4;k++)
- {
- for(l=0;l<4;l++)
- {
- int n = l + k * 4 + j * 16 + i * 80;
- iemmp3_n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
- }
- }
- }
- }
- for(i=0;i<5;i++)
- {
- for(j=0;j<5;j++)
- {
- for(k=0;k<4;k++)
- {
- int n = k + j * 4 + i * 20;
- iemmp3_n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
- }
- }
- }
-}
-
-static void remove_buf(struct iemmp3Struct *mp)
-{
- struct iemmp3_buf *buf = mp->tail;
-
- mp->tail = buf->next;
- if(mp->tail)
- mp->tail->prev = NULL;
- else
- {
- mp->tail = mp->head = NULL;
- }
- free(buf->pnt);
- free(buf);
-}
-
-static struct iemmp3_buf *addbuf(struct iemmp3Struct *mp,char *buf,int size)
-{
- struct iemmp3_buf *nbuf;
-
- nbuf = malloc( sizeof(struct iemmp3_buf) );
- if(!nbuf)
- {
- post("Out of memory!\n");
- return NULL;
- }
- nbuf->pnt = malloc(size);
- if(!nbuf->pnt)
- {
- free(nbuf);
- return NULL;
- }
- nbuf->size = size;
- memcpy(nbuf->pnt,buf,size);
- nbuf->next = NULL;
- nbuf->prev = mp->head;
- nbuf->pos = 0;
- if(!mp->tail)
- {
- mp->tail = nbuf;
- }
- else
- {
- mp->head->next = nbuf;
- }
- mp->head = nbuf;
- mp->bsize += size;
- return nbuf;
-}
-
-static int read_buf_byte(struct iemmp3Struct *mp,int *err)
-{
- unsigned int b;
- int pos;
-
- pos = mp->tail->pos;
- while(pos >= mp->tail->size)
- {
- remove_buf(mp);
- pos = mp->tail->pos;
- if(!mp->tail)
- {
- post("Fatal error!\n");
- *err = 0;
- return(0);
- }
- }
- b = mp->tail->pnt[pos];
- mp->bsize--;
- mp->tail->pos++;
- return(b);
-}
-
-static int read_head(struct iemmp3Struct *mp)
-{
- unsigned long head;
- int error=1;
-
- head = read_buf_byte(mp,&error);
- head <<= 8;
- head |= read_buf_byte(mp,&error);
- head <<= 8;
- head |= read_buf_byte(mp,&error);
- head <<= 8;
- head |= read_buf_byte(mp,&error);
- mp->header = head;
- return(error);
-}
-
-static int decode_header(struct iemmp3_frame *fr,unsigned long newhead)
-{
- if( newhead & (1<<20) )
- {
- fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1;
- fr->mpeg25 = 0;
- }
- else
- {
- fr->lsf = 1;
- fr->mpeg25 = 1;
- }
- fr->lay = 4-((newhead>>17)&3);
- if( ((newhead>>10)&0x3) == 0x3)
- {
- post("Stream error");
- return(MP3_EX);
- }
- if(fr->mpeg25)
- {
- fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
- }
- else
- fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
- fr->error_protection = ((newhead>>16)&0x1)^0x1;
- if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */
- fr->bitrate_index = ((newhead>>12)&0xf);
- fr->bitrate_index = ((newhead>>12)&0xf);
- fr->padding = ((newhead>>9)&0x1);
- fr->extension = ((newhead>>8)&0x1);
- fr->mode = ((newhead>>6)&0x3);
- fr->mode_ext = ((newhead>>4)&0x3);
- fr->copyright = ((newhead>>3)&0x1);
- fr->original = ((newhead>>2)&0x1);
- fr->emphasis = newhead & 0x3;
- fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
- if(!fr->bitrate_index)
- {
- post("Free format not supported.\n");
- return(0);
- }
- switch(fr->lay)
- {
- case 1:
- post("Layer I not supported!\n");
- break;
- case 2:
- post("Layer II not supported!\n");
- break;
- case 3:
- fr->framesize = (long) iemmp3_tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
- fr->framesize /= iemmp3_freqs[fr->sampling_frequency]<<(fr->lsf);
- fr->framesize = fr->framesize + fr->padding - 4;
- //post("Framesize: %d",fr->framesize);
- break;
- default:
- post("Sorry, unknown layer type.\n");
- return (0);
- }
- return(1);
-}
-
-static unsigned int getbits(int number_of_bits)
-{
- unsigned long rval;
-
- if(!number_of_bits)
- return 0;
- {
- rval = iemmp3_wordpointer[0];
- rval <<= 8;
- rval |= iemmp3_wordpointer[1];
- rval <<= 8;
- rval |= iemmp3_wordpointer[2];
- rval <<= iemmp3_bitindex;
- rval &= 0xffffff;
- iemmp3_bitindex += number_of_bits;
- rval >>= (24-number_of_bits);
- iemmp3_wordpointer += (iemmp3_bitindex>>3);
- iemmp3_bitindex &= 7;
- }
- return rval;
-}
-
-static unsigned int getbits_fast(int number_of_bits)
-{
- unsigned long rval;
-
- {
- rval = iemmp3_wordpointer[0];
- rval <<= 8;
- rval |= iemmp3_wordpointer[1];
- rval <<= iemmp3_bitindex;
- rval &= 0xffff;
- iemmp3_bitindex += number_of_bits;
- rval >>= (16-number_of_bits);
- iemmp3_wordpointer += (iemmp3_bitindex>>3);
- iemmp3_bitindex &= 7;
- }
- return rval;
-}
-
-static unsigned int get1bit(void)
-{
- unsigned char rval;
- rval = *iemmp3_wordpointer << iemmp3_bitindex;
-
- iemmp3_bitindex++;
- iemmp3_wordpointer += (iemmp3_bitindex>>3);
- iemmp3_bitindex &= 7;
-
- return rval>>7;
-}
-
-static int do_layer3(struct iemmp3_frame *fr,unsigned char *pcm_sample,int *pcm_point,int *err)
-{
- int gr, ch, ss,clip=0;
- int scalefacs[39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
- struct iemmp3_III_sideinfo sideinfo;
- int stereo = fr->stereo;
- int single = fr->single;
- int ms_stereo,i_stereo;
- int sfreq = fr->sampling_frequency;
- int stereo1,granules;
-
- if(stereo == 1)
- { /* stream is mono */
- stereo1 = 1;
- single = 0;
- }
- else if(single >= 0) /* stream is stereo, but force to mono */
- stereo1 = 1;
- else
- stereo1 = 2;
-
- if(fr->mode == MPG_MD_JOINT_STEREO)
- {
- ms_stereo = fr->mode_ext & 0x2;
- i_stereo = fr->mode_ext & 0x1;
- }
- else
- ms_stereo = i_stereo = 0;
-
- if(fr->lsf)
- {
- granules = 1;
- if(!III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single))
- {
- *err = 0;
- return 0;
- }
- }
- else
- {
- granules = 2;
-#ifdef IEM_MPEG1
- if(!III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single))
- {
- *err = 0;
- return 0;
- }
-#else
- post("Not supported\n");
-#endif
- }
-
- if(set_pointer(sideinfo.main_data_begin) == MP3_ERR)
- return 0;
-
- for (gr=0;gr<granules;gr++)
- {
- static real hybridIn[2][SBLIMIT][SSLIMIT];
- static real hybridOut[2][SSLIMIT][SBLIMIT];
-
- {
- struct iemmp3_gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
- long part2bits;
- if(fr->lsf)
- part2bits = III_get_scale_factors_2(scalefacs,gr_info,0);
- else
- {
-#ifdef IEM_MPEG1
- part2bits = III_get_scale_factors_1(scalefacs,gr_info);
-#else
- post("Not supported\n");
-#endif
- }
- if(III_dequantize_sample(hybridIn[0], scalefacs,gr_info,sfreq,part2bits))
- return clip;
- }
- if(stereo == 2)
- {
- struct iemmp3_gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]);
- long part2bits;
- if(fr->lsf)
- part2bits = III_get_scale_factors_2(scalefacs,gr_info,i_stereo);
- else
- {
-#ifdef IEM_MPEG1
- part2bits = III_get_scale_factors_1(scalefacs,gr_info);
-#else
- post("Not supported\n");
-#endif
- }
-
- if(III_dequantize_sample(hybridIn[1],scalefacs,gr_info,sfreq,part2bits))
- return clip;
-
- if(ms_stereo)
- {
- int i;
- for(i=0;i<SBLIMIT*SSLIMIT;i++)
- {
- real tmp0,tmp1;
- tmp0 = ((real *) hybridIn[0])[i];
- tmp1 = ((real *) hybridIn[1])[i];
- ((real *) hybridIn[1])[i] = tmp0 - tmp1;
- ((real *) hybridIn[0])[i] = tmp0 + tmp1;
- }
- }
-
- if(i_stereo)
- III_i_stereo(hybridIn,scalefacs,gr_info,sfreq,ms_stereo,fr->lsf);
-
- if(ms_stereo || i_stereo || (single == 3) )
- {
- if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb)
- sideinfo.ch[0].gr[gr].maxb = gr_info->maxb;
- else
- gr_info->maxb = sideinfo.ch[0].gr[gr].maxb;
- }
-
- switch(single)
- {
- case 3:
- {
- register unsigned int i;
- register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
- for(i=0;i<SSLIMIT*gr_info->maxb;i++,in0++)
- *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */
- }
- break;
- case 1:
- {
- register unsigned int i;
- register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
- for(i=0;i<SSLIMIT*gr_info->maxb;i++)
- *in0++ = *in1++;
- }
- break;
- }
- }
-
- for(ch=0;ch<stereo1;ch++)
- {
- struct iemmp3_gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
- III_antialias(hybridIn[ch],gr_info);
- III_hybrid(hybridIn[ch], hybridOut[ch], ch,gr_info);
- }
-
- for(ss=0;ss<SSLIMIT;ss++)
- {
- if(single >= 0)
- {
- clip += synth_1to1_mono(hybridOut[0][ss],pcm_sample,pcm_point);
- }
- else
- {
- int p1 = *pcm_point;
- clip += synth_1to1(hybridOut[0][ss],0,pcm_sample,&p1);
- clip += synth_1to1(hybridOut[1][ss],1,pcm_sample,pcm_point);
- }
- }
- }
-
- return clip;
-}
-
-static int III_get_side_info_2(struct iemmp3_III_sideinfo *si,int stereo,
- int ms_stereo,long sfreq,int single)
-{
- int ch;
- int powdiff = (single == 3) ? 4 : 0;
-
- si->main_data_begin = getbits(8);
- if (stereo == 1)
- si->private_bits = get1bit();
- else
- si->private_bits = getbits_fast(2);
-
- for (ch=0; ch<stereo; ch++)
- {
- register struct iemmp3_gr_info_s *gr_info = &(si->ch[ch].gr[0]);
-
- gr_info->part2_3_length = getbits(12);
- gr_info->big_values = getbits_fast(9);
- if(gr_info->big_values > 288)
- {
- post("big_values too large!\n");
- gr_info->big_values = 288;
- }
- gr_info->pow2gain = iemmp3_gainpow2+256 - getbits_fast(8) + powdiff;
- if(ms_stereo)
- gr_info->pow2gain += 2;
- gr_info->scalefac_compress = getbits(9);
- /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
- if(get1bit())
- {
- int i;
- gr_info->block_type = getbits_fast(2);
- gr_info->mixed_block_flag = get1bit();
- gr_info->table_select[0] = getbits_fast(5);
- gr_info->table_select[1] = getbits_fast(5);
- /*
- * table_select[2] not needed, because there is no region2,
- * but to satisfy some verifications tools we set it either.
- */
- gr_info->table_select[2] = 0;
- for(i=0;i<3;i++)
- gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
- if(gr_info->block_type == 0)
- {
- post("Blocktype == 0 and window-switching == 1 not allowed.\n");
- return(0);
- }
- /* region_count/start parameters are implicit in this case. */
- /* check this again! */
- if(gr_info->block_type == 2)
- gr_info->region1start = 36>>1;
- else if(sfreq == 8)
- /* check this for 2.5 and sfreq=8 */
- gr_info->region1start = 108>>1;
- else
- gr_info->region1start = 54>>1;
- gr_info->region2start = 576>>1;
- }
- else
- {
- int i,r0c,r1c;
- for (i=0; i<3; i++)
- gr_info->table_select[i] = getbits_fast(5);
- r0c = getbits_fast(4);
- r1c = getbits_fast(3);
- gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
- gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
- gr_info->block_type = 0;
- gr_info->mixed_block_flag = 0;
- }
- gr_info->scalefac_scale = get1bit();
- gr_info->count1table_select = get1bit();
- }
- return(1);
-}
-
-
-#ifdef IEM_MPEG1
-static int III_get_side_info_1(struct iemmp3_III_sideinfo *si,int stereo,
- int ms_stereo,long sfreq,int single)
-{
- int ch, gr;
- int powdiff = (single == 3) ? 4 : 0;
-
- si->main_data_begin = getbits(9);
- if (stereo == 1)
- si->private_bits = getbits_fast(5);
- else
- si->private_bits = getbits_fast(3);
-
- for (ch=0; ch<stereo; ch++)
- {
- si->ch[ch].gr[0].scfsi = -1;
- si->ch[ch].gr[1].scfsi = getbits_fast(4);
- }
-
- for (gr=0; gr<2; gr++)
- {
- for (ch=0; ch<stereo; ch++)
- {
- register struct iemmp3_gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
-
- gr_info->part2_3_length = getbits(12);
- gr_info->big_values = getbits_fast(9);
- if(gr_info->big_values > 288)
- {
- post("big_values too large!\n");
- gr_info->big_values = 288;
- }
- gr_info->pow2gain = iemmp3_gainpow2+256 - getbits_fast(8) + powdiff;
- if(ms_stereo)
- gr_info->pow2gain += 2;
- gr_info->scalefac_compress = getbits_fast(4);
- /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
- if(get1bit())
- {
- int i;
-
- gr_info->block_type = getbits_fast(2);
- gr_info->mixed_block_flag = get1bit();
- gr_info->table_select[0] = getbits_fast(5);
- gr_info->table_select[1] = getbits_fast(5);
- /*
- * table_select[2] not needed, because there is no region2,
- * but to satisfy some verifications tools we set it either.
- */
- gr_info->table_select[2] = 0;
- for(i=0;i<3;i++)
- gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
-
- if(gr_info->block_type == 0)
- {
- post("Blocktype == 0 and window-switching == 1 not allowed.\n");
- return(0);
- }
- /* region_count/start parameters are implicit in this case. */
- gr_info->region1start = 36>>1;
- gr_info->region2start = 576>>1;
- }
- else
- {
- int i,r0c,r1c;
- for (i=0; i<3; i++)
- gr_info->table_select[i] = getbits_fast(5);
- r0c = getbits_fast(4);
- r1c = getbits_fast(3);
- gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
- gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
- gr_info->block_type = 0;
- gr_info->mixed_block_flag = 0;
- }
- gr_info->preflag = get1bit();
- gr_info->scalefac_scale = get1bit();
- gr_info->count1table_select = get1bit();
- }
- }
- return(1);
-}
-#endif
-
-static int set_pointer(long backstep)
-{
- unsigned char *bsbufold;
- if(iemmp3_gmp->fsizeold < 0 && backstep > 0)
- {
- post("Can't step back %ld!\n",backstep);
- return MP3_ERR;
- }
- bsbufold = iemmp3_gmp->bsspace[iemmp3_gmp->bsnum] + 512;
- iemmp3_wordpointer -= backstep;
- if (backstep)
- memcpy(iemmp3_wordpointer,bsbufold+iemmp3_gmp->fsizeold-backstep,backstep);
- iemmp3_bitindex = 0;
- return MP3_OK;
-}
-
-#ifdef IEM_MPEG1
-static int III_get_scale_factors_1(int *scf,struct iemmp3_gr_info_s *gr_info)
-{
- static unsigned char slen[2][16] = {
- {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
- {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
- };
- int numbits;
- int num0 = slen[0][gr_info->scalefac_compress];
- int num1 = slen[1][gr_info->scalefac_compress];
-
- if (gr_info->block_type == 2)
- {
- int i=18;
-
- numbits = (num0 + num1) * 18;
- if (gr_info->mixed_block_flag)
- {
- for (i=8;i;i--)
- *scf++ = getbits_fast(num0);
- i = 9;
- numbits -= num0; /* num0 * 17 + num1 * 18 */
- }
-
- for (;i;i--)
- *scf++ = getbits_fast(num0);
- for (i = 18; i; i--)
- *scf++ = getbits_fast(num1);
- *scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */
- }
- else
- {
- int i;
- int scfsi = gr_info->scfsi;
-
- if(scfsi < 0)
- { /* scfsi < 0 => granule == 0 */
- for(i=11;i;i--)
- *scf++ = getbits_fast(num0);
- for(i=10;i;i--)
- *scf++ = getbits_fast(num1);
- numbits = (num0 + num1) * 10 + num0;
- }
- else
- {
- numbits = 0;
- if(!(scfsi & 0x8))
- {
- for (i=6;i;i--)
- *scf++ = getbits_fast(num0);
- numbits += num0 * 6;
- }
- else
- {
- *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
- *scf++ = 0; *scf++ = 0; *scf++ = 0;
- }
-
- if(!(scfsi & 0x4))
- {
- for (i=5;i;i--)
- *scf++ = getbits_fast(num0);
- numbits += num0 * 5;
- }
- else
- {
- *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
- *scf++ = 0; *scf++ = 0;
- }
-
- if(!(scfsi & 0x2))
- {
- for(i=5;i;i--)
- *scf++ = getbits_fast(num1);
- numbits += num1 * 5;
- }
- else
- {
- *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
- *scf++ = 0; *scf++ = 0;
- }
-
- if(!(scfsi & 0x1))
- {
- for (i=5;i;i--)
- *scf++ = getbits_fast(num1);
- numbits += num1 * 5;
- }
- else
- {
- *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
- *scf++ = 0; *scf++ = 0;
- }
- }
-
- *scf++ = 0; /* no l[21] in original sources */
- }
- return numbits;
-}
-#endif
-
-static int III_get_scale_factors_2(int *scf,struct iemmp3_gr_info_s *gr_info,int i_stereo)
-{
- unsigned char *pnt;
- int i,j;
- unsigned int slen;
- int n = 0;
- int numbits = 0;
-
- static unsigned char stab[3][6][4] = {
- { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} ,
- { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } ,
- { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} ,
- {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } ,
- { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} ,
- { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } };
-
- if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */
- slen = iemmp3_slen2[gr_info->scalefac_compress>>1];
- else
- slen = iemmp3_n_slen2[gr_info->scalefac_compress];
-
- gr_info->preflag = (slen>>15) & 0x1;
-
- n = 0;
- if( gr_info->block_type == 2 )
- {
- n++;
- if(gr_info->mixed_block_flag)
- n++;
- }
-
- pnt = stab[n][(slen>>12)&0x7];
-
- for(i=0;i<4;i++)
- {
- int num = slen & 0x7;
- slen >>= 3;
- if(num)
- {
- for(j=0;j<(int)(pnt[i]);j++)
- *scf++ = getbits_fast(num);
- numbits += pnt[i] * num;
- }
- else
- {
- for(j=0;j<(int)(pnt[i]);j++)
- *scf++ = 0;
- }
- }
-
- n = (n << 1) + 1;
- for(i=0;i<n;i++)
- *scf++ = 0;
-
- return numbits;
-}
-
-
-
-static int III_dequantize_sample(real xr[SBLIMIT][SSLIMIT],int *scf,
- struct iemmp3_gr_info_s *gr_info,int sfreq,int part2bits)
-{
- int shift = 1 + gr_info->scalefac_scale;
- real *xrpnt = (real *) xr;
- int l[3],l3;
- int part2remain = gr_info->part2_3_length - part2bits;
- int *me;
-
- {
- int bv = gr_info->big_values;
- int region1 = gr_info->region1start;
- int region2 = gr_info->region2start;
-
- l3 = ((576>>1)-bv)>>1;
- /*
- * we may lose the 'odd' bit here !!
- * check this later again
- */
- if(bv <= region1)
- {
- l[0] = bv; l[1] = 0; l[2] = 0;
- }
- else
- {
- l[0] = region1;
- if(bv <= region2)
- {
- l[1] = bv - l[0]; l[2] = 0;
- }
- else
- {
- l[1] = region2 - l[0]; l[2] = bv - region2;
- }
- }
- }
-
- if(gr_info->block_type == 2)
- {
- /*
- * decoding with short or mixed mode BandIndex table
- */
- int i,max[4];
- int step=0,lwin=0,cb=0;
- register real v = 0.0;
- register int *m,mc;
-
- if(gr_info->mixed_block_flag)
- {
- max[3] = -1;
- max[0] = max[1] = max[2] = 2;
- m = iemmp3_map[sfreq][0];
- me = iemmp3_mapend[sfreq][0];
- }
- else
- {
- max[0] = max[1] = max[2] = max[3] = -1;
- /* max[3] not really needed in this case */
- m = iemmp3_map[sfreq][1];
- me = iemmp3_mapend[sfreq][1];
- }
-
- mc = 0;
- for(i=0;i<2;i++)
- {
- int lp = l[i];
- struct iemmp3_newHuff *h = iemmp3_ht+gr_info->table_select[i];
- for(;lp;lp--,mc--)
- {
- register int x,y;
- if( (!mc) )
- {
- mc = *m++;
- xrpnt = ((real *) xr) + (*m++);
- lwin = *m++;
- cb = *m++;
- if(lwin == 3)
- {
- v = gr_info->pow2gain[(*scf++) << shift];
- step = 1;
- }
- else
- {
- v = gr_info->full_gain[lwin][(*scf++) << shift];
- step = 3;
- }
- }
- {
- register short *val = h->table;
- while((y=*val++)<0)
- {
- if (get1bit())
- val -= y;
- part2remain--;
- }
- x = y >> 4;
- y &= 0xf;
- }
- if(x == 15)
- {
- max[lwin] = cb;
- part2remain -= h->linbits+1;
- x += getbits(h->linbits);
- if(get1bit())
- *xrpnt = -iemmp3_ispow[x] * v;
- else
- *xrpnt = iemmp3_ispow[x] * v;
- }
- else if(x)
- {
- max[lwin] = cb;
- if(get1bit())
- *xrpnt = -iemmp3_ispow[x] * v;
- else
- *xrpnt = iemmp3_ispow[x] * v;
- part2remain--;
- }
- else
- *xrpnt = 0.0;
- xrpnt += step;
- if(y == 15)
- {
- max[lwin] = cb;
- part2remain -= h->linbits+1;
- y += getbits(h->linbits);
- if(get1bit())
- *xrpnt = -iemmp3_ispow[y] * v;
- else
- *xrpnt = iemmp3_ispow[y] * v;
- }
- else if(y)
- {
- max[lwin] = cb;
- if(get1bit())
- *xrpnt = -iemmp3_ispow[y] * v;
- else
- *xrpnt = iemmp3_ispow[y] * v;
- part2remain--;
- }
- else
- *xrpnt = 0.0;
- xrpnt += step;
- }
- }
- for(;l3 && (part2remain > 0);l3--)
- {
- struct iemmp3_newHuff *h = iemmp3_htc+gr_info->count1table_select;
- register short *val = h->table,a;
-
- while((a=*val++)<0)
- {
- part2remain--;
- if(part2remain < 0)
- {
- part2remain++;
- a = 0;
- break;
- }
- if (get1bit())
- val -= a;
- }
-
- for(i=0;i<4;i++)
- {
- if(!(i & 1))
- {
- if(!mc)
- {
- mc = *m++;
- xrpnt = ((real *) xr) + (*m++);
- lwin = *m++;
- cb = *m++;
- if(lwin == 3)
- {
- v = gr_info->pow2gain[(*scf++) << shift];
- step = 1;
- }
- else
- {
- v = gr_info->full_gain[lwin][(*scf++) << shift];
- step = 3;
- }
- }
- mc--;
- }
- if( (a & (0x8>>i)) )
- {
- max[lwin] = cb;
- part2remain--;
- if(part2remain < 0)
- {
- part2remain++;
- break;
- }
- if(get1bit())
- *xrpnt = -v;
- else
- *xrpnt = v;
- }
- else
- *xrpnt = 0.0;
- xrpnt += step;
- }
- }
-
- while( m < me )
- {
- if(!mc)
- {
- mc = *m++;
- xrpnt = ((real *) xr) + *m++;
- if( (*m++) == 3)
- step = 1;
- else
- step = 3;
- m++; /* cb */
- }
- mc--;
- *xrpnt = 0.0;
- xrpnt += step;
- *xrpnt = 0.0;
- xrpnt += step;
- /* we could add a little opt. here:
- * if we finished a band for window 3 or a long band
- * further bands could copied in a simple loop without a
- * special 'map' decoding
- */
- }
-
- gr_info->maxband[0] = max[0]+1;
- gr_info->maxband[1] = max[1]+1;
- gr_info->maxband[2] = max[2]+1;
- gr_info->maxbandl = max[3]+1;
-
- {
- int rmax = max[0] > max[1] ? max[0] : max[1];
- rmax = (rmax > max[2] ? rmax : max[2]) + 1;
- gr_info->maxb = rmax ? iemmp3_shortLimit[sfreq][rmax] : iemmp3_longLimit[sfreq][max[3]+1];
- }
-
- }
- else
- {
- /*
- * decoding with 'long' BandIndex table (block_type != 2)
- */
- int *pretab = gr_info->preflag ? iemmp3_pretab1 : iemmp3_pretab2;
- int i,max = -1;
- int cb = 0;
- register int *m = iemmp3_map[sfreq][2];
- register real v = 0.0;
- register int mc = 0;
-
- /*
- * long hash table values
- */
- for(i=0;i<3;i++)
- {
- int lp = l[i];
- struct iemmp3_newHuff *h = iemmp3_ht+gr_info->table_select[i];
-
- for(;lp;lp--,mc--)
- {
- int x,y;
-
- if(!mc)
- {
- mc = *m++;
- v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
- cb = *m++;
- }
- {
- register short *val = h->table;
- while((y=*val++)<0)
- {
- if (get1bit())
- val -= y;
- part2remain--;
- }
- x = y >> 4;
- y &= 0xf;
- }
- if (x == 15)
- {
- max = cb;
- part2remain -= h->linbits+1;
- x += getbits(h->linbits);
- if(get1bit())
- *xrpnt++ = -iemmp3_ispow[x] * v;
- else
- *xrpnt++ = iemmp3_ispow[x] * v;
- }
- else if(x)
- {
- max = cb;
- if(get1bit())
- *xrpnt++ = -iemmp3_ispow[x] * v;
- else
- *xrpnt++ = iemmp3_ispow[x] * v;
- part2remain--;
- }
- else
- *xrpnt++ = 0.0;
-
- if (y == 15)
- {
- max = cb;
- part2remain -= h->linbits+1;
- y += getbits(h->linbits);
- if(get1bit())
- *xrpnt++ = -iemmp3_ispow[y] * v;
- else
- *xrpnt++ = iemmp3_ispow[y] * v;
- }
- else if(y)
- {
- max = cb;
- if(get1bit())
- *xrpnt++ = -iemmp3_ispow[y] * v;
- else
- *xrpnt++ = iemmp3_ispow[y] * v;
- part2remain--;
- }
- else
- *xrpnt++ = 0.0;
- }
- }
-
- /*
- * short (count1table) values
- */
- for(;l3 && (part2remain > 0);l3--)
- {
- struct iemmp3_newHuff *h = iemmp3_htc+gr_info->count1table_select;
- register short *val = h->table,a;
-
- while((a=*val++)<0)
- {
- part2remain--;
- if(part2remain < 0)
- {
- part2remain++;
- a = 0;
- break;
- }
- if (get1bit())
- val -= a;
- }
-
- for(i=0;i<4;i++)
- {
- if(!(i & 1))
- {
- if(!mc)
- {
- mc = *m++;
- cb = *m++;
- v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
- }
- mc--;
- }
- if ( (a & (0x8>>i)) )
- {
- max = cb;
- part2remain--;
- if(part2remain < 0)
- {
- part2remain++;
- break;
- }
- if(get1bit())
- *xrpnt++ = -v;
- else
- *xrpnt++ = v;
- }
- else
- *xrpnt++ = 0.0;
- }
- }
-
- /*
- * zero part
- */
- for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--)
- {
- *xrpnt++ = 0.0;
- *xrpnt++ = 0.0;
- }
-
- gr_info->maxbandl = max+1;
- gr_info->maxb = iemmp3_longLimit[sfreq][gr_info->maxbandl];
- }
-
- while( part2remain > 16 )
- {
- getbits(16); /* Dismiss stuffing Bits */
- part2remain -= 16;
- }
- if(part2remain > 0)
- getbits(part2remain);
- else if(part2remain < 0)
- {
- post("mpg123: Can't rewind stream by %d bits!\n",-part2remain);
- return 1; /* -> error */
- }
- return 0;
-}
-
-static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,
- struct iemmp3_gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf)
-{
- real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;
- struct iemmp3_bandInfoStruct *bi = &bandInfo[sfreq];
- real *tab1,*tab2;
-
- if(lsf)
- {
- int p = gr_info->scalefac_compress & 0x1;
- if(ms_stereo)
- {
- tab1 = iemmp3_pow1_2[p]; tab2 = iemmp3_pow2_2[p];
- }
- else
- {
- tab1 = iemmp3_pow1_1[p]; tab2 = iemmp3_pow2_1[p];
- }
- }
- else
- {
- if(ms_stereo)
- {
- tab1 = iemmp3_tan1_2; tab2 = iemmp3_tan2_2;
- }
- else
- {
- tab1 = iemmp3_tan1_1; tab2 = iemmp3_tan2_1;
- }
- }
-
- if (gr_info->block_type == 2)
- {
- int lwin,do_l = 0;
- if( gr_info->mixed_block_flag )
- do_l = 1;
-
- for (lwin=0;lwin<3;lwin++) /* process each window */
- {
- /* get first band with zero values */
- int is_p,sb,idx,sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */
- if(sfb > 3)
- do_l = 0;
-
- for(;sfb<12;sfb++)
- {
- is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
- if(is_p != 7) {
- real t1,t2;
- sb = bi->shortDiff[sfb];
- idx = bi->shortIdx[sfb] + lwin;
- t1 = tab1[is_p]; t2 = tab2[is_p];
- for (; sb > 0; sb--,idx+=3)
- {
- real v = xr[0][idx];
- xr[0][idx] = v * t1;
- xr[1][idx] = v * t2;
- }
- }
- }
-
-#if 1
- /* in the original: copy 10 to 11 , here: copy 11 to 12
- maybe still wrong??? (copy 12 to 13?) */
- is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
- sb = bi->shortDiff[12];
- idx = bi->shortIdx[12] + lwin;
-#else
- is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
- sb = bi->shortDiff[11];
- idx = bi->shortIdx[11] + lwin;
-#endif
- if(is_p != 7)
- {
- real t1,t2;
- t1 = tab1[is_p]; t2 = tab2[is_p];
- for ( ; sb > 0; sb--,idx+=3 )
- {
- real v = xr[0][idx];
- xr[0][idx] = v * t1;
- xr[1][idx] = v * t2;
- }
- }
- } /* end for(lwin; .. ; . ) */
-
- if (do_l)
- {
- /* also check l-part, if ALL bands in the three windows are 'empty'
- * and mode = mixed_mode
- */
- int sfb = gr_info->maxbandl;
- int idx = bi->longIdx[sfb];
-
- for ( ; sfb<8; sfb++ )
- {
- int sb = bi->longDiff[sfb];
- int is_p = scalefac[sfb]; /* scale: 0-15 */
- if(is_p != 7) {
- real t1,t2;
- t1 = tab1[is_p]; t2 = tab2[is_p];
- for ( ; sb > 0; sb--,idx++)
- {
- real v = xr[0][idx];
- xr[0][idx] = v * t1;
- xr[1][idx] = v * t2;
- }
- }
- else
- idx += sb;
- }
- }
- }
- else /* ((gr_info->block_type != 2)) */
- {
- int sfb = gr_info->maxbandl;
- int is_p,idx = bi->longIdx[sfb];
- for ( ; sfb<21; sfb++)
- {
- int sb = bi->longDiff[sfb];
- is_p = scalefac[sfb]; /* scale: 0-15 */
- if(is_p != 7) {
- real t1,t2;
- t1 = tab1[is_p]; t2 = tab2[is_p];
- for ( ; sb > 0; sb--,idx++)
- {
- real v = xr[0][idx];
- xr[0][idx] = v * t1;
- xr[1][idx] = v * t2;
- }
- }
- else
- idx += sb;
- }
-
- is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */
- if(is_p != 7)
- {
- int sb;
- real t1 = tab1[is_p],t2 = tab2[is_p];
-
- for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ )
- {
- real v = xr[0][idx];
- xr[0][idx] = v * t1;
- xr[1][idx] = v * t2;
- }
- }
- } /* ... */
-}
-
-
-static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct iemmp3_gr_info_s *gr_info)
-{
- int sblim;
-
- if(gr_info->block_type == 2)
- {
- if(!gr_info->mixed_block_flag)
- return;
- sblim = 1;
- }
- else {
- sblim = gr_info->maxb-1;
- }
-
- /* 31 alias-reduction operations between each pair of sub-bands */
- /* with 8 butterflies between each pair */
-
- {
- int sb;
- real *xr1=(real *) xr[1];
-
- for(sb=sblim;sb;sb--,xr1+=10)
- {
- int ss;
- real *cs=iemmp3_aa_cs,*ca=iemmp3_aa_ca;
- real *xr2 = xr1;
-
- for(ss=7;ss>=0;ss--)
- { /* upper and lower butterfly inputs */
- register real bu = *--xr2,bd = *xr1;
- *xr2 = (bu * (*cs) ) - (bd * (*ca) );
- *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) );
- }
- }
- }
-}
-
-static void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],
- int ch,struct iemmp3_gr_info_s *gr_info)
-{
- real *tspnt = (real *) tsOut;
- real (*block)[2][SBLIMIT*SSLIMIT] = iemmp3_gmp->hybrid_block;
- int *blc = iemmp3_gmp->hybrid_blc;
- real *rawout1,*rawout2;
- int bt;
- unsigned int sb = 0;
-
- {
- int b = blc[ch];
- rawout1=block[b][ch];
- b=-b+1;
- rawout2=block[b][ch];
- blc[ch] = b;
- }
-
-
- if(gr_info->mixed_block_flag) {
- sb = 2;
- dct36(fsIn[0],rawout1,rawout2,iemmp3_win[0],tspnt);
- dct36(fsIn[1],rawout1+18,rawout2+18,iemmp3_win1[0],tspnt+1);
- rawout1 += 36; rawout2 += 36; tspnt += 2;
- }
-
- bt = gr_info->block_type;
- if(bt == 2) {
- for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
- dct12(fsIn[sb],rawout1,rawout2,iemmp3_win[2],tspnt);
- dct12(fsIn[sb+1],rawout1+18,rawout2+18,iemmp3_win1[2],tspnt+1);
- }
- }
- else {
- for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
- dct36(fsIn[sb],rawout1,rawout2,iemmp3_win[bt],tspnt);
- dct36(fsIn[sb+1],rawout1+18,rawout2+18,iemmp3_win1[bt],tspnt+1);
- }
- }
-
- for(;sb<SBLIMIT;sb++,tspnt++) {
- int i;
- for(i=0;i<SSLIMIT;i++) {
- tspnt[i*SBLIMIT] = *rawout1++;
- *rawout2++ = 0.0;
- }
- }
-}
-
-static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples)
-{
-
- {
- register real *costab = iemmp3_pnts[0];
-
- b1[0x00] = samples[0x00] + samples[0x1F];
- b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0];
-
- b1[0x01] = samples[0x01] + samples[0x1E];
- b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1];
-
- b1[0x02] = samples[0x02] + samples[0x1D];
- b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2];
-
- b1[0x03] = samples[0x03] + samples[0x1C];
- b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3];
-
- b1[0x04] = samples[0x04] + samples[0x1B];
- b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4];
-
- b1[0x05] = samples[0x05] + samples[0x1A];
- b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5];
-
- b1[0x06] = samples[0x06] + samples[0x19];
- b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6];
-
- b1[0x07] = samples[0x07] + samples[0x18];
- b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7];
-
- b1[0x08] = samples[0x08] + samples[0x17];
- b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8];
-
- b1[0x09] = samples[0x09] + samples[0x16];
- b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9];
-
- b1[0x0A] = samples[0x0A] + samples[0x15];
- b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA];
-
- b1[0x0B] = samples[0x0B] + samples[0x14];
- b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB];
-
- b1[0x0C] = samples[0x0C] + samples[0x13];
- b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC];
-
- b1[0x0D] = samples[0x0D] + samples[0x12];
- b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD];
-
- b1[0x0E] = samples[0x0E] + samples[0x11];
- b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE];
-
- b1[0x0F] = samples[0x0F] + samples[0x10];
- b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF];
- }
-
-
- {
- register real *costab = iemmp3_pnts[1];
-
- b2[0x00] = b1[0x00] + b1[0x0F];
- b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0];
- b2[0x01] = b1[0x01] + b1[0x0E];
- b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1];
- b2[0x02] = b1[0x02] + b1[0x0D];
- b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2];
- b2[0x03] = b1[0x03] + b1[0x0C];
- b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3];
- b2[0x04] = b1[0x04] + b1[0x0B];
- b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4];
- b2[0x05] = b1[0x05] + b1[0x0A];
- b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5];
- b2[0x06] = b1[0x06] + b1[0x09];
- b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6];
- b2[0x07] = b1[0x07] + b1[0x08];
- b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7];
-
- b2[0x10] = b1[0x10] + b1[0x1F];
- b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0];
- b2[0x11] = b1[0x11] + b1[0x1E];
- b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1];
- b2[0x12] = b1[0x12] + b1[0x1D];
- b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2];
- b2[0x13] = b1[0x13] + b1[0x1C];
- b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3];
- b2[0x14] = b1[0x14] + b1[0x1B];
- b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4];
- b2[0x15] = b1[0x15] + b1[0x1A];
- b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5];
- b2[0x16] = b1[0x16] + b1[0x19];
- b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6];
- b2[0x17] = b1[0x17] + b1[0x18];
- b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7];
- }
-
- {
- register real *costab = iemmp3_pnts[2];
-
- b1[0x00] = b2[0x00] + b2[0x07];
- b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0];
- b1[0x01] = b2[0x01] + b2[0x06];
- b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1];
- b1[0x02] = b2[0x02] + b2[0x05];
- b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2];
- b1[0x03] = b2[0x03] + b2[0x04];
- b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3];
-
- b1[0x08] = b2[0x08] + b2[0x0F];
- b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0];
- b1[0x09] = b2[0x09] + b2[0x0E];
- b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1];
- b1[0x0A] = b2[0x0A] + b2[0x0D];
- b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2];
- b1[0x0B] = b2[0x0B] + b2[0x0C];
- b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3];
-
- b1[0x10] = b2[0x10] + b2[0x17];
- b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0];
- b1[0x11] = b2[0x11] + b2[0x16];
- b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1];
- b1[0x12] = b2[0x12] + b2[0x15];
- b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2];
- b1[0x13] = b2[0x13] + b2[0x14];
- b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3];
-
- b1[0x18] = b2[0x18] + b2[0x1F];
- b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0];
- b1[0x19] = b2[0x19] + b2[0x1E];
- b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1];
- b1[0x1A] = b2[0x1A] + b2[0x1D];
- b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2];
- b1[0x1B] = b2[0x1B] + b2[0x1C];
- b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3];
- }
-
- {
- register real const cos0 = iemmp3_pnts[3][0];
- register real const cos1 = iemmp3_pnts[3][1];
-
- b2[0x00] = b1[0x00] + b1[0x03];
- b2[0x03] = (b1[0x00] - b1[0x03]) * cos0;
- b2[0x01] = b1[0x01] + b1[0x02];
- b2[0x02] = (b1[0x01] - b1[0x02]) * cos1;
-
- b2[0x04] = b1[0x04] + b1[0x07];
- b2[0x07] = (b1[0x07] - b1[0x04]) * cos0;
- b2[0x05] = b1[0x05] + b1[0x06];
- b2[0x06] = (b1[0x06] - b1[0x05]) * cos1;
-
- b2[0x08] = b1[0x08] + b1[0x0B];
- b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0;
- b2[0x09] = b1[0x09] + b1[0x0A];
- b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1;
-
- b2[0x0C] = b1[0x0C] + b1[0x0F];
- b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0;
- b2[0x0D] = b1[0x0D] + b1[0x0E];
- b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1;
-
- b2[0x10] = b1[0x10] + b1[0x13];
- b2[0x13] = (b1[0x10] - b1[0x13]) * cos0;
- b2[0x11] = b1[0x11] + b1[0x12];
- b2[0x12] = (b1[0x11] - b1[0x12]) * cos1;
-
- b2[0x14] = b1[0x14] + b1[0x17];
- b2[0x17] = (b1[0x17] - b1[0x14]) * cos0;
- b2[0x15] = b1[0x15] + b1[0x16];
- b2[0x16] = (b1[0x16] - b1[0x15]) * cos1;
-
- b2[0x18] = b1[0x18] + b1[0x1B];
- b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0;
- b2[0x19] = b1[0x19] + b1[0x1A];
- b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1;
-
- b2[0x1C] = b1[0x1C] + b1[0x1F];
- b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0;
- b2[0x1D] = b1[0x1D] + b1[0x1E];
- b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1;
- }
-
- {
- register real const cos0 = iemmp3_pnts[4][0];
-
- b1[0x00] = b2[0x00] + b2[0x01];
- b1[0x01] = (b2[0x00] - b2[0x01]) * cos0;
- b1[0x02] = b2[0x02] + b2[0x03];
- b1[0x03] = (b2[0x03] - b2[0x02]) * cos0;
- b1[0x02] += b1[0x03];
-
- b1[0x04] = b2[0x04] + b2[0x05];
- b1[0x05] = (b2[0x04] - b2[0x05]) * cos0;
- b1[0x06] = b2[0x06] + b2[0x07];
- b1[0x07] = (b2[0x07] - b2[0x06]) * cos0;
- b1[0x06] += b1[0x07];
- b1[0x04] += b1[0x06];
- b1[0x06] += b1[0x05];
- b1[0x05] += b1[0x07];
-
- b1[0x08] = b2[0x08] + b2[0x09];
- b1[0x09] = (b2[0x08] - b2[0x09]) * cos0;
- b1[0x0A] = b2[0x0A] + b2[0x0B];
- b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0;
- b1[0x0A] += b1[0x0B];
-
- b1[0x0C] = b2[0x0C] + b2[0x0D];
- b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0;
- b1[0x0E] = b2[0x0E] + b2[0x0F];
- b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0;
- b1[0x0E] += b1[0x0F];
- b1[0x0C] += b1[0x0E];
- b1[0x0E] += b1[0x0D];
- b1[0x0D] += b1[0x0F];
-
- b1[0x10] = b2[0x10] + b2[0x11];
- b1[0x11] = (b2[0x10] - b2[0x11]) * cos0;
- b1[0x12] = b2[0x12] + b2[0x13];
- b1[0x13] = (b2[0x13] - b2[0x12]) * cos0;
- b1[0x12] += b1[0x13];
-
- b1[0x14] = b2[0x14] + b2[0x15];
- b1[0x15] = (b2[0x14] - b2[0x15]) * cos0;
- b1[0x16] = b2[0x16] + b2[0x17];
- b1[0x17] = (b2[0x17] - b2[0x16]) * cos0;
- b1[0x16] += b1[0x17];
- b1[0x14] += b1[0x16];
- b1[0x16] += b1[0x15];
- b1[0x15] += b1[0x17];
-
- b1[0x18] = b2[0x18] + b2[0x19];
- b1[0x19] = (b2[0x18] - b2[0x19]) * cos0;
- b1[0x1A] = b2[0x1A] + b2[0x1B];
- b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0;
- b1[0x1A] += b1[0x1B];
-
- b1[0x1C] = b2[0x1C] + b2[0x1D];
- b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0;
- b1[0x1E] = b2[0x1E] + b2[0x1F];
- b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0;
- b1[0x1E] += b1[0x1F];
- b1[0x1C] += b1[0x1E];
- b1[0x1E] += b1[0x1D];
- b1[0x1D] += b1[0x1F];
- }
-
- out0[0x10*16] = b1[0x00];
- out0[0x10*12] = b1[0x04];
- out0[0x10* 8] = b1[0x02];
- out0[0x10* 4] = b1[0x06];
- out0[0x10* 0] = b1[0x01];
- out1[0x10* 0] = b1[0x01];
- out1[0x10* 4] = b1[0x05];
- out1[0x10* 8] = b1[0x03];
- out1[0x10*12] = b1[0x07];
-
- b1[0x08] += b1[0x0C];
- out0[0x10*14] = b1[0x08];
- b1[0x0C] += b1[0x0a];
- out0[0x10*10] = b1[0x0C];
- b1[0x0A] += b1[0x0E];
- out0[0x10* 6] = b1[0x0A];
- b1[0x0E] += b1[0x09];
- out0[0x10* 2] = b1[0x0E];
- b1[0x09] += b1[0x0D];
- out1[0x10* 2] = b1[0x09];
- b1[0x0D] += b1[0x0B];
- out1[0x10* 6] = b1[0x0D];
- b1[0x0B] += b1[0x0F];
- out1[0x10*10] = b1[0x0B];
- out1[0x10*14] = b1[0x0F];
-
- b1[0x18] += b1[0x1C];
- out0[0x10*15] = b1[0x10] + b1[0x18];
- out0[0x10*13] = b1[0x18] + b1[0x14];
- b1[0x1C] += b1[0x1a];
- out0[0x10*11] = b1[0x14] + b1[0x1C];
- out0[0x10* 9] = b1[0x1C] + b1[0x12];
- b1[0x1A] += b1[0x1E];
- out0[0x10* 7] = b1[0x12] + b1[0x1A];
- out0[0x10* 5] = b1[0x1A] + b1[0x16];
- b1[0x1E] += b1[0x19];
- out0[0x10* 3] = b1[0x16] + b1[0x1E];
- out0[0x10* 1] = b1[0x1E] + b1[0x11];
- b1[0x19] += b1[0x1D];
- out1[0x10* 1] = b1[0x11] + b1[0x19];
- out1[0x10* 3] = b1[0x19] + b1[0x15];
- b1[0x1D] += b1[0x1B];
- out1[0x10* 5] = b1[0x15] + b1[0x1D];
- out1[0x10* 7] = b1[0x1D] + b1[0x13];
- b1[0x1B] += b1[0x1F];
- out1[0x10* 9] = b1[0x13] + b1[0x1B];
- out1[0x10*11] = b1[0x1B] + b1[0x17];
- out1[0x10*13] = b1[0x17] + b1[0x1F];
- out1[0x10*15] = b1[0x1F];
-}
-
-/*
- * the call via dct64 is a trick to force GCC to use
- * (new) registers for the b1,b2 pointer to the bufs[xx] field
- */
-void dct64(real *a,real *b,real *c)
-{
- real bufs[0x40];
- dct64_1(a,b,bufs,bufs+0x20,c);
-}
-
-static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
-{
- {
- register real *in = inbuf;
-
- in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14];
- in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11];
- in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8];
- in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5];
- in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2];
- in[2] +=in[1]; in[1] +=in[0];
-
- in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
- in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1];
-
-
- {
-
-#define MACRO0(v) { \
- real tmp; \
- out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \
- out2[8-(v)] = tmp * w[26-(v)]; } \
- sum0 -= sum1; \
- ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \
- ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)];
-#define MACRO1(v) { \
- real sum0,sum1; \
- sum0 = tmp1a + tmp2a; \
- sum1 = (tmp1b + tmp2b) * iemmp3_tfcos36[(v)]; \
- MACRO0(v); }
-#define MACRO2(v) { \
- real sum0,sum1; \
- sum0 = tmp2a - tmp1a; \
- sum1 = (tmp2b - tmp1b) * iemmp3_tfcos36[(v)]; \
- MACRO0(v); }
-
- register const real *c = iemmp3_COS9;
- register real *out2 = o2;
- register real *w = wintab;
- register real *out1 = o1;
- register real *ts = tsbuf;
-
- real ta33,ta66,tb33,tb66;
-
- ta33 = in[2*3+0] * c[3];
- ta66 = in[2*6+0] * c[6];
- tb33 = in[2*3+1] * c[3];
- tb66 = in[2*6+1] * c[6];
-
- {
- real tmp1a,tmp2a,tmp1b,tmp2b;
- tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7];
- tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7];
- tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8];
- tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8];
-
- MACRO1(0);
- MACRO2(8);
- }
-
- {
- real tmp1a,tmp2a,tmp1b,tmp2b;
- tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3];
- tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3];
- tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0];
- tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1];
-
- MACRO1(1);
- MACRO2(7);
- }
-
- {
- real tmp1a,tmp2a,tmp1b,tmp2b;
- tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1];
- tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1];
- tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4];
- tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4];
-
- MACRO1(2);
- MACRO2(6);
- }
-
- {
- real tmp1a,tmp2a,tmp1b,tmp2b;
- tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5];
- tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5];
- tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2];
- tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2];
-
- MACRO1(3);
- MACRO2(5);
- }
-
- {
- real sum0,sum1;
- sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0];
- sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * iemmp3_tfcos36[4];
- MACRO0(4);
- }
- }
-
- }
-}
-
-/*
- * new DCT12
- */
-static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts)
-{
-#define DCT12_PART1 \
- in5 = in[5*3]; \
- in5 += (in4 = in[4*3]); \
- in4 += (in3 = in[3*3]); \
- in3 += (in2 = in[2*3]); \
- in2 += (in1 = in[1*3]); \
- in1 += (in0 = in[0*3]); \
- \
- in5 += in3; in3 += in1; \
- \
- in2 *= iemmp3_COS6_1; \
- in3 *= iemmp3_COS6_1; \
-
-#define DCT12_PART2 \
- in0 += in4 * iemmp3_COS6_2; \
- \
- in4 = in0 + in2; \
- in0 -= in2; \
- \
- in1 += in5 * iemmp3_COS6_2; \
- \
- in5 = (in1 + in3) * iemmp3_tfcos12[0]; \
- in1 = (in1 - in3) * iemmp3_tfcos12[2]; \
- \
- in3 = in4 + in5; \
- in4 -= in5; \
- \
- in2 = in0 + in1; \
- in0 -= in1;
-
-
- {
- real in0,in1,in2,in3,in4,in5;
- register real *out1 = rawout1;
- ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2];
- ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5];
-
- DCT12_PART1
-
- {
- real tmp0,tmp1 = (in0 - in4);
- {
- real tmp2 = (in1 - in5) * iemmp3_tfcos12[1];
- tmp0 = tmp1 + tmp2;
- tmp1 -= tmp2;
- }
- ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1];
- ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1];
- ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1];
- ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1];
- }
-
- DCT12_PART2
-
- ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0];
- ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0];
- ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2];
- ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2];
-
- ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0];
- ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0];
- ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2];
- ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2];
- }
-
- in++;
-
- {
- real in0,in1,in2,in3,in4,in5;
- register real *out2 = rawout2;
-
- DCT12_PART1
-
- {
- real tmp0,tmp1 = (in0 - in4);
- {
- real tmp2 = (in1 - in5) * iemmp3_tfcos12[1];
- tmp0 = tmp1 + tmp2;
- tmp1 -= tmp2;
- }
- out2[5-1] = tmp0 * wi[11-1];
- out2[0+1] = tmp0 * wi[6+1];
- ts[(12+1)*SBLIMIT] += tmp1 * wi[1];
- ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1];
- }
-
- DCT12_PART2
-
- out2[5-0] = in2 * wi[11-0];
- out2[0+0] = in2 * wi[6+0];
- out2[0+2] = in3 * wi[6+2];
- out2[5-2] = in3 * wi[11-2];
-
- ts[(12+0)*SBLIMIT] += in0 * wi[0];
- ts[(17-0)*SBLIMIT] += in0 * wi[5-0];
- ts[(12+2)*SBLIMIT] += in4 * wi[2];
- ts[(17-2)*SBLIMIT] += in4 * wi[5-2];
- }
-
- in++;
-
- {
- real in0,in1,in2,in3,in4,in5;
- register real *out2 = rawout2;
- out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0;
-
- DCT12_PART1
-
- {
- real tmp0,tmp1 = (in0 - in4);
- {
- real tmp2 = (in1 - in5) * iemmp3_tfcos12[1];
- tmp0 = tmp1 + tmp2;
- tmp1 -= tmp2;
- }
- out2[11-1] = tmp0 * wi[11-1];
- out2[6 +1] = tmp0 * wi[6+1];
- out2[0+1] += tmp1 * wi[1];
- out2[5-1] += tmp1 * wi[5-1];
- }
-
- DCT12_PART2
-
- out2[11-0] = in2 * wi[11-0];
- out2[6 +0] = in2 * wi[6+0];
- out2[6 +2] = in3 * wi[6+2];
- out2[11-2] = in3 * wi[11-2];
-
- out2[0+0] += in0 * wi[0];
- out2[5-0] += in0 * wi[5-0];
- out2[0+2] += in4 * wi[2];
- out2[5-2] += in4 * wi[5-2];
- }
-}
-
-static int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
-{
- short samples_tmp[64];
- short *tmp1 = samples_tmp;
- int i,ret;
- int pnt1 = 0;
-
- ret = synth_1to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
- samples += *pnt;
-
- for(i=0;i<32;i++)
- {
- *( (short *) samples) = *tmp1;
- samples += 2;
- tmp1 += 2;
- }
- *pnt += 64;
-
- return ret;
-}
-
-
-static int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
-{
- static const int step = 2;
- int bo;
- short *samples = (short *) (out + *pnt);
-
- real *b0,(*buf)[0x110];
- int clip = 0;
- int bo1;
-
- bo = iemmp3_gmp->synth_bo;
-
- if(!channel)
- {
- bo--;
- bo &= 0xf;
- buf = iemmp3_gmp->synth_buffs[0];
- }
- else
- {
- samples++;
- buf = iemmp3_gmp->synth_buffs[1];
- }
-
- if(bo & 0x1)
- {
- b0 = buf[0];
- bo1 = bo;
- dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
- }
- else
- {
- b0 = buf[1];
- bo1 = bo+1;
- dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
- }
-
- iemmp3_gmp->synth_bo = bo;
-
- {
- register int j;
- real *window = iemmp3_decwin + 16 - bo1;
-
- for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step)
- {
- real sum;
- sum = window[0x0] * b0[0x0];
- sum -= window[0x1] * b0[0x1];
- sum += window[0x2] * b0[0x2];
- sum -= window[0x3] * b0[0x3];
- sum += window[0x4] * b0[0x4];
- sum -= window[0x5] * b0[0x5];
- sum += window[0x6] * b0[0x6];
- sum -= window[0x7] * b0[0x7];
- sum += window[0x8] * b0[0x8];
- sum -= window[0x9] * b0[0x9];
- sum += window[0xA] * b0[0xA];
- sum -= window[0xB] * b0[0xB];
- sum += window[0xC] * b0[0xC];
- sum -= window[0xD] * b0[0xD];
- sum += window[0xE] * b0[0xE];
- sum -= window[0xF] * b0[0xF];
- WRITE_SAMPLE(samples,sum,clip);
- }
-
- {
- real sum;
- sum = window[0x0] * b0[0x0];
- sum += window[0x2] * b0[0x2];
- sum += window[0x4] * b0[0x4];
- sum += window[0x6] * b0[0x6];
- sum += window[0x8] * b0[0x8];
- sum += window[0xA] * b0[0xA];
- sum += window[0xC] * b0[0xC];
- sum += window[0xE] * b0[0xE];
- WRITE_SAMPLE(samples,sum,clip);
- b0-=0x10,window-=0x20,samples+=step;
- }
- window += bo1<<1;
-
- for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step)
- {
- real sum;
- sum = -window[-0x1] * b0[0x0];
- sum -= window[-0x2] * b0[0x1];
- sum -= window[-0x3] * b0[0x2];
- sum -= window[-0x4] * b0[0x3];
- sum -= window[-0x5] * b0[0x4];
- sum -= window[-0x6] * b0[0x5];
- sum -= window[-0x7] * b0[0x6];
- sum -= window[-0x8] * b0[0x7];
- sum -= window[-0x9] * b0[0x8];
- sum -= window[-0xA] * b0[0x9];
- sum -= window[-0xB] * b0[0xA];
- sum -= window[-0xC] * b0[0xB];
- sum -= window[-0xD] * b0[0xC];
- sum -= window[-0xE] * b0[0xD];
- sum -= window[-0xF] * b0[0xE];
- sum -= window[-0x0] * b0[0xF];
- WRITE_SAMPLE(samples,sum,clip);
- }
- }
- *pnt += 128;
-
- return clip;
-}
-
-
-
-static void *sigmp3play_new(void)
-{
- char *vec;
- t_sigmp3play *x = (t_sigmp3play *)pd_new(sigmp3play_class);
-
- x->file_is_open = 0;
- x->play_state = 0;
- x->mp3_encode_size = 0;
- x->mp3_out_index = 0;
- x->file_block_num = 0;
- x->file_remain = 0;
- x->file_size = 0;
- x->mp3_ch = 1;
- x->mp3_sr = 44100;
- x->obj_sr = 44100;
- x->obj_n = 1;
- x->samp_per_frame = 1152;
- x->mp3_byterate = 11;
- x->down = 0;
- x->scale = 1.0/32768.0;
- x->offset_sec = 0.0;
- x->fh = (FILE *)0L;
- x->mp3inbuf = (char *)getzbytes(MY_MP3_MALLOC_IN_SIZE);
- x->mp3outbuf = (char *)getzbytes(MY_MP3_MALLOC_OUT_SIZE);
- x->filename = (char *)getzbytes(MY_MP3_MALLOC_FN);
- x->begframeseek = (int *)0;
- x->curframeseek = 0;
- x->maxframeseek = 0;
- x->frame_counter = 0;
- x->time1_bang0_handle = 0;
- x->time_factor = 0.0;
- vec = x->filename;
- *vec = 0;
- InitMP3(&(x->mp));
- x->mp_is_init = 1;
- x->x_clock = clock_new(x, (t_method)sigmp3play_tick);
- outlet_new(&x->x_obj, &s_signal);
- outlet_new(&x->x_obj, &s_signal);
- x->x_floatout = outlet_new(&x->x_obj, &s_float);
- x->x_bangout = outlet_new(&x->x_obj, &s_bang);
- inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
- x->x_canvas = canvas_getcurrent();
- return (x);
-}
-
-static void sigmp3play_cleanup(t_sigmp3play *x)
-{
- x->file_is_open = 0;
- fclose(x->fh);
- x->play_state = 0;
- x->mp3_out_index = 0;
- x->mp_is_init = 0;
- ExitMP3(&(x->mp));
- x->time1_bang0_handle = 0;
- clock_delay(x->x_clock, 0);
-}
-
-static int sigmp3play_read_frame_length_first(t_sigmp3play *x, int *frsz)
-{
- int framesize, lsf, bitrate_index, sampling_frequency, padding, mpeg25, lay, ret=MP3_EX;
- int version, syncword;
- unsigned long head;
- unsigned char chead;
-
- *frsz = 0;
- if((x->file_size) >= 4)
- {
- fread(&chead, 1, sizeof(char), x->fh);
- head = (unsigned int)chead;
- fread(&chead, 1, sizeof(char), x->fh);
- head <<= 8;
- head |= (unsigned int)chead;
- fread(&chead, 1, sizeof(char), x->fh);
- head <<= 8;
- head |= (unsigned int)chead;
- fread(&chead, 1, sizeof(char), x->fh);
- head <<= 8;
- head |= (unsigned int)chead;
- syncword = (head >> 20) & 0x0fff;
- version = ((head >> 19) & 0x01) ? 0 : 1;
- if((syncword & 0x01) == 0)
- version = 2;
- if(version == 0)
- x->samp_per_frame = 1152;
- else
- x->samp_per_frame = 576;
-
- if(head & (1<<20))
- {
- lsf = (head & (1<<19)) ? 0x0 : 0x1;
- mpeg25 = 0;
- }
- else
- {
- lsf = 1;
- mpeg25 = 1;
- }
- lay = 4-((head>>17)&3);
- if(((head>>10)&0x3) == 0x3)
- {
- post("Stream error");
- return(MP3_EX);
- }
- if(mpeg25)
- sampling_frequency = 6 + ((head>>10)&0x3);
- else
- sampling_frequency = ((head>>10)&0x3) + (lsf*3);
- x->mp3_sr = (int)iemmp3_freqs[sampling_frequency];
- if(mpeg25)
- bitrate_index = ((head>>12)&0xf);
- bitrate_index = ((head>>12)&0xf);
- padding = ((head>>9)&0x1);
- if(!bitrate_index)
- {
- post("Free format not supported.\n");
- return(MP3_EX);
- }
- switch(lay)
- {
- case 1:
- post("Layer I not supported!\n");
- break;
- case 2:
- post("Layer II not supported!\n");
- break;
- case 3:
- framesize = iemmp3_tabsel_123[lsf][2][bitrate_index]*144000;
- framesize /= (iemmp3_freqs[sampling_frequency] << lsf);
- framesize += padding;
- *frsz = framesize;
- ret = 0;
- break;
- default:
- post("Sorry, unknown layer type.\n");
- break;
- }
- return(ret);
- }
- else
- {
- return(1);
- }
-}
-
-static int sigmp3play_read_frame_length_next(t_sigmp3play *x, int *frsz, int frame_counter)
-{
- int framesize, lsf, bitrate_index, sampling_frequency, *begframeseek=x->begframeseek;
- unsigned long head;
- unsigned char chead;
-
- *frsz = 0;
- if(begframeseek[frame_counter] < ((x->file_size) - 4))
- {
- fread(&chead, 1, sizeof(char), x->fh);
- head = (unsigned int)chead;
- fread(&chead, 1, sizeof(char), x->fh);
- head <<= 8;
- head |= (unsigned int)chead;
- fread(&chead, 1, sizeof(char), x->fh);
- head <<= 8;
- head |= (unsigned int)chead;
- fread(&chead, 1, sizeof(char), x->fh);
- head <<= 8;
- head |= (unsigned int)chead;
- if(head & (1<<20))
- {
- lsf = (head & (1<<19)) ? 0x0 : 0x1;
- sampling_frequency = ((head>>10)&0x3) + (lsf*3);
- }
- else
- {
- lsf = 1;
- sampling_frequency = 6 + ((head>>10)&0x3);
- }
- bitrate_index = ((head>>12)&0xf);
- framesize = iemmp3_tabsel_123[lsf][2][bitrate_index]*144000;
- framesize /= (iemmp3_freqs[sampling_frequency] << lsf);
- framesize += ((head>>9)&0x1);
- *frsz = framesize;
- return(0);
- }
- else
- return(1);
-}
-
-static int sigmp3play_calc_frames(t_sigmp3play *x)
-{
- int *begframeseek=x->begframeseek, i, maxframeseek, framesize, frame_counter;
- float length;
-
- fseek(x->fh,0,SEEK_SET);
- if(!sigmp3play_read_frame_length_first(x, &framesize))
- {
- if(framesize <= 0)
- {
- return(MP3_EX);
- }
- i = framesize - 6;
- maxframeseek = (x->file_size) / i;
- if(!begframeseek)
- {
- x->begframeseek = (int *)getzbytes((maxframeseek)*sizeof(int));
- x->maxframeseek = maxframeseek;
- }
- else
- {
- if(maxframeseek > (x->maxframeseek))
- {
- freebytes(x->begframeseek, (x->maxframeseek)*sizeof(int));
- x->begframeseek = (int *)getzbytes((maxframeseek)*sizeof(int));
- x->maxframeseek = maxframeseek;
- }
- }
- begframeseek = x->begframeseek;
- begframeseek[0] = 0;
- begframeseek[1] = framesize;
- frame_counter = 1;
- /*x->curframeseek = maxframeseek;*/
- fseek(x->fh, begframeseek[1], SEEK_SET);
- while(!sigmp3play_read_frame_length_next(x, &framesize, frame_counter))
- {
- begframeseek[frame_counter+1] = begframeseek[frame_counter] + framesize;
- frame_counter++;
- fseek(x->fh, begframeseek[frame_counter], SEEK_SET);
- };
- frame_counter--;
- length = (float)(frame_counter)*(float)(x->samp_per_frame) / (float)(x->mp3_sr);
- x->length_sec = length;
- x->time_factor = length / (float)(frame_counter);
- x->curframeseek = frame_counter;
- fseek(x->fh,0,SEEK_SET);
- return(MP3_OK);
- }
- else
- return(MP3_EX);
-}
-
-static void sigmp3play_do_open(t_sigmp3play *x, char *str, int calc_it)
-{
- int mp3_sr, obj_sr;
- int file_size, size, mp3_encode_return=MP3_OK, mp3_read_length, i, j, *begframeseek;
- static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
- static char *layers[4] = { "Unknown" , "I", "II", "III" };
- char completefilename[400];
-
- if(x->file_is_open)
- {
- post("mp3play-ERROR: file is already open, please stop it first!");
- }
- else if(*str == 0)
- {
- post("mp3play-ERROR: there is no filename to open");
- }
- else
- {
- if(str[0] == '/')
- {
- strcpy(completefilename, str);
- }
- else if(((str[0] >= 'A')&&(str[0] <= 'Z')||
- (str[0] >= 'a')&&(str[0] <= 'z'))&&
- (str[1] == ':')&&(str[2] == '/'))
- {
- strcpy(completefilename, str);
- }
- else
- {
- strcpy(completefilename, canvas_getdir(x->x_canvas)->s_name);
- strcat(completefilename, "/");
- strcat(completefilename, str);
- }
-
- if((x->fh = fopen(completefilename, "rb")) == NULL)
- {
- post("mp3play-ERROR: cannot open %s", completefilename);
- }
- else
- {
- strcpy(x->filename, completefilename);
- fseek(x->fh,0,SEEK_END);
- file_size = (int)ftell(x->fh);
- x->file_size = file_size;
- if(!x->mp_is_init)
- {
- InitAgainMP3(&(x->mp));
- x->mp_is_init = 1;
- }
- if(calc_it)
- mp3_encode_return = sigmp3play_calc_frames(x);
- if(mp3_encode_return == MP3_EX)
- {
- sigmp3play_cleanup(x);
- return;
- }
- if(x->frame_counter)
- x->frame_counter = (int)(x->offset_sec / x->time_factor);
- i = x->frame_counter;
- if(i > (x->curframeseek - 1))
- i = x->curframeseek - 1;
- begframeseek = x->begframeseek;
- j = begframeseek[i];
- fseek(x->fh,j,SEEK_SET);
- x->file_block_num = (file_size-j) / MY_MP3_MALLOC_IN_SIZE;
- x->file_remain = (file_size-j) - (x->file_block_num)*MY_MP3_MALLOC_IN_SIZE;
- if(x->file_block_num)
- {
- mp3_read_length = MY_MP3_MALLOC_IN_SIZE;
- x->file_block_num--;
- }
- else
- {
- mp3_read_length = x->file_remain;
- x->file_remain = 0;
- }
- if(mp3_read_length > 0)
- {
- fread(x->mp3inbuf, mp3_read_length, sizeof(char), x->fh);
- mp3_encode_return = decodeMP3(&(x->mp), x->mp3inbuf, mp3_read_length, x->mp3outbuf,
- MY_MP3_MALLOC_IN_SIZE2, &size);
- if(mp3_encode_return == MP3_EX)
- {
- sigmp3play_cleanup(x);
- return;
- }
- post ("MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d",
- x->mp.fr.mpeg25 ? "2.5" : (x->mp.fr.lsf ? "2.0" : "1.0"),
- layers[x->mp.fr.lay],iemmp3_freqs[x->mp.fr.sampling_frequency],
- modes[x->mp.fr.mode],x->mp.fr.mode_ext,x->mp.fr.framesize+4);
- post ("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.",
- x->mp.fr.stereo,x->mp.fr.copyright?"Yes":"No",
- x->mp.fr.original?"Yes":"No",x->mp.fr.error_protection?"Yes":"No",
- x->mp.fr.emphasis);
- post ("Bitrate: %d Kbits/s, Extension value: %d",
- iemmp3_tabsel_123[x->mp.fr.lsf][x->mp.fr.lay-1]
- [x->mp.fr.bitrate_index],x->mp.fr.extension);
- post ("Original Soundfile-Length : %.3f sec.\n",x->length_sec);
-
- x->mp3_byterate = 128*iemmp3_tabsel_123[x->mp.fr.lsf][x->mp.fr.lay-1][x->mp.fr.bitrate_index];
- /* 1024/8 */
-
- if(x->mp.fr.stereo == 2)
- x->mp3_ch = 2;
- else if(x->mp.fr.stereo == 1)
- x->mp3_ch = 1;
- else
- {
- x->mp3_ch = 1;
- post("mp3_play~ WARNING: unknown number of channels : %d channels",
- x->mp.fr.stereo);
- }
- mp3_sr = (int)(iemmp3_freqs[x->mp.fr.sampling_frequency]);
- obj_sr = x->obj_sr;
- x->mp3_sr = mp3_sr;
- if(mp3_sr == obj_sr)
- {
- x->down = 0;
- }
- else if(2*mp3_sr == obj_sr)
- {
- x->down = 1;
- }
- else if(4*mp3_sr == obj_sr)
- {
- x->down = 2;
- }
- else if(mp3_sr == 2*obj_sr)
- {
- x->down = -1;
- }
- else if(mp3_sr == 4*obj_sr)
- {
- x->down = -2;
- }
- else
- {
- post("mp3_play~ WARNING: playing the filesamplerate of %d Hz at %d Hz", mp3_sr,obj_sr);
- x->down = 0;
- }
-
- if(mp3_encode_return == MP3_OK)
- {
- x->file_is_open = 1;
- x->mp3_encode_size = size * sizeof(char) / sizeof(short);
- }
- else
- {
- x->file_is_open = 0;
- x->mp3_out_index = 0;
- fclose(x->fh);
- }
- }
- else
- {
- x->file_is_open = 0;
- fclose(x->fh);
- }
- }
- x->play_state = 2;
- x->mp3_out_index = 0;
- }
-}
-
-static t_int *sigmp3play_perform(t_int *w)
-{
- t_sigmp3play *x = (t_sigmp3play *)(w[1]);
- t_float *out1 = (t_float *)(w[2]);
- t_float *out2 = (t_float *)(w[3]);
- int n = (int)(w[4]);
- short *ivec = (short *)(x->mp3outbuf);
- int size, mp3_encode_return, mp3_read_length, mp3_ch, down;
- float scale = x->scale, outa, outb;
- int mp3_out_index = x->mp3_out_index;
-
- if (!x->file_is_open)
- goto sigmp3play_labelzero;
- if (x->play_state != 1)
- goto sigmp3play_labelzero;
-
- if(mp3_out_index >= x->mp3_encode_size)
- {
- x->frame_counter++;
- x->time1_bang0_handle = 1;
- clock_delay(x->x_clock, 0);
- mp3_out_index = 0;
- mp3_encode_return = decodeMP3(&(x->mp), NULL, 0, x->mp3outbuf,
- MY_MP3_MALLOC_IN_SIZE2, &size);
- if(mp3_encode_return == MP3_OK)
- x->mp3_encode_size = size * sizeof(char) / sizeof(short);
- else if(mp3_encode_return == MP3_EX)
- {
- sigmp3play_cleanup(x);
- goto sigmp3play_labelzero;
- }
- else
- {
- if(x->file_block_num > 0)
- {
- mp3_read_length = MY_MP3_MALLOC_IN_SIZE;
- x->file_block_num--;
- }
- else if(x->file_remain > 0)
- {
- mp3_read_length = x->file_remain;
- x->file_remain = 0;
- }
- else
- {
- sigmp3play_cleanup(x);
- goto sigmp3play_labelzero;
- }
-
- fread(x->mp3inbuf, mp3_read_length, sizeof(char), x->fh);
- mp3_encode_return = decodeMP3(&(x->mp), x->mp3inbuf, mp3_read_length,
- x->mp3outbuf, MY_MP3_MALLOC_IN_SIZE2, &size);
- x->mp3_encode_size = size * sizeof(char) / sizeof(short);
- if(mp3_encode_return == MP3_EX)
- {
- sigmp3play_cleanup(x);
- goto sigmp3play_labelzero;
- }
- }
- }
-
- mp3_ch = x->mp3_ch;
- down = x->down;
- if(mp3_ch == 2)
- {
- if(down == 0)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + 2*n;
- while (n--)
- {
- *out1++ = scale * (float)(*ivec++);
- *out2++ = scale * (float)(*ivec++);
- }
- }
- else if(down == 1)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + n;
- n /= 2;
- while (n--)
- {
- outa = scale * (float)(*ivec++);
- outb = scale * (float)(*ivec++);
- *out1++ = outa;
- *out2++ = outb;
- *out1++ = outa;
- *out2++ = outb;
- }
- }
- else if(down == 2)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + n/2;
- n /= 4;
- while (n--)
- {
- outa = scale * (float)(*ivec++);
- outb = scale * (float)(*ivec++);
- *out1++ = outa;
- *out2++ = outb;
- *out1++ = outa;
- *out2++ = outb;
- *out1++ = outa;
- *out2++ = outb;
- *out1++ = outa;
- *out2++ = outb;
- }
- }
- else if(down == -1)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + 4*n;
- while (n--)
- {
- outa = scale * (float)(*ivec++);
- outb = scale * (float)(*ivec);
- ivec += 3;
- *out1++ = outa;
- *out2++ = outa;
- }
- }
- else if(down == -2)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + 8*n;
- while (n--)
- {
- outa = scale * (float)(*ivec++);
- outb = scale * (float)(*ivec);
- ivec += 7;
- *out1++ = outa;
- *out2++ = outa;
- }
- }
- }
- else
- {
- if(down == 0)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + n;
- while (n--)
- {
- outa = scale * (float)(*ivec++);
- *out1++ = outa;
- *out2++ = outa;
- }
- }
- else if(down == 1)
- {
- ivec += mp3_out_index;
- n /= 2;
- x->mp3_out_index = mp3_out_index + n;
- while (n--)
- {
- outa = scale * (float)(*ivec++);
- *out1++ = outa;
- *out2++ = outa;
- *out1++ = outa;
- *out2++ = outa;
- }
- }
- else if(down == 2)
- {
- ivec += mp3_out_index;
- n /= 4;
- x->mp3_out_index = mp3_out_index + n;
- while (n--)
- {
- outa = scale * (float)(*ivec++);
- *out1++ = outa;
- *out2++ = outa;
- *out1++ = outa;
- *out2++ = outa;
- *out1++ = outa;
- *out2++ = outa;
- *out1++ = outa;
- *out2++ = outa;
- }
- }
- else if(down == -1)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + 2*n;
- while (n--)
- {
- outa = scale * (float)(*ivec);
- ivec += 2;
- *out1++ = outa;
- *out2++ = outa;
- }
- }
- else if(down == -2)
- {
- ivec += mp3_out_index;
- x->mp3_out_index = mp3_out_index + 4*n;
- while (n--)
- {
- outa = scale * (float)(*ivec);
- ivec += 4;
- *out1++ = outa;
- *out2++ = outa;
- }
- }
- }
- return (w+5);
-
-sigmp3play_labelzero:
-
- while (n--)
- {
- *out1++ = 0;
- *out2++ = 0;
- }
- return (w+5);
-}
-
-static void sigmp3play_dsp(t_sigmp3play *x, t_signal **sp)
-{
- x->obj_sr = (int)(sp[0]->s_sr);
- x->obj_n = (int)(sp[0]->s_n);
- dsp_add(sigmp3play_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
-}
-
-
-
-static void sigmp3play_stop(t_sigmp3play *x)
-{
- if(x->file_is_open)
- {
- x->file_block_num = 0;
- x->file_remain = 0;
- }
-}
-
-static void sigmp3play_start(t_sigmp3play *x)
-{
- if(x->file_is_open)
- {
- x->play_state = 1;
- }
-}
-
-static void sigmp3play_ft1(t_sigmp3play *x, t_floatarg offset)
-{
- if(offset < 0.0)
- offset = 0.0;
- x->offset_sec = (float)offset;
-}
-
-static void sigmp3play_pause(t_sigmp3play *x)
-{
- if(x->file_is_open)
- {
- if(x->play_state == 0)
- x->play_state = 1;
- else if(x->play_state == 1)
- x->play_state = 0;
- }
-}
-
-static void sigmp3play_open(t_sigmp3play *x, t_symbol *s)
-{
- x->frame_counter = 0;
- sigmp3play_do_open(x, (char *)s->s_name, 1);
-}
-
-static void sigmp3play_open_again(t_sigmp3play *x)
-{
- x->frame_counter = 0;
- sigmp3play_do_open(x, x->filename, 0);
-}
-
-static void sigmp3play_open_at(t_sigmp3play *x, t_symbol *s)
-{
- x->frame_counter = 1;
- sigmp3play_do_open(x, (char *)s->s_name, 1);
-}
-
-static void sigmp3play_open_again_at(t_sigmp3play *x)
-{
- x->frame_counter = 1;
- sigmp3play_do_open(x, x->filename, 0);
-}
-
-
-static void sigmp3play_tick(t_sigmp3play *x)
-{
- if(x->time1_bang0_handle)
- {
- outlet_float(x->x_floatout, (float)(x->frame_counter)*(x->time_factor));
- }
- else
- {
- outlet_bang(x->x_bangout);
- }
-}
-
-static void sigmp3play_free(t_sigmp3play *x)
-{
- if(x->mp_is_init)
- ExitMP3(&(x->mp));
- if(x->begframeseek)
- freebytes(x->begframeseek, (x->maxframeseek)*sizeof(int));
- freebytes(x->filename, MY_MP3_MALLOC_FN);
- freebytes(x->mp3outbuf, MY_MP3_MALLOC_OUT_SIZE);
- freebytes(x->mp3inbuf, MY_MP3_MALLOC_IN_SIZE);
- clock_free(x->x_clock);
-}
-
-void sigmp3play_setup(void)
-{
- sigmp3play_class = class_new(gensym("mp3play~"), (t_newmethod)sigmp3play_new,
- (t_method)sigmp3play_free, sizeof(t_sigmp3play), 0, 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_dsp, gensym("dsp"), 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_start, gensym("start"), 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_ft1,
- gensym("ft1"), A_FLOAT, 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_stop, gensym("stop"), 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_pause, gensym("pause"), 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_open_again_at, gensym("open_again_at"), 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_open, gensym("open"), A_DEFSYM, 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_open_again, gensym("open_again"), 0);
- class_addmethod(sigmp3play_class, (t_method)sigmp3play_open_at, gensym("open_at"), A_DEFSYM, 0);
- class_sethelpsymbol(sigmp3play_class, gensym("iemhelp/help-mp3play~"));
- /*post("\nmp3play~ written by thomas musil & norbert math\nV 0.1 iem graz
- austria 05 2000\n");*/
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_mp3 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+/*
+ sigmp3play.c - Mpeg Layer III Player for PD
+ Version:0.1
+ 05-18-2000
+ written by Thomas Musil (musil_at_iem.kug.ac.at), Norbert Math (math_at_iem.kug.ac.at)
+ IEM Graz
+
+ debugged for windows 013-03-2003
+
+ This MPEG Player is based on the mpglib 0.2 by Michael Hipp which comes with mpg123-0.59r
+
+ please see the README file for copyright notices!
+
+ */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <math.h>
+
+#ifndef NT
+#include <sys/signal.h>
+#include <unistd.h>
+#endif
+
+
+#define IEM_MPEG1
+
+#ifdef _WIN32
+# undef WIN32
+# define WIN32
+
+# define M_PI 3.14159265358979323846
+# define M_SQRT2 1.41421356237309504880
+# define REAL_IS_FLOAT
+# define NEW_DCT9
+
+# define random rand
+# define srandom srand
+
+#endif
+
+#ifdef REAL_IS_FLOAT
+# define real float
+#elif defined(REAL_IS_LONG_DOUBLE)
+# define real long double
+#else
+# define real double
+#endif
+
+#ifdef __GNUC__
+#define INLINE inline
+#else
+#define INLINE
+#endif
+
+/* AUDIOBUFSIZE = n*64 with n=1,2,3 ... */
+#define AUDIOBUFSIZE 16384
+
+#define FALSE 0
+#define TRUE 1
+#define SBLIMIT 32
+#define SSLIMIT 18
+#define MPG_MD_STEREO 0
+#define MPG_MD_JOINT_STEREO 1
+#define MPG_MD_DUAL_CHANNEL 2
+#define MPG_MD_MONO 3
+
+#define MAXFRAMESIZE 1792
+/* Pre Shift fo 16 to 8 bit converter table */
+#define AUSHIFT (3)
+#define BOOL int
+#define MP3_EX -2
+#define MP3_ERR -1
+#define MP3_OK 0
+#define MP3_NEED_MORE 1
+
+#define WRITE_SAMPLE(samples,sum,clip) \
+ if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
+ else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
+ else { *(samples) = sum; }
+
+
+#define HDRCMPMASK 0xfffffd00
+
+
+#define MY_MP3_MALLOC_IN_SIZE 16384
+#define MY_MP3_MALLOC_IN_SIZE2 8192
+#define MY_MP3_MALLOC_OUT_SIZE 65536
+#define MY_MP3_MALLOC_FN 400
+#define MY_MP3_CHSAMP_PER_FRAME 1152
+
+struct iemmp3_frame
+{
+ int stereo;
+ int jsbound;
+ int single;
+ int lsf;
+ int mpeg25;
+ int header_change;
+ int lay;
+ int error_protection;
+ int bitrate_index;
+ int sampling_frequency;
+ int padding;
+ int extension;
+ int mode;
+ int mode_ext;
+ int copyright;
+ int original;
+ int emphasis;
+ int framesize; /* computed framesize */
+};
+
+struct iemmp3_gr_info_s
+{
+ int scfsi;
+ unsigned part2_3_length;
+ unsigned big_values;
+ unsigned scalefac_compress;
+ unsigned block_type;
+ unsigned mixed_block_flag;
+ unsigned table_select[3];
+ unsigned subblock_gain[3];
+ unsigned maxband[3];
+ unsigned maxbandl;
+ unsigned maxb;
+ unsigned region1start;
+ unsigned region2start;
+ unsigned preflag;
+ unsigned scalefac_scale;
+ unsigned count1table_select;
+ real *full_gain[3];
+ real *pow2gain;
+};
+
+struct iemmp3_III_sideinfo
+{
+ unsigned main_data_begin;
+ unsigned private_bits;
+ struct
+ {
+ struct iemmp3_gr_info_s gr[2];
+ } ch[2];
+};
+
+struct iemmp3_buf
+{
+ unsigned char *pnt;
+ long size;
+ long pos;
+ struct iemmp3_buf *next;
+ struct iemmp3_buf *prev;
+};
+
+struct iemmp3Struct
+{
+ struct iemmp3_buf *head,*tail;
+ int bsize;
+ int framesize;
+ int fsizeold;
+ struct iemmp3_frame fr;
+ unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */
+ real hybrid_block[2][2][SBLIMIT*SSLIMIT];
+ int hybrid_blc[2];
+ unsigned long header;
+ int bsnum;
+ real synth_buffs[2][2][0x110];
+ int synth_bo;
+};
+
+struct iemmp3_bandInfoStruct
+{
+ short longIdx[23];
+ short longDiff[22];
+ short shortIdx[14];
+ short shortDiff[13];
+};
+
+struct iemmp3_newHuff
+{
+ unsigned int linbits;
+ short *table;
+};
+
+
+typedef struct _sigmp3play
+{
+ t_object x_obj;
+ float length_sec;
+ int samp_per_frame;
+ int frame_counter;
+ int time1_bang0_handle;
+ float time_factor;
+ int *begframeseek;
+ int curframeseek;
+ int maxframeseek;
+ char *filename;
+ float offset_sec;
+ int file_is_open;
+ int play_state;
+ int mp3_encode_size;
+ int mp3_out_index;
+ int file_size;
+ int file_block_num;
+ int file_remain;
+ int mp_is_init;
+ int mp3_ch;
+ int mp3_sr;
+ int mp3_byterate;
+ int obj_sr;
+ int obj_n;
+ int down;
+ float scale;
+ FILE *fh;
+ char *mp3inbuf;
+ char *mp3outbuf;
+ struct iemmp3Struct mp;
+ t_clock *x_clock;
+ t_outlet *x_bangout;
+ t_outlet *x_floatout;
+ t_canvas *x_canvas;
+} t_sigmp3play;
+
+
+
+static BOOL InitMP3 (struct iemmp3Struct *mp);
+static BOOL InitAgainMP3(struct iemmp3Struct *mp);
+static void ExitMP3 (struct iemmp3Struct *mp);
+static int decodeMP3 (struct iemmp3Struct *mp, char *in, int isize, char *out, int osize, int *done);
+static void make_decode_tables (long scaleval);
+static void init_layer3 (int down_sample_sblimit);
+static int decode_header (struct iemmp3_frame *fr,unsigned long newhead);
+static int do_layer3(struct iemmp3_frame *fr,unsigned char *pcm_sample,int *pcm_point,int *err);
+static int set_pointer(long backstep);
+static int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt);
+static int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt);
+static struct iemmp3_buf *addbuf(struct iemmp3Struct *mp,char *buf,int size);
+static void remove_buf(struct iemmp3Struct *mp);
+static int read_head(struct iemmp3Struct *mp);
+static int read_buf_byte(struct iemmp3Struct *mp,int *err);
+static int III_get_side_info_2(struct iemmp3_III_sideinfo *si,int stereo, int ms_stereo,long sfreq,int single);
+#ifdef IEM_MPEG1
+static int III_get_side_info_1(struct iemmp3_III_sideinfo *si,int stereo,int ms_stereo,long sfreq,int single);
+static int III_get_scale_factors_1(int *scf,struct iemmp3_gr_info_s *gr_info);
+#endif
+static int III_get_scale_factors_2(int *scf,struct iemmp3_gr_info_s *gr_info,int i_stereo);
+static int III_dequantize_sample(real xr[SBLIMIT][SSLIMIT],int *scf,struct iemmp3_gr_info_s *gr_info,int sfreq,int part2bits);
+static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,struct iemmp3_gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf);
+static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct iemmp3_gr_info_s *gr_info);
+static void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],int ch,struct iemmp3_gr_info_s *gr_info);
+static void dct64(real *a,real *b,real *c);
+static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples);
+static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf);
+static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts);
+static unsigned int getbits(int number_of_bits);
+static unsigned int getbits_fast(int number_of_bits);
+static unsigned int get1bit(void);
+
+static void sigmp3play_tick(t_sigmp3play *x);
+
+
+struct iemmp3Struct *iemmp3_gmp;
+
+int iemmp3_tabsel_123[2][3][16] = {
+ { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
+ {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
+ {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
+
+ { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
+ {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
+ {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
+};
+
+long iemmp3_freqs[9] = { 44100, 48000, 32000,
+22050, 24000, 16000 ,
+11025 , 12000 , 8000 };
+
+int iemmp3_bitindex;
+unsigned char *iemmp3_wordpointer;
+
+static real iemmp3_ispow[8207];
+static real iemmp3_aa_ca[8],iemmp3_aa_cs[8];
+static real iemmp3_COS1[12][6];
+static real iemmp3_win[4][36];
+static real iemmp3_win1[4][36];
+static real iemmp3_gainpow2[256+118+4];
+static real iemmp3_COS9[9];
+static real iemmp3_COS6_1,iemmp3_COS6_2;
+static real iemmp3_tfcos36[9];
+static real iemmp3_tfcos12[3];
+
+int iemmp3_longLimit[9][23];
+int iemmp3_shortLimit[9][14];
+
+struct iemmp3_bandInfoStruct bandInfo[9] = {
+
+ /* MPEG 1.0 */
+ { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
+ {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158},
+ {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3},
+ {4,4,4,4,6,8,10,12,14,18,22,30,56} } ,
+
+ { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576},
+ {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192},
+ {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3},
+ {4,4,4,4,6,6,10,12,14,16,20,26,66} } ,
+
+ { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} ,
+ {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} ,
+ {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} ,
+ {4,4,4,4,6,8,12,16,20,26,34,42,12} } ,
+
+ /* MPEG 2.0 */
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
+ {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
+ {4,4,4,6,6,8,10,14,18,26,32,42,18 } } ,
+
+ { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
+ {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } ,
+ {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} ,
+ {4,4,4,6,8,10,12,14,18,24,32,44,12 } } ,
+
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 },
+ {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3},
+ {4,4,4,6,8,10,12,14,18,24,30,40,18 } } ,
+ /* MPEG 2.5 */
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
+ {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
+ {4,4,4,6,8,10,12,14,18,24,30,40,18} },
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
+ {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
+ {4,4,4,6,8,10,12,14,18,24,30,40,18} },
+ { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
+ {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2},
+ {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576},
+ {8,8,8,12,16,20,24,28,36,2,2,2,26} } ,
+};
+
+static int iemmp3_mapbuf0[9][152];
+static int iemmp3_mapbuf1[9][156];
+static int iemmp3_mapbuf2[9][44];
+static int *iemmp3_map[9][3];
+static int *iemmp3_mapend[9][3];
+
+static unsigned int iemmp3_n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
+static unsigned int iemmp3_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
+
+static real iemmp3_tan1_1[16],iemmp3_tan2_1[16],iemmp3_tan1_2[16],iemmp3_tan2_2[16];
+static real iemmp3_pow1_1[2][16],iemmp3_pow2_1[2][16],iemmp3_pow1_2[2][16],iemmp3_pow2_2[2][16];
+
+static int iemmp3_pretab1[22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
+static int iemmp3_pretab2[22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+real iemmp3_decwin[512+32];
+static real iemmp3_cos64[16],iemmp3_cos32[8],iemmp3_cos16[4],iemmp3_cos8[2],iemmp3_cos4[1];
+real *iemmp3_pnts[] = { iemmp3_cos64,iemmp3_cos32,iemmp3_cos16,iemmp3_cos8,iemmp3_cos4 };
+
+static long iemmp3_intwinbase[] = {
+ 0, -1, -1, -1, -1, -1, -1, -2, -2, -2,
+ -2, -3, -3, -4, -4, -5, -5, -6, -7, -7,
+ -8, -9, -10, -11, -13, -14, -16, -17, -19, -21,
+ -24, -26, -29, -31, -35, -38, -41, -45, -49, -53,
+ -58, -63, -68, -73, -79, -85, -91, -97, -104, -111,
+ -117, -125, -132, -139, -147, -154, -161, -169, -176, -183,
+ -190, -196, -202, -208, -213, -218, -222, -225, -227, -228,
+ -228, -227, -224, -221, -215, -208, -200, -189, -177, -163,
+ -146, -127, -106, -83, -57, -29, 2, 36, 72, 111,
+ 153, 197, 244, 294, 347, 401, 459, 519, 581, 645,
+ 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356,
+ 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962,
+ 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000,
+ 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970,
+ 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388,
+ -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
+ -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209,
+ -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959,
+ -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092,
+ -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082,
+ -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455,
+ 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289,
+ 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617,
+ 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684,
+ 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835,
+ 73415, 73908, 74313, 74630, 74856, 74992, 75038 };
+
+static short iemmp3_tab0[] =
+{
+ 0
+};
+
+static short iemmp3_tab1[] =
+{
+ -5, -3, -1, 17, 1, 16, 0
+};
+
+static short iemmp3_tab2[] =
+{
+ -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1,
+ 16, 0
+};
+
+static short iemmp3_tab3[] =
+{
+ -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1,
+ 1, 0
+};
+
+static short iemmp3_tab5[] =
+{
+ -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19,
+ 3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16,
+ 0
+};
+
+static short iemmp3_tab6[] =
+{
+ -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19,
+ 49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16,
+ 0
+};
+
+static short iemmp3_tab7[] =
+{
+ -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83,
+ -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1,
+ 80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7,
+ -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18,
+ -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0
+};
+
+static short iemmp3_tab8[] =
+{
+ -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83,
+ -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52,
+ 67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4,
+ 64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1,
+ 2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0
+};
+
+static short iemmp3_tab9[] =
+{
+ -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1,
+ 84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67,
+ -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5,
+ -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2,
+ 18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0
+};
+
+static short iemmp3_tab10[] =
+{
+ -125,-121,-111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1, 118,
+ 87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3,
+ -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1,
+ 100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23,
+ -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81,
+ -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7,
+ -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1,
+ 50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1,
+ 2, 32, 17, -1, 1, 16, 0
+};
+
+static short iemmp3_tab11[] =
+{
+ -121,-113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118, 117,
+ -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55,
+ -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114,
+ -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96,
+ -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38,
+ 6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1,
+ 36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50,
+ -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2,
+ 32, 17, -3, -1, 1, 16, 0
+};
+
+static short iemmp3_tab12[] =
+{
+ -115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87,
+ 117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115,
+ 85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7,
+ 112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5,
+ -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37,
+ 82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4,
+ 36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3,
+ -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1,
+ 2, 32, 0, 17, -1, 1, 16
+};
+
+static short iemmp3_tab13[] =
+{
+ -509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13, -9,
+ -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238,
+ 207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1,
+ 236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249,
+ 234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158,
+ -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1,
+ 203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245,
+ 231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1,
+ 63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15,
+ -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1,
+ 200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1,
+ 240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1,
+ 46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3,
+ -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1,
+ 198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5,
+ -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167,
+ 151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76,
+ 196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137,
+ 28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106,
+ -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43,
+ -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178,
+ -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1,
+ 58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161,
+ -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88,
+ -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1,
+ 131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25,
+ 145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100,
+ 40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113,
+ -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38,
+ -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6,
+ 96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81,
+ -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11,
+ -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3,
+ -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16,
+ 0
+};
+
+static short iemmp3_tab15[] =
+{
+ -495,-445,-355,-263,-183,-115, -77, -43, -27, -13, -7, -3, -1, 255, 239,
+ -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237,
+ 191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3,
+ -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219,
+ -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173,
+ -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246,
+ -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9,
+ -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243,
+ 216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1,
+ 31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1,
+ 125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3,
+ -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5,
+ -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124,
+ 199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1,
+ 198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183,
+ -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76,
+ -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1,
+ 122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15,
+ -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106,
+ -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5,
+ -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74,
+ -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1,
+ 42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134,
+ 73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29,
+ -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7,
+ -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7,
+ -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86,
+ -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100,
+ 23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69,
+ -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9,
+ -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1,
+ 5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20,
+ 4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48,
+ 34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16,
+ 0
+};
+
+static short iemmp3_tab16[] =
+{
+ -509,-503,-461,-323,-103, -37, -27, -15, -7, -3, -1, 239, 254, -1, 223,
+ 253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3,
+ -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5,
+ -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19,
+ -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1,
+ 238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5,
+ -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125,
+ 94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13,
+ -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3,
+ -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186,
+ -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1,
+ 214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169,
+ -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213,
+ -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154,
+ 108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1,
+ 153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1,
+ 192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45,
+ -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107,
+ -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12,
+ -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1,
+ 178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74,
+ 164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33,
+ -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3,
+ -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147,
+ -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1,
+ 145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3,
+ -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1,
+ 8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3,
+ -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1,
+ 99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9,
+ -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33,
+ -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20,
+ -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1,
+ 3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16,
+ 0
+};
+
+static short iemmp3_tab24[] =
+{
+ -451,-117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1,
+ 207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9,
+ -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79,
+ 244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31,
+ 240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1,
+ 236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3,
+ -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3,
+ -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255,-235,
+ -143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3,
+ -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9,
+ -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1,
+ 78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185,
+ 170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199,
+ 77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3,
+ -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3,
+ -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196,
+ -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1,
+ 167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1,
+ 137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10,
+ 26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9,
+ 144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165,
+ 27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135,
+ -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104,
+ -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3,
+ -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3,
+ -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7,
+ -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86,
+ 101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15,
+ -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84,
+ -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1,
+ 83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5,
+ 80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5,
+ -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1,
+ 3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16,
+ 0
+};
+
+static short iemmp3_tab_c0[] =
+{
+ -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5,
+ 9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8,
+ 0
+};
+
+static short iemmp3_tab_c1[] =
+{
+ -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9,
+ 8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1,
+ 0
+};
+
+
+
+static struct iemmp3_newHuff iemmp3_ht[] =
+{
+ { /* 0 */ 0 , iemmp3_tab0 } ,
+ { /* 2 */ 0 , iemmp3_tab1 } ,
+ { /* 3 */ 0 , iemmp3_tab2 } ,
+ { /* 3 */ 0 , iemmp3_tab3 } ,
+ { /* 0 */ 0 , iemmp3_tab0 } ,
+ { /* 4 */ 0 , iemmp3_tab5 } ,
+ { /* 4 */ 0 , iemmp3_tab6 } ,
+ { /* 6 */ 0 , iemmp3_tab7 } ,
+ { /* 6 */ 0 , iemmp3_tab8 } ,
+ { /* 6 */ 0 , iemmp3_tab9 } ,
+ { /* 8 */ 0 , iemmp3_tab10 } ,
+ { /* 8 */ 0 , iemmp3_tab11 } ,
+ { /* 8 */ 0 , iemmp3_tab12 } ,
+ { /* 16 */ 0 , iemmp3_tab13 } ,
+ { /* 0 */ 0 , iemmp3_tab0 } ,
+ { /* 16 */ 0 , iemmp3_tab15 } ,
+
+ { /* 16 */ 1 , iemmp3_tab16 } ,
+ { /* 16 */ 2 , iemmp3_tab16 } ,
+ { /* 16 */ 3 , iemmp3_tab16 } ,
+ { /* 16 */ 4 , iemmp3_tab16 } ,
+ { /* 16 */ 6 , iemmp3_tab16 } ,
+ { /* 16 */ 8 , iemmp3_tab16 } ,
+ { /* 16 */ 10, iemmp3_tab16 } ,
+ { /* 16 */ 13, iemmp3_tab16 } ,
+ { /* 16 */ 4 , iemmp3_tab24 } ,
+ { /* 16 */ 5 , iemmp3_tab24 } ,
+ { /* 16 */ 6 , iemmp3_tab24 } ,
+ { /* 16 */ 7 , iemmp3_tab24 } ,
+ { /* 16 */ 8 , iemmp3_tab24 } ,
+ { /* 16 */ 9 , iemmp3_tab24 } ,
+ { /* 16 */ 11, iemmp3_tab24 } ,
+ { /* 16 */ 13, iemmp3_tab24 }
+};
+
+static struct iemmp3_newHuff iemmp3_htc[] =
+{
+ { /* 1 , 1 , */ 0 , iemmp3_tab_c0 } ,
+ { /* 1 , 1 , */ 0 , iemmp3_tab_c1 }
+};
+
+
+static t_class *sigmp3play_class;
+
+
+
+static BOOL InitMP3(struct iemmp3Struct *mp)
+{
+ memset(mp,0,sizeof(struct iemmp3Struct));
+
+ mp->framesize = 0;
+ mp->fsizeold = -1;
+ mp->bsize = 0;
+ mp->head = mp->tail = NULL;
+ mp->fr.single = -1;
+ mp->bsnum = 0;
+ mp->synth_bo = 1;
+
+ make_decode_tables(32767);
+ init_layer3(SBLIMIT);
+
+ return !0;
+}
+
+static BOOL InitAgainMP3(struct iemmp3Struct *mp)
+{
+ memset(mp,0,sizeof(struct iemmp3Struct));
+
+ mp->framesize = 0;
+ mp->fsizeold = -1;
+ mp->bsize = 0;
+ mp->head = mp->tail = NULL;
+ mp->fr.single = -1;
+ mp->bsnum = 0;
+ mp->synth_bo = 1;
+
+ return !0;
+}
+
+static void ExitMP3(struct iemmp3Struct *mp)
+{
+ struct iemmp3_buf *b,*bn;
+
+ b = mp->tail;
+ while(b)
+ {
+ free(b->pnt);
+ bn = b->next;
+ free(b);
+ b = bn;
+ }
+}
+
+static int decodeMP3(struct iemmp3Struct *mp, char *in, int isize, char *out, int osize, int *done)
+{
+ int len,error=1;
+
+ iemmp3_gmp = mp;
+
+ if(osize < 4608)
+ {
+ post("To less out space\n");
+ return MP3_ERR;
+ }
+
+ if(in)
+ {
+ if(addbuf(mp,in,isize) == NULL)
+ {
+ return MP3_ERR;
+ }
+ }
+
+ /* First decode header */
+ if(mp->framesize == 0)
+ {
+ if(mp->bsize < 4)
+ {
+ return MP3_NEED_MORE;
+ }
+ if(!read_head(mp))
+ return MP3_EX;
+ if(decode_header(&mp->fr,mp->header) == MP3_EX)
+ return MP3_EX;
+ mp->framesize = mp->fr.framesize;
+ }
+
+ if(mp->fr.framesize > mp->bsize)
+ return MP3_NEED_MORE;
+
+ iemmp3_wordpointer = mp->bsspace[mp->bsnum] + 512;
+ mp->bsnum = (mp->bsnum + 1) & 0x1;
+ iemmp3_bitindex = 0;
+
+ len = 0;
+ while(len < mp->framesize)
+ {
+ int nlen;
+ int blen = mp->tail->size - mp->tail->pos;
+ if( (mp->framesize - len) <= blen)
+ {
+ nlen = mp->framesize-len;
+ }
+ else
+ {
+ nlen = blen;
+ }
+ memcpy(iemmp3_wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen);
+ len += nlen;
+ mp->tail->pos += nlen;
+ mp->bsize -= nlen;
+ if(mp->tail->pos == mp->tail->size)
+ {
+ remove_buf(mp);
+ }
+ }
+
+ *done = 0;
+ if(mp->fr.error_protection)
+ getbits(16);
+ do_layer3(&mp->fr,(unsigned char *) out,done,&error);
+ if(!error)
+ return MP3_EX;
+
+ mp->fsizeold = mp->framesize;
+ mp->framesize = 0;
+
+ return MP3_OK;
+}
+
+static void make_decode_tables(long scaleval)
+{
+ int i,j,k,kr,divv;
+ real *table,*costab;
+
+ for(i=0;i<5;i++)
+ {
+ kr=0x10>>i; divv=0x40>>i;
+ costab = iemmp3_pnts[i];
+ for(k=0;k<kr;k++)
+ costab[k] = 1.0 / (2.0 * cos(M_PI * ((double) k * 2.0 + 1.0) / (double) divv));
+ }
+
+ table = iemmp3_decwin;
+ scaleval = -scaleval;
+ for(i=0,j=0;i<256;i++,j++,table+=32)
+ {
+ if(table < iemmp3_decwin+512+16)
+ table[16] = table[0] = (double) iemmp3_intwinbase[j] / 65536.0 * (double) scaleval;
+ if(i % 32 == 31)
+ table -= 1023;
+ if(i % 64 == 63)
+ scaleval = - scaleval;
+ }
+
+ for( /* i=256 */ ;i<512;i++,j--,table+=32)
+ {
+ if(table < iemmp3_decwin+512+16)
+ table[16] = table[0] = (double) iemmp3_intwinbase[j] / 65536.0 * (double) scaleval;
+ if(i % 32 == 31)
+ table -= 1023;
+ if(i % 64 == 63)
+ scaleval = - scaleval;
+ }
+}
+
+
+static void init_layer3(int down_sample_sblimit)
+{
+ int i,j,k,l;
+
+ for(i=-256;i<118+4;i++)
+ iemmp3_gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) );
+
+ for(i=0;i<8207;i++)
+ iemmp3_ispow[i] = pow((double)i,(double)4.0/3.0);
+
+ for (i=0;i<8;i++)
+ {
+ static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
+ double sq=sqrt(1.0+Ci[i]*Ci[i]);
+ iemmp3_aa_cs[i] = 1.0/sq;
+ iemmp3_aa_ca[i] = Ci[i]/sq;
+ }
+
+ for(i=0;i<18;i++)
+ {
+ iemmp3_win[0][i] = iemmp3_win[1][i] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 );
+ iemmp3_win[0][i+18] = iemmp3_win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
+ }
+ for(i=0;i<6;i++)
+ {
+ iemmp3_win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
+ iemmp3_win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 );
+ iemmp3_win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 );
+ iemmp3_win[1][i+30] = iemmp3_win[3][i] = 0.0;
+ iemmp3_win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 );
+ }
+
+ for(i=0;i<9;i++)
+ iemmp3_COS9[i] = cos( M_PI / 18.0 * (double) i);
+
+ for(i=0;i<9;i++)
+ iemmp3_tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 );
+ for(i=0;i<3;i++)
+ iemmp3_tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 );
+
+ iemmp3_COS6_1 = cos( M_PI / 6.0 * (double) 1);
+ iemmp3_COS6_2 = cos( M_PI / 6.0 * (double) 2);
+
+ for(i=0;i<12;i++)
+ {
+ iemmp3_win[2][i] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 );
+ for(j=0;j<6;j++)
+ iemmp3_COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) );
+ }
+
+ for(j=0;j<4;j++)
+ {
+ static int len[4] = { 36,36,12,36 };
+ for(i=0;i<len[j];i+=2)
+ iemmp3_win1[j][i] = + iemmp3_win[j][i];
+ for(i=1;i<len[j];i+=2)
+ iemmp3_win1[j][i] = - iemmp3_win[j][i];
+ }
+
+ for(i=0;i<16;i++)
+ {
+ double t = tan( (double) i * M_PI / 12.0 );
+ iemmp3_tan1_1[i] = t / (1.0+t);
+ iemmp3_tan2_1[i] = 1.0 / (1.0 + t);
+ iemmp3_tan1_2[i] = M_SQRT2 * t / (1.0+t);
+ iemmp3_tan2_2[i] = M_SQRT2 / (1.0 + t);
+
+ for(j=0;j<2;j++)
+ {
+ double base = pow(2.0,-0.25*(j+1.0));
+ double p1=1.0,p2=1.0;
+ if(i > 0)
+ {
+ if( i & 1 )
+ p1 = pow(base,(i+1.0)*0.5);
+ else
+ p2 = pow(base,i*0.5);
+ }
+ iemmp3_pow1_1[j][i] = p1;
+ iemmp3_pow2_1[j][i] = p2;
+ iemmp3_pow1_2[j][i] = M_SQRT2 * p1;
+ iemmp3_pow2_2[j][i] = M_SQRT2 * p2;
+ }
+ }
+
+ for(j=0;j<9;j++)
+ {
+ struct iemmp3_bandInfoStruct *bi = &bandInfo[j];
+ int *mp;
+ int cb,lwin;
+ short *bdf;
+
+ mp = iemmp3_map[j][0] = iemmp3_mapbuf0[j];
+ bdf = bi->longDiff;
+ for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++)
+ {
+ *mp++ = (*bdf) >> 1;
+ *mp++ = i;
+ *mp++ = 3;
+ *mp++ = cb;
+ }
+ bdf = bi->shortDiff+3;
+ for(cb=3;cb<13;cb++)
+ {
+ int l = (*bdf++) >> 1;
+ for(lwin=0;lwin<3;lwin++)
+ {
+ *mp++ = l;
+ *mp++ = i + lwin;
+ *mp++ = lwin;
+ *mp++ = cb;
+ }
+ i += 6*l;
+ }
+ iemmp3_mapend[j][0] = mp;
+
+ mp = iemmp3_map[j][1] = iemmp3_mapbuf1[j];
+ bdf = bi->shortDiff+0;
+ for(i=0,cb=0;cb<13;cb++)
+ {
+ int l = (*bdf++) >> 1;
+ for(lwin=0;lwin<3;lwin++)
+ {
+ *mp++ = l;
+ *mp++ = i + lwin;
+ *mp++ = lwin;
+ *mp++ = cb;
+ }
+ i += 6*l;
+ }
+ iemmp3_mapend[j][1] = mp;
+
+ mp = iemmp3_map[j][2] = iemmp3_mapbuf2[j];
+ bdf = bi->longDiff;
+ for(cb = 0; cb < 22 ; cb++)
+ {
+ *mp++ = (*bdf++) >> 1;
+ *mp++ = cb;
+ }
+ iemmp3_mapend[j][2] = mp;
+ }
+
+ for(j=0;j<9;j++)
+ {
+ for(i=0;i<23;i++)
+ {
+ iemmp3_longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
+ if(iemmp3_longLimit[j][i] > (down_sample_sblimit) )
+ iemmp3_longLimit[j][i] = down_sample_sblimit;
+ }
+ for(i=0;i<14;i++)
+ {
+ iemmp3_shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
+ if(iemmp3_shortLimit[j][i] > (down_sample_sblimit) )
+ iemmp3_shortLimit[j][i] = down_sample_sblimit;
+ }
+ }
+
+ for(i=0;i<5;i++)
+ {
+ for(j=0;j<6;j++)
+ {
+ for(k=0;k<6;k++)
+ {
+ int n = k + j * 6 + i * 36;
+ iemmp3_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
+ }
+ }
+ }
+ for(i=0;i<4;i++)
+ {
+ for(j=0;j<4;j++)
+ {
+ for(k=0;k<4;k++)
+ {
+ int n = k + j * 4 + i * 16;
+ iemmp3_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
+ }
+ }
+ }
+ for(i=0;i<4;i++)
+ {
+ for(j=0;j<3;j++)
+ {
+ int n = j + i * 3;
+ iemmp3_slen2[n+244] = i|(j<<3) | (5<<12);
+ iemmp3_n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
+ }
+ }
+
+ for(i=0;i<5;i++)
+ {
+ for(j=0;j<5;j++)
+ {
+ for(k=0;k<4;k++)
+ {
+ for(l=0;l<4;l++)
+ {
+ int n = l + k * 4 + j * 16 + i * 80;
+ iemmp3_n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
+ }
+ }
+ }
+ }
+ for(i=0;i<5;i++)
+ {
+ for(j=0;j<5;j++)
+ {
+ for(k=0;k<4;k++)
+ {
+ int n = k + j * 4 + i * 20;
+ iemmp3_n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
+ }
+ }
+ }
+}
+
+static void remove_buf(struct iemmp3Struct *mp)
+{
+ struct iemmp3_buf *buf = mp->tail;
+
+ mp->tail = buf->next;
+ if(mp->tail)
+ mp->tail->prev = NULL;
+ else
+ {
+ mp->tail = mp->head = NULL;
+ }
+ free(buf->pnt);
+ free(buf);
+}
+
+static struct iemmp3_buf *addbuf(struct iemmp3Struct *mp,char *buf,int size)
+{
+ struct iemmp3_buf *nbuf;
+
+ nbuf = malloc( sizeof(struct iemmp3_buf) );
+ if(!nbuf)
+ {
+ post("Out of memory!\n");
+ return NULL;
+ }
+ nbuf->pnt = malloc(size);
+ if(!nbuf->pnt)
+ {
+ free(nbuf);
+ return NULL;
+ }
+ nbuf->size = size;
+ memcpy(nbuf->pnt,buf,size);
+ nbuf->next = NULL;
+ nbuf->prev = mp->head;
+ nbuf->pos = 0;
+ if(!mp->tail)
+ {
+ mp->tail = nbuf;
+ }
+ else
+ {
+ mp->head->next = nbuf;
+ }
+ mp->head = nbuf;
+ mp->bsize += size;
+ return nbuf;
+}
+
+static int read_buf_byte(struct iemmp3Struct *mp,int *err)
+{
+ unsigned int b;
+ int pos;
+
+ pos = mp->tail->pos;
+ while(pos >= mp->tail->size)
+ {
+ remove_buf(mp);
+ pos = mp->tail->pos;
+ if(!mp->tail)
+ {
+ post("Fatal error!\n");
+ *err = 0;
+ return(0);
+ }
+ }
+ b = mp->tail->pnt[pos];
+ mp->bsize--;
+ mp->tail->pos++;
+ return(b);
+}
+
+static int read_head(struct iemmp3Struct *mp)
+{
+ unsigned long head;
+ int error=1;
+
+ head = read_buf_byte(mp,&error);
+ head <<= 8;
+ head |= read_buf_byte(mp,&error);
+ head <<= 8;
+ head |= read_buf_byte(mp,&error);
+ head <<= 8;
+ head |= read_buf_byte(mp,&error);
+ mp->header = head;
+ return(error);
+}
+
+static int decode_header(struct iemmp3_frame *fr,unsigned long newhead)
+{
+ if( newhead & (1<<20) )
+ {
+ fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1;
+ fr->mpeg25 = 0;
+ }
+ else
+ {
+ fr->lsf = 1;
+ fr->mpeg25 = 1;
+ }
+ fr->lay = 4-((newhead>>17)&3);
+ if( ((newhead>>10)&0x3) == 0x3)
+ {
+ post("Stream error");
+ return(MP3_EX);
+ }
+ if(fr->mpeg25)
+ {
+ fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
+ }
+ else
+ fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
+ fr->error_protection = ((newhead>>16)&0x1)^0x1;
+ if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */
+ fr->bitrate_index = ((newhead>>12)&0xf);
+ fr->bitrate_index = ((newhead>>12)&0xf);
+ fr->padding = ((newhead>>9)&0x1);
+ fr->extension = ((newhead>>8)&0x1);
+ fr->mode = ((newhead>>6)&0x3);
+ fr->mode_ext = ((newhead>>4)&0x3);
+ fr->copyright = ((newhead>>3)&0x1);
+ fr->original = ((newhead>>2)&0x1);
+ fr->emphasis = newhead & 0x3;
+ fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
+ if(!fr->bitrate_index)
+ {
+ post("Free format not supported.\n");
+ return(0);
+ }
+ switch(fr->lay)
+ {
+ case 1:
+ post("Layer I not supported!\n");
+ break;
+ case 2:
+ post("Layer II not supported!\n");
+ break;
+ case 3:
+ fr->framesize = (long) iemmp3_tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
+ fr->framesize /= iemmp3_freqs[fr->sampling_frequency]<<(fr->lsf);
+ fr->framesize = fr->framesize + fr->padding - 4;
+ //post("Framesize: %d",fr->framesize);
+ break;
+ default:
+ post("Sorry, unknown layer type.\n");
+ return (0);
+ }
+ return(1);
+}
+
+static unsigned int getbits(int number_of_bits)
+{
+ unsigned long rval;
+
+ if(!number_of_bits)
+ return 0;
+ {
+ rval = iemmp3_wordpointer[0];
+ rval <<= 8;
+ rval |= iemmp3_wordpointer[1];
+ rval <<= 8;
+ rval |= iemmp3_wordpointer[2];
+ rval <<= iemmp3_bitindex;
+ rval &= 0xffffff;
+ iemmp3_bitindex += number_of_bits;
+ rval >>= (24-number_of_bits);
+ iemmp3_wordpointer += (iemmp3_bitindex>>3);
+ iemmp3_bitindex &= 7;
+ }
+ return rval;
+}
+
+static unsigned int getbits_fast(int number_of_bits)
+{
+ unsigned long rval;
+
+ {
+ rval = iemmp3_wordpointer[0];
+ rval <<= 8;
+ rval |= iemmp3_wordpointer[1];
+ rval <<= iemmp3_bitindex;
+ rval &= 0xffff;
+ iemmp3_bitindex += number_of_bits;
+ rval >>= (16-number_of_bits);
+ iemmp3_wordpointer += (iemmp3_bitindex>>3);
+ iemmp3_bitindex &= 7;
+ }
+ return rval;
+}
+
+static unsigned int get1bit(void)
+{
+ unsigned char rval;
+ rval = *iemmp3_wordpointer << iemmp3_bitindex;
+
+ iemmp3_bitindex++;
+ iemmp3_wordpointer += (iemmp3_bitindex>>3);
+ iemmp3_bitindex &= 7;
+
+ return rval>>7;
+}
+
+static int do_layer3(struct iemmp3_frame *fr,unsigned char *pcm_sample,int *pcm_point,int *err)
+{
+ int gr, ch, ss,clip=0;
+ int scalefacs[39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
+ struct iemmp3_III_sideinfo sideinfo;
+ int stereo = fr->stereo;
+ int single = fr->single;
+ int ms_stereo,i_stereo;
+ int sfreq = fr->sampling_frequency;
+ int stereo1,granules;
+
+ if(stereo == 1)
+ { /* stream is mono */
+ stereo1 = 1;
+ single = 0;
+ }
+ else if(single >= 0) /* stream is stereo, but force to mono */
+ stereo1 = 1;
+ else
+ stereo1 = 2;
+
+ if(fr->mode == MPG_MD_JOINT_STEREO)
+ {
+ ms_stereo = fr->mode_ext & 0x2;
+ i_stereo = fr->mode_ext & 0x1;
+ }
+ else
+ ms_stereo = i_stereo = 0;
+
+ if(fr->lsf)
+ {
+ granules = 1;
+ if(!III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single))
+ {
+ *err = 0;
+ return 0;
+ }
+ }
+ else
+ {
+ granules = 2;
+#ifdef IEM_MPEG1
+ if(!III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single))
+ {
+ *err = 0;
+ return 0;
+ }
+#else
+ post("Not supported\n");
+#endif
+ }
+
+ if(set_pointer(sideinfo.main_data_begin) == MP3_ERR)
+ return 0;
+
+ for (gr=0;gr<granules;gr++)
+ {
+ static real hybridIn[2][SBLIMIT][SSLIMIT];
+ static real hybridOut[2][SSLIMIT][SBLIMIT];
+
+ {
+ struct iemmp3_gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
+ long part2bits;
+ if(fr->lsf)
+ part2bits = III_get_scale_factors_2(scalefacs,gr_info,0);
+ else
+ {
+#ifdef IEM_MPEG1
+ part2bits = III_get_scale_factors_1(scalefacs,gr_info);
+#else
+ post("Not supported\n");
+#endif
+ }
+ if(III_dequantize_sample(hybridIn[0], scalefacs,gr_info,sfreq,part2bits))
+ return clip;
+ }
+ if(stereo == 2)
+ {
+ struct iemmp3_gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]);
+ long part2bits;
+ if(fr->lsf)
+ part2bits = III_get_scale_factors_2(scalefacs,gr_info,i_stereo);
+ else
+ {
+#ifdef IEM_MPEG1
+ part2bits = III_get_scale_factors_1(scalefacs,gr_info);
+#else
+ post("Not supported\n");
+#endif
+ }
+
+ if(III_dequantize_sample(hybridIn[1],scalefacs,gr_info,sfreq,part2bits))
+ return clip;
+
+ if(ms_stereo)
+ {
+ int i;
+ for(i=0;i<SBLIMIT*SSLIMIT;i++)
+ {
+ real tmp0,tmp1;
+ tmp0 = ((real *) hybridIn[0])[i];
+ tmp1 = ((real *) hybridIn[1])[i];
+ ((real *) hybridIn[1])[i] = tmp0 - tmp1;
+ ((real *) hybridIn[0])[i] = tmp0 + tmp1;
+ }
+ }
+
+ if(i_stereo)
+ III_i_stereo(hybridIn,scalefacs,gr_info,sfreq,ms_stereo,fr->lsf);
+
+ if(ms_stereo || i_stereo || (single == 3) )
+ {
+ if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb)
+ sideinfo.ch[0].gr[gr].maxb = gr_info->maxb;
+ else
+ gr_info->maxb = sideinfo.ch[0].gr[gr].maxb;
+ }
+
+ switch(single)
+ {
+ case 3:
+ {
+ register unsigned int i;
+ register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
+ for(i=0;i<SSLIMIT*gr_info->maxb;i++,in0++)
+ *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */
+ }
+ break;
+ case 1:
+ {
+ register unsigned int i;
+ register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
+ for(i=0;i<SSLIMIT*gr_info->maxb;i++)
+ *in0++ = *in1++;
+ }
+ break;
+ }
+ }
+
+ for(ch=0;ch<stereo1;ch++)
+ {
+ struct iemmp3_gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
+ III_antialias(hybridIn[ch],gr_info);
+ III_hybrid(hybridIn[ch], hybridOut[ch], ch,gr_info);
+ }
+
+ for(ss=0;ss<SSLIMIT;ss++)
+ {
+ if(single >= 0)
+ {
+ clip += synth_1to1_mono(hybridOut[0][ss],pcm_sample,pcm_point);
+ }
+ else
+ {
+ int p1 = *pcm_point;
+ clip += synth_1to1(hybridOut[0][ss],0,pcm_sample,&p1);
+ clip += synth_1to1(hybridOut[1][ss],1,pcm_sample,pcm_point);
+ }
+ }
+ }
+
+ return clip;
+}
+
+static int III_get_side_info_2(struct iemmp3_III_sideinfo *si,int stereo,
+ int ms_stereo,long sfreq,int single)
+{
+ int ch;
+ int powdiff = (single == 3) ? 4 : 0;
+
+ si->main_data_begin = getbits(8);
+ if (stereo == 1)
+ si->private_bits = get1bit();
+ else
+ si->private_bits = getbits_fast(2);
+
+ for (ch=0; ch<stereo; ch++)
+ {
+ register struct iemmp3_gr_info_s *gr_info = &(si->ch[ch].gr[0]);
+
+ gr_info->part2_3_length = getbits(12);
+ gr_info->big_values = getbits_fast(9);
+ if(gr_info->big_values > 288)
+ {
+ post("big_values too large!\n");
+ gr_info->big_values = 288;
+ }
+ gr_info->pow2gain = iemmp3_gainpow2+256 - getbits_fast(8) + powdiff;
+ if(ms_stereo)
+ gr_info->pow2gain += 2;
+ gr_info->scalefac_compress = getbits(9);
+ /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
+ if(get1bit())
+ {
+ int i;
+ gr_info->block_type = getbits_fast(2);
+ gr_info->mixed_block_flag = get1bit();
+ gr_info->table_select[0] = getbits_fast(5);
+ gr_info->table_select[1] = getbits_fast(5);
+ /*
+ * table_select[2] not needed, because there is no region2,
+ * but to satisfy some verifications tools we set it either.
+ */
+ gr_info->table_select[2] = 0;
+ for(i=0;i<3;i++)
+ gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
+ if(gr_info->block_type == 0)
+ {
+ post("Blocktype == 0 and window-switching == 1 not allowed.\n");
+ return(0);
+ }
+ /* region_count/start parameters are implicit in this case. */
+ /* check this again! */
+ if(gr_info->block_type == 2)
+ gr_info->region1start = 36>>1;
+ else if(sfreq == 8)
+ /* check this for 2.5 and sfreq=8 */
+ gr_info->region1start = 108>>1;
+ else
+ gr_info->region1start = 54>>1;
+ gr_info->region2start = 576>>1;
+ }
+ else
+ {
+ int i,r0c,r1c;
+ for (i=0; i<3; i++)
+ gr_info->table_select[i] = getbits_fast(5);
+ r0c = getbits_fast(4);
+ r1c = getbits_fast(3);
+ gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
+ gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
+ gr_info->block_type = 0;
+ gr_info->mixed_block_flag = 0;
+ }
+ gr_info->scalefac_scale = get1bit();
+ gr_info->count1table_select = get1bit();
+ }
+ return(1);
+}
+
+
+#ifdef IEM_MPEG1
+static int III_get_side_info_1(struct iemmp3_III_sideinfo *si,int stereo,
+ int ms_stereo,long sfreq,int single)
+{
+ int ch, gr;
+ int powdiff = (single == 3) ? 4 : 0;
+
+ si->main_data_begin = getbits(9);
+ if (stereo == 1)
+ si->private_bits = getbits_fast(5);
+ else
+ si->private_bits = getbits_fast(3);
+
+ for (ch=0; ch<stereo; ch++)
+ {
+ si->ch[ch].gr[0].scfsi = -1;
+ si->ch[ch].gr[1].scfsi = getbits_fast(4);
+ }
+
+ for (gr=0; gr<2; gr++)
+ {
+ for (ch=0; ch<stereo; ch++)
+ {
+ register struct iemmp3_gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
+
+ gr_info->part2_3_length = getbits(12);
+ gr_info->big_values = getbits_fast(9);
+ if(gr_info->big_values > 288)
+ {
+ post("big_values too large!\n");
+ gr_info->big_values = 288;
+ }
+ gr_info->pow2gain = iemmp3_gainpow2+256 - getbits_fast(8) + powdiff;
+ if(ms_stereo)
+ gr_info->pow2gain += 2;
+ gr_info->scalefac_compress = getbits_fast(4);
+ /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
+ if(get1bit())
+ {
+ int i;
+
+ gr_info->block_type = getbits_fast(2);
+ gr_info->mixed_block_flag = get1bit();
+ gr_info->table_select[0] = getbits_fast(5);
+ gr_info->table_select[1] = getbits_fast(5);
+ /*
+ * table_select[2] not needed, because there is no region2,
+ * but to satisfy some verifications tools we set it either.
+ */
+ gr_info->table_select[2] = 0;
+ for(i=0;i<3;i++)
+ gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
+
+ if(gr_info->block_type == 0)
+ {
+ post("Blocktype == 0 and window-switching == 1 not allowed.\n");
+ return(0);
+ }
+ /* region_count/start parameters are implicit in this case. */
+ gr_info->region1start = 36>>1;
+ gr_info->region2start = 576>>1;
+ }
+ else
+ {
+ int i,r0c,r1c;
+ for (i=0; i<3; i++)
+ gr_info->table_select[i] = getbits_fast(5);
+ r0c = getbits_fast(4);
+ r1c = getbits_fast(3);
+ gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
+ gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
+ gr_info->block_type = 0;
+ gr_info->mixed_block_flag = 0;
+ }
+ gr_info->preflag = get1bit();
+ gr_info->scalefac_scale = get1bit();
+ gr_info->count1table_select = get1bit();
+ }
+ }
+ return(1);
+}
+#endif
+
+static int set_pointer(long backstep)
+{
+ unsigned char *bsbufold;
+ if(iemmp3_gmp->fsizeold < 0 && backstep > 0)
+ {
+ post("Can't step back %ld!\n",backstep);
+ return MP3_ERR;
+ }
+ bsbufold = iemmp3_gmp->bsspace[iemmp3_gmp->bsnum] + 512;
+ iemmp3_wordpointer -= backstep;
+ if (backstep)
+ memcpy(iemmp3_wordpointer,bsbufold+iemmp3_gmp->fsizeold-backstep,backstep);
+ iemmp3_bitindex = 0;
+ return MP3_OK;
+}
+
+#ifdef IEM_MPEG1
+static int III_get_scale_factors_1(int *scf,struct iemmp3_gr_info_s *gr_info)
+{
+ static unsigned char slen[2][16] = {
+ {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
+ {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
+ };
+ int numbits;
+ int num0 = slen[0][gr_info->scalefac_compress];
+ int num1 = slen[1][gr_info->scalefac_compress];
+
+ if (gr_info->block_type == 2)
+ {
+ int i=18;
+
+ numbits = (num0 + num1) * 18;
+ if (gr_info->mixed_block_flag)
+ {
+ for (i=8;i;i--)
+ *scf++ = getbits_fast(num0);
+ i = 9;
+ numbits -= num0; /* num0 * 17 + num1 * 18 */
+ }
+
+ for (;i;i--)
+ *scf++ = getbits_fast(num0);
+ for (i = 18; i; i--)
+ *scf++ = getbits_fast(num1);
+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */
+ }
+ else
+ {
+ int i;
+ int scfsi = gr_info->scfsi;
+
+ if(scfsi < 0)
+ { /* scfsi < 0 => granule == 0 */
+ for(i=11;i;i--)
+ *scf++ = getbits_fast(num0);
+ for(i=10;i;i--)
+ *scf++ = getbits_fast(num1);
+ numbits = (num0 + num1) * 10 + num0;
+ }
+ else
+ {
+ numbits = 0;
+ if(!(scfsi & 0x8))
+ {
+ for (i=6;i;i--)
+ *scf++ = getbits_fast(num0);
+ numbits += num0 * 6;
+ }
+ else
+ {
+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
+ *scf++ = 0; *scf++ = 0; *scf++ = 0;
+ }
+
+ if(!(scfsi & 0x4))
+ {
+ for (i=5;i;i--)
+ *scf++ = getbits_fast(num0);
+ numbits += num0 * 5;
+ }
+ else
+ {
+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
+ *scf++ = 0; *scf++ = 0;
+ }
+
+ if(!(scfsi & 0x2))
+ {
+ for(i=5;i;i--)
+ *scf++ = getbits_fast(num1);
+ numbits += num1 * 5;
+ }
+ else
+ {
+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
+ *scf++ = 0; *scf++ = 0;
+ }
+
+ if(!(scfsi & 0x1))
+ {
+ for (i=5;i;i--)
+ *scf++ = getbits_fast(num1);
+ numbits += num1 * 5;
+ }
+ else
+ {
+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */
+ *scf++ = 0; *scf++ = 0;
+ }
+ }
+
+ *scf++ = 0; /* no l[21] in original sources */
+ }
+ return numbits;
+}
+#endif
+
+static int III_get_scale_factors_2(int *scf,struct iemmp3_gr_info_s *gr_info,int i_stereo)
+{
+ unsigned char *pnt;
+ int i,j;
+ unsigned int slen;
+ int n = 0;
+ int numbits = 0;
+
+ static unsigned char stab[3][6][4] = {
+ { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} ,
+ { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } ,
+ { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} ,
+ {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } ,
+ { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} ,
+ { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } };
+
+ if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */
+ slen = iemmp3_slen2[gr_info->scalefac_compress>>1];
+ else
+ slen = iemmp3_n_slen2[gr_info->scalefac_compress];
+
+ gr_info->preflag = (slen>>15) & 0x1;
+
+ n = 0;
+ if( gr_info->block_type == 2 )
+ {
+ n++;
+ if(gr_info->mixed_block_flag)
+ n++;
+ }
+
+ pnt = stab[n][(slen>>12)&0x7];
+
+ for(i=0;i<4;i++)
+ {
+ int num = slen & 0x7;
+ slen >>= 3;
+ if(num)
+ {
+ for(j=0;j<(int)(pnt[i]);j++)
+ *scf++ = getbits_fast(num);
+ numbits += pnt[i] * num;
+ }
+ else
+ {
+ for(j=0;j<(int)(pnt[i]);j++)
+ *scf++ = 0;
+ }
+ }
+
+ n = (n << 1) + 1;
+ for(i=0;i<n;i++)
+ *scf++ = 0;
+
+ return numbits;
+}
+
+
+
+static int III_dequantize_sample(real xr[SBLIMIT][SSLIMIT],int *scf,
+ struct iemmp3_gr_info_s *gr_info,int sfreq,int part2bits)
+{
+ int shift = 1 + gr_info->scalefac_scale;
+ real *xrpnt = (real *) xr;
+ int l[3],l3;
+ int part2remain = gr_info->part2_3_length - part2bits;
+ int *me;
+
+ {
+ int bv = gr_info->big_values;
+ int region1 = gr_info->region1start;
+ int region2 = gr_info->region2start;
+
+ l3 = ((576>>1)-bv)>>1;
+ /*
+ * we may lose the 'odd' bit here !!
+ * check this later again
+ */
+ if(bv <= region1)
+ {
+ l[0] = bv; l[1] = 0; l[2] = 0;
+ }
+ else
+ {
+ l[0] = region1;
+ if(bv <= region2)
+ {
+ l[1] = bv - l[0]; l[2] = 0;
+ }
+ else
+ {
+ l[1] = region2 - l[0]; l[2] = bv - region2;
+ }
+ }
+ }
+
+ if(gr_info->block_type == 2)
+ {
+ /*
+ * decoding with short or mixed mode BandIndex table
+ */
+ int i,max[4];
+ int step=0,lwin=0,cb=0;
+ register real v = 0.0;
+ register int *m,mc;
+
+ if(gr_info->mixed_block_flag)
+ {
+ max[3] = -1;
+ max[0] = max[1] = max[2] = 2;
+ m = iemmp3_map[sfreq][0];
+ me = iemmp3_mapend[sfreq][0];
+ }
+ else
+ {
+ max[0] = max[1] = max[2] = max[3] = -1;
+ /* max[3] not really needed in this case */
+ m = iemmp3_map[sfreq][1];
+ me = iemmp3_mapend[sfreq][1];
+ }
+
+ mc = 0;
+ for(i=0;i<2;i++)
+ {
+ int lp = l[i];
+ struct iemmp3_newHuff *h = iemmp3_ht+gr_info->table_select[i];
+ for(;lp;lp--,mc--)
+ {
+ register int x,y;
+ if( (!mc) )
+ {
+ mc = *m++;
+ xrpnt = ((real *) xr) + (*m++);
+ lwin = *m++;
+ cb = *m++;
+ if(lwin == 3)
+ {
+ v = gr_info->pow2gain[(*scf++) << shift];
+ step = 1;
+ }
+ else
+ {
+ v = gr_info->full_gain[lwin][(*scf++) << shift];
+ step = 3;
+ }
+ }
+ {
+ register short *val = h->table;
+ while((y=*val++)<0)
+ {
+ if (get1bit())
+ val -= y;
+ part2remain--;
+ }
+ x = y >> 4;
+ y &= 0xf;
+ }
+ if(x == 15)
+ {
+ max[lwin] = cb;
+ part2remain -= h->linbits+1;
+ x += getbits(h->linbits);
+ if(get1bit())
+ *xrpnt = -iemmp3_ispow[x] * v;
+ else
+ *xrpnt = iemmp3_ispow[x] * v;
+ }
+ else if(x)
+ {
+ max[lwin] = cb;
+ if(get1bit())
+ *xrpnt = -iemmp3_ispow[x] * v;
+ else
+ *xrpnt = iemmp3_ispow[x] * v;
+ part2remain--;
+ }
+ else
+ *xrpnt = 0.0;
+ xrpnt += step;
+ if(y == 15)
+ {
+ max[lwin] = cb;
+ part2remain -= h->linbits+1;
+ y += getbits(h->linbits);
+ if(get1bit())
+ *xrpnt = -iemmp3_ispow[y] * v;
+ else
+ *xrpnt = iemmp3_ispow[y] * v;
+ }
+ else if(y)
+ {
+ max[lwin] = cb;
+ if(get1bit())
+ *xrpnt = -iemmp3_ispow[y] * v;
+ else
+ *xrpnt = iemmp3_ispow[y] * v;
+ part2remain--;
+ }
+ else
+ *xrpnt = 0.0;
+ xrpnt += step;
+ }
+ }
+ for(;l3 && (part2remain > 0);l3--)
+ {
+ struct iemmp3_newHuff *h = iemmp3_htc+gr_info->count1table_select;
+ register short *val = h->table,a;
+
+ while((a=*val++)<0)
+ {
+ part2remain--;
+ if(part2remain < 0)
+ {
+ part2remain++;
+ a = 0;
+ break;
+ }
+ if (get1bit())
+ val -= a;
+ }
+
+ for(i=0;i<4;i++)
+ {
+ if(!(i & 1))
+ {
+ if(!mc)
+ {
+ mc = *m++;
+ xrpnt = ((real *) xr) + (*m++);
+ lwin = *m++;
+ cb = *m++;
+ if(lwin == 3)
+ {
+ v = gr_info->pow2gain[(*scf++) << shift];
+ step = 1;
+ }
+ else
+ {
+ v = gr_info->full_gain[lwin][(*scf++) << shift];
+ step = 3;
+ }
+ }
+ mc--;
+ }
+ if( (a & (0x8>>i)) )
+ {
+ max[lwin] = cb;
+ part2remain--;
+ if(part2remain < 0)
+ {
+ part2remain++;
+ break;
+ }
+ if(get1bit())
+ *xrpnt = -v;
+ else
+ *xrpnt = v;
+ }
+ else
+ *xrpnt = 0.0;
+ xrpnt += step;
+ }
+ }
+
+ while( m < me )
+ {
+ if(!mc)
+ {
+ mc = *m++;
+ xrpnt = ((real *) xr) + *m++;
+ if( (*m++) == 3)
+ step = 1;
+ else
+ step = 3;
+ m++; /* cb */
+ }
+ mc--;
+ *xrpnt = 0.0;
+ xrpnt += step;
+ *xrpnt = 0.0;
+ xrpnt += step;
+ /* we could add a little opt. here:
+ * if we finished a band for window 3 or a long band
+ * further bands could copied in a simple loop without a
+ * special 'map' decoding
+ */
+ }
+
+ gr_info->maxband[0] = max[0]+1;
+ gr_info->maxband[1] = max[1]+1;
+ gr_info->maxband[2] = max[2]+1;
+ gr_info->maxbandl = max[3]+1;
+
+ {
+ int rmax = max[0] > max[1] ? max[0] : max[1];
+ rmax = (rmax > max[2] ? rmax : max[2]) + 1;
+ gr_info->maxb = rmax ? iemmp3_shortLimit[sfreq][rmax] : iemmp3_longLimit[sfreq][max[3]+1];
+ }
+
+ }
+ else
+ {
+ /*
+ * decoding with 'long' BandIndex table (block_type != 2)
+ */
+ int *pretab = gr_info->preflag ? iemmp3_pretab1 : iemmp3_pretab2;
+ int i,max = -1;
+ int cb = 0;
+ register int *m = iemmp3_map[sfreq][2];
+ register real v = 0.0;
+ register int mc = 0;
+
+ /*
+ * long hash table values
+ */
+ for(i=0;i<3;i++)
+ {
+ int lp = l[i];
+ struct iemmp3_newHuff *h = iemmp3_ht+gr_info->table_select[i];
+
+ for(;lp;lp--,mc--)
+ {
+ int x,y;
+
+ if(!mc)
+ {
+ mc = *m++;
+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+ cb = *m++;
+ }
+ {
+ register short *val = h->table;
+ while((y=*val++)<0)
+ {
+ if (get1bit())
+ val -= y;
+ part2remain--;
+ }
+ x = y >> 4;
+ y &= 0xf;
+ }
+ if (x == 15)
+ {
+ max = cb;
+ part2remain -= h->linbits+1;
+ x += getbits(h->linbits);
+ if(get1bit())
+ *xrpnt++ = -iemmp3_ispow[x] * v;
+ else
+ *xrpnt++ = iemmp3_ispow[x] * v;
+ }
+ else if(x)
+ {
+ max = cb;
+ if(get1bit())
+ *xrpnt++ = -iemmp3_ispow[x] * v;
+ else
+ *xrpnt++ = iemmp3_ispow[x] * v;
+ part2remain--;
+ }
+ else
+ *xrpnt++ = 0.0;
+
+ if (y == 15)
+ {
+ max = cb;
+ part2remain -= h->linbits+1;
+ y += getbits(h->linbits);
+ if(get1bit())
+ *xrpnt++ = -iemmp3_ispow[y] * v;
+ else
+ *xrpnt++ = iemmp3_ispow[y] * v;
+ }
+ else if(y)
+ {
+ max = cb;
+ if(get1bit())
+ *xrpnt++ = -iemmp3_ispow[y] * v;
+ else
+ *xrpnt++ = iemmp3_ispow[y] * v;
+ part2remain--;
+ }
+ else
+ *xrpnt++ = 0.0;
+ }
+ }
+
+ /*
+ * short (count1table) values
+ */
+ for(;l3 && (part2remain > 0);l3--)
+ {
+ struct iemmp3_newHuff *h = iemmp3_htc+gr_info->count1table_select;
+ register short *val = h->table,a;
+
+ while((a=*val++)<0)
+ {
+ part2remain--;
+ if(part2remain < 0)
+ {
+ part2remain++;
+ a = 0;
+ break;
+ }
+ if (get1bit())
+ val -= a;
+ }
+
+ for(i=0;i<4;i++)
+ {
+ if(!(i & 1))
+ {
+ if(!mc)
+ {
+ mc = *m++;
+ cb = *m++;
+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+ }
+ mc--;
+ }
+ if ( (a & (0x8>>i)) )
+ {
+ max = cb;
+ part2remain--;
+ if(part2remain < 0)
+ {
+ part2remain++;
+ break;
+ }
+ if(get1bit())
+ *xrpnt++ = -v;
+ else
+ *xrpnt++ = v;
+ }
+ else
+ *xrpnt++ = 0.0;
+ }
+ }
+
+ /*
+ * zero part
+ */
+ for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--)
+ {
+ *xrpnt++ = 0.0;
+ *xrpnt++ = 0.0;
+ }
+
+ gr_info->maxbandl = max+1;
+ gr_info->maxb = iemmp3_longLimit[sfreq][gr_info->maxbandl];
+ }
+
+ while( part2remain > 16 )
+ {
+ getbits(16); /* Dismiss stuffing Bits */
+ part2remain -= 16;
+ }
+ if(part2remain > 0)
+ getbits(part2remain);
+ else if(part2remain < 0)
+ {
+ post("mpg123: Can't rewind stream by %d bits!\n",-part2remain);
+ return 1; /* -> error */
+ }
+ return 0;
+}
+
+static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,
+ struct iemmp3_gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf)
+{
+ real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;
+ struct iemmp3_bandInfoStruct *bi = &bandInfo[sfreq];
+ real *tab1,*tab2;
+
+ if(lsf)
+ {
+ int p = gr_info->scalefac_compress & 0x1;
+ if(ms_stereo)
+ {
+ tab1 = iemmp3_pow1_2[p]; tab2 = iemmp3_pow2_2[p];
+ }
+ else
+ {
+ tab1 = iemmp3_pow1_1[p]; tab2 = iemmp3_pow2_1[p];
+ }
+ }
+ else
+ {
+ if(ms_stereo)
+ {
+ tab1 = iemmp3_tan1_2; tab2 = iemmp3_tan2_2;
+ }
+ else
+ {
+ tab1 = iemmp3_tan1_1; tab2 = iemmp3_tan2_1;
+ }
+ }
+
+ if (gr_info->block_type == 2)
+ {
+ int lwin,do_l = 0;
+ if( gr_info->mixed_block_flag )
+ do_l = 1;
+
+ for (lwin=0;lwin<3;lwin++) /* process each window */
+ {
+ /* get first band with zero values */
+ int is_p,sb,idx,sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */
+ if(sfb > 3)
+ do_l = 0;
+
+ for(;sfb<12;sfb++)
+ {
+ is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
+ if(is_p != 7) {
+ real t1,t2;
+ sb = bi->shortDiff[sfb];
+ idx = bi->shortIdx[sfb] + lwin;
+ t1 = tab1[is_p]; t2 = tab2[is_p];
+ for (; sb > 0; sb--,idx+=3)
+ {
+ real v = xr[0][idx];
+ xr[0][idx] = v * t1;
+ xr[1][idx] = v * t2;
+ }
+ }
+ }
+
+#if 1
+ /* in the original: copy 10 to 11 , here: copy 11 to 12
+ maybe still wrong??? (copy 12 to 13?) */
+ is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
+ sb = bi->shortDiff[12];
+ idx = bi->shortIdx[12] + lwin;
+#else
+ is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
+ sb = bi->shortDiff[11];
+ idx = bi->shortIdx[11] + lwin;
+#endif
+ if(is_p != 7)
+ {
+ real t1,t2;
+ t1 = tab1[is_p]; t2 = tab2[is_p];
+ for ( ; sb > 0; sb--,idx+=3 )
+ {
+ real v = xr[0][idx];
+ xr[0][idx] = v * t1;
+ xr[1][idx] = v * t2;
+ }
+ }
+ } /* end for(lwin; .. ; . ) */
+
+ if (do_l)
+ {
+ /* also check l-part, if ALL bands in the three windows are 'empty'
+ * and mode = mixed_mode
+ */
+ int sfb = gr_info->maxbandl;
+ int idx = bi->longIdx[sfb];
+
+ for ( ; sfb<8; sfb++ )
+ {
+ int sb = bi->longDiff[sfb];
+ int is_p = scalefac[sfb]; /* scale: 0-15 */
+ if(is_p != 7) {
+ real t1,t2;
+ t1 = tab1[is_p]; t2 = tab2[is_p];
+ for ( ; sb > 0; sb--,idx++)
+ {
+ real v = xr[0][idx];
+ xr[0][idx] = v * t1;
+ xr[1][idx] = v * t2;
+ }
+ }
+ else
+ idx += sb;
+ }
+ }
+ }
+ else /* ((gr_info->block_type != 2)) */
+ {
+ int sfb = gr_info->maxbandl;
+ int is_p,idx = bi->longIdx[sfb];
+ for ( ; sfb<21; sfb++)
+ {
+ int sb = bi->longDiff[sfb];
+ is_p = scalefac[sfb]; /* scale: 0-15 */
+ if(is_p != 7) {
+ real t1,t2;
+ t1 = tab1[is_p]; t2 = tab2[is_p];
+ for ( ; sb > 0; sb--,idx++)
+ {
+ real v = xr[0][idx];
+ xr[0][idx] = v * t1;
+ xr[1][idx] = v * t2;
+ }
+ }
+ else
+ idx += sb;
+ }
+
+ is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */
+ if(is_p != 7)
+ {
+ int sb;
+ real t1 = tab1[is_p],t2 = tab2[is_p];
+
+ for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ )
+ {
+ real v = xr[0][idx];
+ xr[0][idx] = v * t1;
+ xr[1][idx] = v * t2;
+ }
+ }
+ } /* ... */
+}
+
+
+static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct iemmp3_gr_info_s *gr_info)
+{
+ int sblim;
+
+ if(gr_info->block_type == 2)
+ {
+ if(!gr_info->mixed_block_flag)
+ return;
+ sblim = 1;
+ }
+ else {
+ sblim = gr_info->maxb-1;
+ }
+
+ /* 31 alias-reduction operations between each pair of sub-bands */
+ /* with 8 butterflies between each pair */
+
+ {
+ int sb;
+ real *xr1=(real *) xr[1];
+
+ for(sb=sblim;sb;sb--,xr1+=10)
+ {
+ int ss;
+ real *cs=iemmp3_aa_cs,*ca=iemmp3_aa_ca;
+ real *xr2 = xr1;
+
+ for(ss=7;ss>=0;ss--)
+ { /* upper and lower butterfly inputs */
+ register real bu = *--xr2,bd = *xr1;
+ *xr2 = (bu * (*cs) ) - (bd * (*ca) );
+ *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) );
+ }
+ }
+ }
+}
+
+static void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],
+ int ch,struct iemmp3_gr_info_s *gr_info)
+{
+ real *tspnt = (real *) tsOut;
+ real (*block)[2][SBLIMIT*SSLIMIT] = iemmp3_gmp->hybrid_block;
+ int *blc = iemmp3_gmp->hybrid_blc;
+ real *rawout1,*rawout2;
+ int bt;
+ unsigned int sb = 0;
+
+ {
+ int b = blc[ch];
+ rawout1=block[b][ch];
+ b=-b+1;
+ rawout2=block[b][ch];
+ blc[ch] = b;
+ }
+
+
+ if(gr_info->mixed_block_flag) {
+ sb = 2;
+ dct36(fsIn[0],rawout1,rawout2,iemmp3_win[0],tspnt);
+ dct36(fsIn[1],rawout1+18,rawout2+18,iemmp3_win1[0],tspnt+1);
+ rawout1 += 36; rawout2 += 36; tspnt += 2;
+ }
+
+ bt = gr_info->block_type;
+ if(bt == 2) {
+ for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
+ dct12(fsIn[sb],rawout1,rawout2,iemmp3_win[2],tspnt);
+ dct12(fsIn[sb+1],rawout1+18,rawout2+18,iemmp3_win1[2],tspnt+1);
+ }
+ }
+ else {
+ for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
+ dct36(fsIn[sb],rawout1,rawout2,iemmp3_win[bt],tspnt);
+ dct36(fsIn[sb+1],rawout1+18,rawout2+18,iemmp3_win1[bt],tspnt+1);
+ }
+ }
+
+ for(;sb<SBLIMIT;sb++,tspnt++) {
+ int i;
+ for(i=0;i<SSLIMIT;i++) {
+ tspnt[i*SBLIMIT] = *rawout1++;
+ *rawout2++ = 0.0;
+ }
+ }
+}
+
+static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples)
+{
+
+ {
+ register real *costab = iemmp3_pnts[0];
+
+ b1[0x00] = samples[0x00] + samples[0x1F];
+ b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0];
+
+ b1[0x01] = samples[0x01] + samples[0x1E];
+ b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1];
+
+ b1[0x02] = samples[0x02] + samples[0x1D];
+ b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2];
+
+ b1[0x03] = samples[0x03] + samples[0x1C];
+ b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3];
+
+ b1[0x04] = samples[0x04] + samples[0x1B];
+ b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4];
+
+ b1[0x05] = samples[0x05] + samples[0x1A];
+ b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5];
+
+ b1[0x06] = samples[0x06] + samples[0x19];
+ b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6];
+
+ b1[0x07] = samples[0x07] + samples[0x18];
+ b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7];
+
+ b1[0x08] = samples[0x08] + samples[0x17];
+ b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8];
+
+ b1[0x09] = samples[0x09] + samples[0x16];
+ b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9];
+
+ b1[0x0A] = samples[0x0A] + samples[0x15];
+ b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA];
+
+ b1[0x0B] = samples[0x0B] + samples[0x14];
+ b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB];
+
+ b1[0x0C] = samples[0x0C] + samples[0x13];
+ b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC];
+
+ b1[0x0D] = samples[0x0D] + samples[0x12];
+ b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD];
+
+ b1[0x0E] = samples[0x0E] + samples[0x11];
+ b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE];
+
+ b1[0x0F] = samples[0x0F] + samples[0x10];
+ b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF];
+ }
+
+
+ {
+ register real *costab = iemmp3_pnts[1];
+
+ b2[0x00] = b1[0x00] + b1[0x0F];
+ b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0];
+ b2[0x01] = b1[0x01] + b1[0x0E];
+ b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1];
+ b2[0x02] = b1[0x02] + b1[0x0D];
+ b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2];
+ b2[0x03] = b1[0x03] + b1[0x0C];
+ b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3];
+ b2[0x04] = b1[0x04] + b1[0x0B];
+ b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4];
+ b2[0x05] = b1[0x05] + b1[0x0A];
+ b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5];
+ b2[0x06] = b1[0x06] + b1[0x09];
+ b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6];
+ b2[0x07] = b1[0x07] + b1[0x08];
+ b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7];
+
+ b2[0x10] = b1[0x10] + b1[0x1F];
+ b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0];
+ b2[0x11] = b1[0x11] + b1[0x1E];
+ b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1];
+ b2[0x12] = b1[0x12] + b1[0x1D];
+ b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2];
+ b2[0x13] = b1[0x13] + b1[0x1C];
+ b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3];
+ b2[0x14] = b1[0x14] + b1[0x1B];
+ b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4];
+ b2[0x15] = b1[0x15] + b1[0x1A];
+ b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5];
+ b2[0x16] = b1[0x16] + b1[0x19];
+ b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6];
+ b2[0x17] = b1[0x17] + b1[0x18];
+ b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7];
+ }
+
+ {
+ register real *costab = iemmp3_pnts[2];
+
+ b1[0x00] = b2[0x00] + b2[0x07];
+ b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0];
+ b1[0x01] = b2[0x01] + b2[0x06];
+ b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1];
+ b1[0x02] = b2[0x02] + b2[0x05];
+ b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2];
+ b1[0x03] = b2[0x03] + b2[0x04];
+ b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3];
+
+ b1[0x08] = b2[0x08] + b2[0x0F];
+ b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0];
+ b1[0x09] = b2[0x09] + b2[0x0E];
+ b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1];
+ b1[0x0A] = b2[0x0A] + b2[0x0D];
+ b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2];
+ b1[0x0B] = b2[0x0B] + b2[0x0C];
+ b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3];
+
+ b1[0x10] = b2[0x10] + b2[0x17];
+ b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0];
+ b1[0x11] = b2[0x11] + b2[0x16];
+ b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1];
+ b1[0x12] = b2[0x12] + b2[0x15];
+ b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2];
+ b1[0x13] = b2[0x13] + b2[0x14];
+ b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3];
+
+ b1[0x18] = b2[0x18] + b2[0x1F];
+ b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0];
+ b1[0x19] = b2[0x19] + b2[0x1E];
+ b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1];
+ b1[0x1A] = b2[0x1A] + b2[0x1D];
+ b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2];
+ b1[0x1B] = b2[0x1B] + b2[0x1C];
+ b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3];
+ }
+
+ {
+ register real const cos0 = iemmp3_pnts[3][0];
+ register real const cos1 = iemmp3_pnts[3][1];
+
+ b2[0x00] = b1[0x00] + b1[0x03];
+ b2[0x03] = (b1[0x00] - b1[0x03]) * cos0;
+ b2[0x01] = b1[0x01] + b1[0x02];
+ b2[0x02] = (b1[0x01] - b1[0x02]) * cos1;
+
+ b2[0x04] = b1[0x04] + b1[0x07];
+ b2[0x07] = (b1[0x07] - b1[0x04]) * cos0;
+ b2[0x05] = b1[0x05] + b1[0x06];
+ b2[0x06] = (b1[0x06] - b1[0x05]) * cos1;
+
+ b2[0x08] = b1[0x08] + b1[0x0B];
+ b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0;
+ b2[0x09] = b1[0x09] + b1[0x0A];
+ b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1;
+
+ b2[0x0C] = b1[0x0C] + b1[0x0F];
+ b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0;
+ b2[0x0D] = b1[0x0D] + b1[0x0E];
+ b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1;
+
+ b2[0x10] = b1[0x10] + b1[0x13];
+ b2[0x13] = (b1[0x10] - b1[0x13]) * cos0;
+ b2[0x11] = b1[0x11] + b1[0x12];
+ b2[0x12] = (b1[0x11] - b1[0x12]) * cos1;
+
+ b2[0x14] = b1[0x14] + b1[0x17];
+ b2[0x17] = (b1[0x17] - b1[0x14]) * cos0;
+ b2[0x15] = b1[0x15] + b1[0x16];
+ b2[0x16] = (b1[0x16] - b1[0x15]) * cos1;
+
+ b2[0x18] = b1[0x18] + b1[0x1B];
+ b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0;
+ b2[0x19] = b1[0x19] + b1[0x1A];
+ b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1;
+
+ b2[0x1C] = b1[0x1C] + b1[0x1F];
+ b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0;
+ b2[0x1D] = b1[0x1D] + b1[0x1E];
+ b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1;
+ }
+
+ {
+ register real const cos0 = iemmp3_pnts[4][0];
+
+ b1[0x00] = b2[0x00] + b2[0x01];
+ b1[0x01] = (b2[0x00] - b2[0x01]) * cos0;
+ b1[0x02] = b2[0x02] + b2[0x03];
+ b1[0x03] = (b2[0x03] - b2[0x02]) * cos0;
+ b1[0x02] += b1[0x03];
+
+ b1[0x04] = b2[0x04] + b2[0x05];
+ b1[0x05] = (b2[0x04] - b2[0x05]) * cos0;
+ b1[0x06] = b2[0x06] + b2[0x07];
+ b1[0x07] = (b2[0x07] - b2[0x06]) * cos0;
+ b1[0x06] += b1[0x07];
+ b1[0x04] += b1[0x06];
+ b1[0x06] += b1[0x05];
+ b1[0x05] += b1[0x07];
+
+ b1[0x08] = b2[0x08] + b2[0x09];
+ b1[0x09] = (b2[0x08] - b2[0x09]) * cos0;
+ b1[0x0A] = b2[0x0A] + b2[0x0B];
+ b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0;
+ b1[0x0A] += b1[0x0B];
+
+ b1[0x0C] = b2[0x0C] + b2[0x0D];
+ b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0;
+ b1[0x0E] = b2[0x0E] + b2[0x0F];
+ b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0;
+ b1[0x0E] += b1[0x0F];
+ b1[0x0C] += b1[0x0E];
+ b1[0x0E] += b1[0x0D];
+ b1[0x0D] += b1[0x0F];
+
+ b1[0x10] = b2[0x10] + b2[0x11];
+ b1[0x11] = (b2[0x10] - b2[0x11]) * cos0;
+ b1[0x12] = b2[0x12] + b2[0x13];
+ b1[0x13] = (b2[0x13] - b2[0x12]) * cos0;
+ b1[0x12] += b1[0x13];
+
+ b1[0x14] = b2[0x14] + b2[0x15];
+ b1[0x15] = (b2[0x14] - b2[0x15]) * cos0;
+ b1[0x16] = b2[0x16] + b2[0x17];
+ b1[0x17] = (b2[0x17] - b2[0x16]) * cos0;
+ b1[0x16] += b1[0x17];
+ b1[0x14] += b1[0x16];
+ b1[0x16] += b1[0x15];
+ b1[0x15] += b1[0x17];
+
+ b1[0x18] = b2[0x18] + b2[0x19];
+ b1[0x19] = (b2[0x18] - b2[0x19]) * cos0;
+ b1[0x1A] = b2[0x1A] + b2[0x1B];
+ b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0;
+ b1[0x1A] += b1[0x1B];
+
+ b1[0x1C] = b2[0x1C] + b2[0x1D];
+ b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0;
+ b1[0x1E] = b2[0x1E] + b2[0x1F];
+ b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0;
+ b1[0x1E] += b1[0x1F];
+ b1[0x1C] += b1[0x1E];
+ b1[0x1E] += b1[0x1D];
+ b1[0x1D] += b1[0x1F];
+ }
+
+ out0[0x10*16] = b1[0x00];
+ out0[0x10*12] = b1[0x04];
+ out0[0x10* 8] = b1[0x02];
+ out0[0x10* 4] = b1[0x06];
+ out0[0x10* 0] = b1[0x01];
+ out1[0x10* 0] = b1[0x01];
+ out1[0x10* 4] = b1[0x05];
+ out1[0x10* 8] = b1[0x03];
+ out1[0x10*12] = b1[0x07];
+
+ b1[0x08] += b1[0x0C];
+ out0[0x10*14] = b1[0x08];
+ b1[0x0C] += b1[0x0a];
+ out0[0x10*10] = b1[0x0C];
+ b1[0x0A] += b1[0x0E];
+ out0[0x10* 6] = b1[0x0A];
+ b1[0x0E] += b1[0x09];
+ out0[0x10* 2] = b1[0x0E];
+ b1[0x09] += b1[0x0D];
+ out1[0x10* 2] = b1[0x09];
+ b1[0x0D] += b1[0x0B];
+ out1[0x10* 6] = b1[0x0D];
+ b1[0x0B] += b1[0x0F];
+ out1[0x10*10] = b1[0x0B];
+ out1[0x10*14] = b1[0x0F];
+
+ b1[0x18] += b1[0x1C];
+ out0[0x10*15] = b1[0x10] + b1[0x18];
+ out0[0x10*13] = b1[0x18] + b1[0x14];
+ b1[0x1C] += b1[0x1a];
+ out0[0x10*11] = b1[0x14] + b1[0x1C];
+ out0[0x10* 9] = b1[0x1C] + b1[0x12];
+ b1[0x1A] += b1[0x1E];
+ out0[0x10* 7] = b1[0x12] + b1[0x1A];
+ out0[0x10* 5] = b1[0x1A] + b1[0x16];
+ b1[0x1E] += b1[0x19];
+ out0[0x10* 3] = b1[0x16] + b1[0x1E];
+ out0[0x10* 1] = b1[0x1E] + b1[0x11];
+ b1[0x19] += b1[0x1D];
+ out1[0x10* 1] = b1[0x11] + b1[0x19];
+ out1[0x10* 3] = b1[0x19] + b1[0x15];
+ b1[0x1D] += b1[0x1B];
+ out1[0x10* 5] = b1[0x15] + b1[0x1D];
+ out1[0x10* 7] = b1[0x1D] + b1[0x13];
+ b1[0x1B] += b1[0x1F];
+ out1[0x10* 9] = b1[0x13] + b1[0x1B];
+ out1[0x10*11] = b1[0x1B] + b1[0x17];
+ out1[0x10*13] = b1[0x17] + b1[0x1F];
+ out1[0x10*15] = b1[0x1F];
+}
+
+/*
+ * the call via dct64 is a trick to force GCC to use
+ * (new) registers for the b1,b2 pointer to the bufs[xx] field
+ */
+void dct64(real *a,real *b,real *c)
+{
+ real bufs[0x40];
+ dct64_1(a,b,bufs,bufs+0x20,c);
+}
+
+static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
+{
+ {
+ register real *in = inbuf;
+
+ in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14];
+ in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11];
+ in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8];
+ in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5];
+ in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2];
+ in[2] +=in[1]; in[1] +=in[0];
+
+ in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
+ in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1];
+
+
+ {
+
+#define MACRO0(v) { \
+ real tmp; \
+ out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \
+ out2[8-(v)] = tmp * w[26-(v)]; } \
+ sum0 -= sum1; \
+ ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \
+ ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)];
+#define MACRO1(v) { \
+ real sum0,sum1; \
+ sum0 = tmp1a + tmp2a; \
+ sum1 = (tmp1b + tmp2b) * iemmp3_tfcos36[(v)]; \
+ MACRO0(v); }
+#define MACRO2(v) { \
+ real sum0,sum1; \
+ sum0 = tmp2a - tmp1a; \
+ sum1 = (tmp2b - tmp1b) * iemmp3_tfcos36[(v)]; \
+ MACRO0(v); }
+
+ register const real *c = iemmp3_COS9;
+ register real *out2 = o2;
+ register real *w = wintab;
+ register real *out1 = o1;
+ register real *ts = tsbuf;
+
+ real ta33,ta66,tb33,tb66;
+
+ ta33 = in[2*3+0] * c[3];
+ ta66 = in[2*6+0] * c[6];
+ tb33 = in[2*3+1] * c[3];
+ tb66 = in[2*6+1] * c[6];
+
+ {
+ real tmp1a,tmp2a,tmp1b,tmp2b;
+ tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7];
+ tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7];
+ tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8];
+ tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8];
+
+ MACRO1(0);
+ MACRO2(8);
+ }
+
+ {
+ real tmp1a,tmp2a,tmp1b,tmp2b;
+ tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3];
+ tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3];
+ tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0];
+ tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1];
+
+ MACRO1(1);
+ MACRO2(7);
+ }
+
+ {
+ real tmp1a,tmp2a,tmp1b,tmp2b;
+ tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1];
+ tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1];
+ tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4];
+ tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4];
+
+ MACRO1(2);
+ MACRO2(6);
+ }
+
+ {
+ real tmp1a,tmp2a,tmp1b,tmp2b;
+ tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5];
+ tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5];
+ tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2];
+ tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2];
+
+ MACRO1(3);
+ MACRO2(5);
+ }
+
+ {
+ real sum0,sum1;
+ sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0];
+ sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * iemmp3_tfcos36[4];
+ MACRO0(4);
+ }
+ }
+
+ }
+}
+
+/*
+ * new DCT12
+ */
+static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts)
+{
+#define DCT12_PART1 \
+ in5 = in[5*3]; \
+ in5 += (in4 = in[4*3]); \
+ in4 += (in3 = in[3*3]); \
+ in3 += (in2 = in[2*3]); \
+ in2 += (in1 = in[1*3]); \
+ in1 += (in0 = in[0*3]); \
+ \
+ in5 += in3; in3 += in1; \
+ \
+ in2 *= iemmp3_COS6_1; \
+ in3 *= iemmp3_COS6_1; \
+
+#define DCT12_PART2 \
+ in0 += in4 * iemmp3_COS6_2; \
+ \
+ in4 = in0 + in2; \
+ in0 -= in2; \
+ \
+ in1 += in5 * iemmp3_COS6_2; \
+ \
+ in5 = (in1 + in3) * iemmp3_tfcos12[0]; \
+ in1 = (in1 - in3) * iemmp3_tfcos12[2]; \
+ \
+ in3 = in4 + in5; \
+ in4 -= in5; \
+ \
+ in2 = in0 + in1; \
+ in0 -= in1;
+
+
+ {
+ real in0,in1,in2,in3,in4,in5;
+ register real *out1 = rawout1;
+ ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2];
+ ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5];
+
+ DCT12_PART1
+
+ {
+ real tmp0,tmp1 = (in0 - in4);
+ {
+ real tmp2 = (in1 - in5) * iemmp3_tfcos12[1];
+ tmp0 = tmp1 + tmp2;
+ tmp1 -= tmp2;
+ }
+ ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1];
+ ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1];
+ ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1];
+ ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1];
+ }
+
+ DCT12_PART2
+
+ ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0];
+ ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0];
+ ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2];
+ ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2];
+
+ ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0];
+ ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0];
+ ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2];
+ ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2];
+ }
+
+ in++;
+
+ {
+ real in0,in1,in2,in3,in4,in5;
+ register real *out2 = rawout2;
+
+ DCT12_PART1
+
+ {
+ real tmp0,tmp1 = (in0 - in4);
+ {
+ real tmp2 = (in1 - in5) * iemmp3_tfcos12[1];
+ tmp0 = tmp1 + tmp2;
+ tmp1 -= tmp2;
+ }
+ out2[5-1] = tmp0 * wi[11-1];
+ out2[0+1] = tmp0 * wi[6+1];
+ ts[(12+1)*SBLIMIT] += tmp1 * wi[1];
+ ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1];
+ }
+
+ DCT12_PART2
+
+ out2[5-0] = in2 * wi[11-0];
+ out2[0+0] = in2 * wi[6+0];
+ out2[0+2] = in3 * wi[6+2];
+ out2[5-2] = in3 * wi[11-2];
+
+ ts[(12+0)*SBLIMIT] += in0 * wi[0];
+ ts[(17-0)*SBLIMIT] += in0 * wi[5-0];
+ ts[(12+2)*SBLIMIT] += in4 * wi[2];
+ ts[(17-2)*SBLIMIT] += in4 * wi[5-2];
+ }
+
+ in++;
+
+ {
+ real in0,in1,in2,in3,in4,in5;
+ register real *out2 = rawout2;
+ out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0;
+
+ DCT12_PART1
+
+ {
+ real tmp0,tmp1 = (in0 - in4);
+ {
+ real tmp2 = (in1 - in5) * iemmp3_tfcos12[1];
+ tmp0 = tmp1 + tmp2;
+ tmp1 -= tmp2;
+ }
+ out2[11-1] = tmp0 * wi[11-1];
+ out2[6 +1] = tmp0 * wi[6+1];
+ out2[0+1] += tmp1 * wi[1];
+ out2[5-1] += tmp1 * wi[5-1];
+ }
+
+ DCT12_PART2
+
+ out2[11-0] = in2 * wi[11-0];
+ out2[6 +0] = in2 * wi[6+0];
+ out2[6 +2] = in3 * wi[6+2];
+ out2[11-2] = in3 * wi[11-2];
+
+ out2[0+0] += in0 * wi[0];
+ out2[5-0] += in0 * wi[5-0];
+ out2[0+2] += in4 * wi[2];
+ out2[5-2] += in4 * wi[5-2];
+ }
+}
+
+static int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
+{
+ short samples_tmp[64];
+ short *tmp1 = samples_tmp;
+ int i,ret;
+ int pnt1 = 0;
+
+ ret = synth_1to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
+ samples += *pnt;
+
+ for(i=0;i<32;i++)
+ {
+ *( (short *) samples) = *tmp1;
+ samples += 2;
+ tmp1 += 2;
+ }
+ *pnt += 64;
+
+ return ret;
+}
+
+
+static int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
+{
+ static const int step = 2;
+ int bo;
+ short *samples = (short *) (out + *pnt);
+
+ real *b0,(*buf)[0x110];
+ int clip = 0;
+ int bo1;
+
+ bo = iemmp3_gmp->synth_bo;
+
+ if(!channel)
+ {
+ bo--;
+ bo &= 0xf;
+ buf = iemmp3_gmp->synth_buffs[0];
+ }
+ else
+ {
+ samples++;
+ buf = iemmp3_gmp->synth_buffs[1];
+ }
+
+ if(bo & 0x1)
+ {
+ b0 = buf[0];
+ bo1 = bo;
+ dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
+ }
+ else
+ {
+ b0 = buf[1];
+ bo1 = bo+1;
+ dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
+ }
+
+ iemmp3_gmp->synth_bo = bo;
+
+ {
+ register int j;
+ real *window = iemmp3_decwin + 16 - bo1;
+
+ for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step)
+ {
+ real sum;
+ sum = window[0x0] * b0[0x0];
+ sum -= window[0x1] * b0[0x1];
+ sum += window[0x2] * b0[0x2];
+ sum -= window[0x3] * b0[0x3];
+ sum += window[0x4] * b0[0x4];
+ sum -= window[0x5] * b0[0x5];
+ sum += window[0x6] * b0[0x6];
+ sum -= window[0x7] * b0[0x7];
+ sum += window[0x8] * b0[0x8];
+ sum -= window[0x9] * b0[0x9];
+ sum += window[0xA] * b0[0xA];
+ sum -= window[0xB] * b0[0xB];
+ sum += window[0xC] * b0[0xC];
+ sum -= window[0xD] * b0[0xD];
+ sum += window[0xE] * b0[0xE];
+ sum -= window[0xF] * b0[0xF];
+ WRITE_SAMPLE(samples,sum,clip);
+ }
+
+ {
+ real sum;
+ sum = window[0x0] * b0[0x0];
+ sum += window[0x2] * b0[0x2];
+ sum += window[0x4] * b0[0x4];
+ sum += window[0x6] * b0[0x6];
+ sum += window[0x8] * b0[0x8];
+ sum += window[0xA] * b0[0xA];
+ sum += window[0xC] * b0[0xC];
+ sum += window[0xE] * b0[0xE];
+ WRITE_SAMPLE(samples,sum,clip);
+ b0-=0x10,window-=0x20,samples+=step;
+ }
+ window += bo1<<1;
+
+ for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step)
+ {
+ real sum;
+ sum = -window[-0x1] * b0[0x0];
+ sum -= window[-0x2] * b0[0x1];
+ sum -= window[-0x3] * b0[0x2];
+ sum -= window[-0x4] * b0[0x3];
+ sum -= window[-0x5] * b0[0x4];
+ sum -= window[-0x6] * b0[0x5];
+ sum -= window[-0x7] * b0[0x6];
+ sum -= window[-0x8] * b0[0x7];
+ sum -= window[-0x9] * b0[0x8];
+ sum -= window[-0xA] * b0[0x9];
+ sum -= window[-0xB] * b0[0xA];
+ sum -= window[-0xC] * b0[0xB];
+ sum -= window[-0xD] * b0[0xC];
+ sum -= window[-0xE] * b0[0xD];
+ sum -= window[-0xF] * b0[0xE];
+ sum -= window[-0x0] * b0[0xF];
+ WRITE_SAMPLE(samples,sum,clip);
+ }
+ }
+ *pnt += 128;
+
+ return clip;
+}
+
+
+
+static void *sigmp3play_new(void)
+{
+ char *vec;
+ t_sigmp3play *x = (t_sigmp3play *)pd_new(sigmp3play_class);
+
+ x->file_is_open = 0;
+ x->play_state = 0;
+ x->mp3_encode_size = 0;
+ x->mp3_out_index = 0;
+ x->file_block_num = 0;
+ x->file_remain = 0;
+ x->file_size = 0;
+ x->mp3_ch = 1;
+ x->mp3_sr = 44100;
+ x->obj_sr = 44100;
+ x->obj_n = 1;
+ x->samp_per_frame = 1152;
+ x->mp3_byterate = 11;
+ x->down = 0;
+ x->scale = 1.0/32768.0;
+ x->offset_sec = 0.0;
+ x->fh = (FILE *)0L;
+ x->mp3inbuf = (char *)getzbytes(MY_MP3_MALLOC_IN_SIZE);
+ x->mp3outbuf = (char *)getzbytes(MY_MP3_MALLOC_OUT_SIZE);
+ x->filename = (char *)getzbytes(MY_MP3_MALLOC_FN);
+ x->begframeseek = (int *)0;
+ x->curframeseek = 0;
+ x->maxframeseek = 0;
+ x->frame_counter = 0;
+ x->time1_bang0_handle = 0;
+ x->time_factor = 0.0;
+ vec = x->filename;
+ *vec = 0;
+ InitMP3(&(x->mp));
+ x->mp_is_init = 1;
+ x->x_clock = clock_new(x, (t_method)sigmp3play_tick);
+ outlet_new(&x->x_obj, &s_signal);
+ outlet_new(&x->x_obj, &s_signal);
+ x->x_floatout = outlet_new(&x->x_obj, &s_float);
+ x->x_bangout = outlet_new(&x->x_obj, &s_bang);
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
+ x->x_canvas = canvas_getcurrent();
+ return (x);
+}
+
+static void sigmp3play_cleanup(t_sigmp3play *x)
+{
+ x->file_is_open = 0;
+ fclose(x->fh);
+ x->play_state = 0;
+ x->mp3_out_index = 0;
+ x->mp_is_init = 0;
+ ExitMP3(&(x->mp));
+ x->time1_bang0_handle = 0;
+ clock_delay(x->x_clock, 0);
+}
+
+static int sigmp3play_read_frame_length_first(t_sigmp3play *x, int *frsz)
+{
+ int framesize, lsf, bitrate_index, sampling_frequency, padding, mpeg25, lay, ret=MP3_EX;
+ int version, syncword;
+ unsigned long head;
+ unsigned char chead;
+
+ *frsz = 0;
+ if((x->file_size) >= 4)
+ {
+ fread(&chead, 1, sizeof(char), x->fh);
+ head = (unsigned int)chead;
+ fread(&chead, 1, sizeof(char), x->fh);
+ head <<= 8;
+ head |= (unsigned int)chead;
+ fread(&chead, 1, sizeof(char), x->fh);
+ head <<= 8;
+ head |= (unsigned int)chead;
+ fread(&chead, 1, sizeof(char), x->fh);
+ head <<= 8;
+ head |= (unsigned int)chead;
+ syncword = (head >> 20) & 0x0fff;
+ version = ((head >> 19) & 0x01) ? 0 : 1;
+ if((syncword & 0x01) == 0)
+ version = 2;
+ if(version == 0)
+ x->samp_per_frame = 1152;
+ else
+ x->samp_per_frame = 576;
+
+ if(head & (1<<20))
+ {
+ lsf = (head & (1<<19)) ? 0x0 : 0x1;
+ mpeg25 = 0;
+ }
+ else
+ {
+ lsf = 1;
+ mpeg25 = 1;
+ }
+ lay = 4-((head>>17)&3);
+ if(((head>>10)&0x3) == 0x3)
+ {
+ post("Stream error");
+ return(MP3_EX);
+ }
+ if(mpeg25)
+ sampling_frequency = 6 + ((head>>10)&0x3);
+ else
+ sampling_frequency = ((head>>10)&0x3) + (lsf*3);
+ x->mp3_sr = (int)iemmp3_freqs[sampling_frequency];
+ if(mpeg25)
+ bitrate_index = ((head>>12)&0xf);
+ bitrate_index = ((head>>12)&0xf);
+ padding = ((head>>9)&0x1);
+ if(!bitrate_index)
+ {
+ post("Free format not supported.\n");
+ return(MP3_EX);
+ }
+ switch(lay)
+ {
+ case 1:
+ post("Layer I not supported!\n");
+ break;
+ case 2:
+ post("Layer II not supported!\n");
+ break;
+ case 3:
+ framesize = iemmp3_tabsel_123[lsf][2][bitrate_index]*144000;
+ framesize /= (iemmp3_freqs[sampling_frequency] << lsf);
+ framesize += padding;
+ *frsz = framesize;
+ ret = 0;
+ break;
+ default:
+ post("Sorry, unknown layer type.\n");
+ break;
+ }
+ return(ret);
+ }
+ else
+ {
+ return(1);
+ }
+}
+
+static int sigmp3play_read_frame_length_next(t_sigmp3play *x, int *frsz, int frame_counter)
+{
+ int framesize, lsf, bitrate_index, sampling_frequency, *begframeseek=x->begframeseek;
+ unsigned long head;
+ unsigned char chead;
+
+ *frsz = 0;
+ if(begframeseek[frame_counter] < ((x->file_size) - 4))
+ {
+ fread(&chead, 1, sizeof(char), x->fh);
+ head = (unsigned int)chead;
+ fread(&chead, 1, sizeof(char), x->fh);
+ head <<= 8;
+ head |= (unsigned int)chead;
+ fread(&chead, 1, sizeof(char), x->fh);
+ head <<= 8;
+ head |= (unsigned int)chead;
+ fread(&chead, 1, sizeof(char), x->fh);
+ head <<= 8;
+ head |= (unsigned int)chead;
+ if(head & (1<<20))
+ {
+ lsf = (head & (1<<19)) ? 0x0 : 0x1;
+ sampling_frequency = ((head>>10)&0x3) + (lsf*3);
+ }
+ else
+ {
+ lsf = 1;
+ sampling_frequency = 6 + ((head>>10)&0x3);
+ }
+ bitrate_index = ((head>>12)&0xf);
+ framesize = iemmp3_tabsel_123[lsf][2][bitrate_index]*144000;
+ framesize /= (iemmp3_freqs[sampling_frequency] << lsf);
+ framesize += ((head>>9)&0x1);
+ *frsz = framesize;
+ return(0);
+ }
+ else
+ return(1);
+}
+
+static int sigmp3play_calc_frames(t_sigmp3play *x)
+{
+ int *begframeseek=x->begframeseek, i, maxframeseek, framesize, frame_counter;
+ float length;
+
+ fseek(x->fh,0,SEEK_SET);
+ if(!sigmp3play_read_frame_length_first(x, &framesize))
+ {
+ if(framesize <= 0)
+ {
+ return(MP3_EX);
+ }
+ i = framesize - 6;
+ maxframeseek = (x->file_size) / i;
+ if(!begframeseek)
+ {
+ x->begframeseek = (int *)getzbytes((maxframeseek)*sizeof(int));
+ x->maxframeseek = maxframeseek;
+ }
+ else
+ {
+ if(maxframeseek > (x->maxframeseek))
+ {
+ freebytes(x->begframeseek, (x->maxframeseek)*sizeof(int));
+ x->begframeseek = (int *)getzbytes((maxframeseek)*sizeof(int));
+ x->maxframeseek = maxframeseek;
+ }
+ }
+ begframeseek = x->begframeseek;
+ begframeseek[0] = 0;
+ begframeseek[1] = framesize;
+ frame_counter = 1;
+ /*x->curframeseek = maxframeseek;*/
+ fseek(x->fh, begframeseek[1], SEEK_SET);
+ while(!sigmp3play_read_frame_length_next(x, &framesize, frame_counter))
+ {
+ begframeseek[frame_counter+1] = begframeseek[frame_counter] + framesize;
+ frame_counter++;
+ fseek(x->fh, begframeseek[frame_counter], SEEK_SET);
+ };
+ frame_counter--;
+ length = (float)(frame_counter)*(float)(x->samp_per_frame) / (float)(x->mp3_sr);
+ x->length_sec = length;
+ x->time_factor = length / (float)(frame_counter);
+ x->curframeseek = frame_counter;
+ fseek(x->fh,0,SEEK_SET);
+ return(MP3_OK);
+ }
+ else
+ return(MP3_EX);
+}
+
+static void sigmp3play_do_open(t_sigmp3play *x, char *str, int calc_it)
+{
+ int mp3_sr, obj_sr;
+ int file_size, size, mp3_encode_return=MP3_OK, mp3_read_length, i, j, *begframeseek;
+ static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
+ static char *layers[4] = { "Unknown" , "I", "II", "III" };
+ char completefilename[400];
+
+ if(x->file_is_open)
+ {
+ post("mp3play-ERROR: file is already open, please stop it first!");
+ }
+ else if(*str == 0)
+ {
+ post("mp3play-ERROR: there is no filename to open");
+ }
+ else
+ {
+ if(str[0] == '/')
+ {
+ strcpy(completefilename, str);
+ }
+ else if(((str[0] >= 'A')&&(str[0] <= 'Z')||
+ (str[0] >= 'a')&&(str[0] <= 'z'))&&
+ (str[1] == ':')&&(str[2] == '/'))
+ {
+ strcpy(completefilename, str);
+ }
+ else
+ {
+ strcpy(completefilename, canvas_getdir(x->x_canvas)->s_name);
+ strcat(completefilename, "/");
+ strcat(completefilename, str);
+ }
+
+ if((x->fh = fopen(completefilename, "rb")) == NULL)
+ {
+ post("mp3play-ERROR: cannot open %s", completefilename);
+ }
+ else
+ {
+ strcpy(x->filename, completefilename);
+ fseek(x->fh,0,SEEK_END);
+ file_size = (int)ftell(x->fh);
+ x->file_size = file_size;
+ if(!x->mp_is_init)
+ {
+ InitAgainMP3(&(x->mp));
+ x->mp_is_init = 1;
+ }
+ if(calc_it)
+ mp3_encode_return = sigmp3play_calc_frames(x);
+ if(mp3_encode_return == MP3_EX)
+ {
+ sigmp3play_cleanup(x);
+ return;
+ }
+ if(x->frame_counter)
+ x->frame_counter = (int)(x->offset_sec / x->time_factor);
+ i = x->frame_counter;
+ if(i > (x->curframeseek - 1))
+ i = x->curframeseek - 1;
+ begframeseek = x->begframeseek;
+ j = begframeseek[i];
+ fseek(x->fh,j,SEEK_SET);
+ x->file_block_num = (file_size-j) / MY_MP3_MALLOC_IN_SIZE;
+ x->file_remain = (file_size-j) - (x->file_block_num)*MY_MP3_MALLOC_IN_SIZE;
+ if(x->file_block_num)
+ {
+ mp3_read_length = MY_MP3_MALLOC_IN_SIZE;
+ x->file_block_num--;
+ }
+ else
+ {
+ mp3_read_length = x->file_remain;
+ x->file_remain = 0;
+ }
+ if(mp3_read_length > 0)
+ {
+ fread(x->mp3inbuf, mp3_read_length, sizeof(char), x->fh);
+ mp3_encode_return = decodeMP3(&(x->mp), x->mp3inbuf, mp3_read_length, x->mp3outbuf,
+ MY_MP3_MALLOC_IN_SIZE2, &size);
+ if(mp3_encode_return == MP3_EX)
+ {
+ sigmp3play_cleanup(x);
+ return;
+ }
+ post ("MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d",
+ x->mp.fr.mpeg25 ? "2.5" : (x->mp.fr.lsf ? "2.0" : "1.0"),
+ layers[x->mp.fr.lay],iemmp3_freqs[x->mp.fr.sampling_frequency],
+ modes[x->mp.fr.mode],x->mp.fr.mode_ext,x->mp.fr.framesize+4);
+ post ("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.",
+ x->mp.fr.stereo,x->mp.fr.copyright?"Yes":"No",
+ x->mp.fr.original?"Yes":"No",x->mp.fr.error_protection?"Yes":"No",
+ x->mp.fr.emphasis);
+ post ("Bitrate: %d Kbits/s, Extension value: %d",
+ iemmp3_tabsel_123[x->mp.fr.lsf][x->mp.fr.lay-1]
+ [x->mp.fr.bitrate_index],x->mp.fr.extension);
+ post ("Original Soundfile-Length : %.3f sec.\n",x->length_sec);
+
+ x->mp3_byterate = 128*iemmp3_tabsel_123[x->mp.fr.lsf][x->mp.fr.lay-1][x->mp.fr.bitrate_index];
+ /* 1024/8 */
+
+ if(x->mp.fr.stereo == 2)
+ x->mp3_ch = 2;
+ else if(x->mp.fr.stereo == 1)
+ x->mp3_ch = 1;
+ else
+ {
+ x->mp3_ch = 1;
+ post("mp3_play~ WARNING: unknown number of channels : %d channels",
+ x->mp.fr.stereo);
+ }
+ mp3_sr = (int)(iemmp3_freqs[x->mp.fr.sampling_frequency]);
+ obj_sr = x->obj_sr;
+ x->mp3_sr = mp3_sr;
+ if(mp3_sr == obj_sr)
+ {
+ x->down = 0;
+ }
+ else if(2*mp3_sr == obj_sr)
+ {
+ x->down = 1;
+ }
+ else if(4*mp3_sr == obj_sr)
+ {
+ x->down = 2;
+ }
+ else if(mp3_sr == 2*obj_sr)
+ {
+ x->down = -1;
+ }
+ else if(mp3_sr == 4*obj_sr)
+ {
+ x->down = -2;
+ }
+ else
+ {
+ post("mp3_play~ WARNING: playing the filesamplerate of %d Hz at %d Hz", mp3_sr,obj_sr);
+ x->down = 0;
+ }
+
+ if(mp3_encode_return == MP3_OK)
+ {
+ x->file_is_open = 1;
+ x->mp3_encode_size = size * sizeof(char) / sizeof(short);
+ }
+ else
+ {
+ x->file_is_open = 0;
+ x->mp3_out_index = 0;
+ fclose(x->fh);
+ }
+ }
+ else
+ {
+ x->file_is_open = 0;
+ fclose(x->fh);
+ }
+ }
+ x->play_state = 2;
+ x->mp3_out_index = 0;
+ }
+}
+
+static t_int *sigmp3play_perform(t_int *w)
+{
+ t_sigmp3play *x = (t_sigmp3play *)(w[1]);
+ t_float *out1 = (t_float *)(w[2]);
+ t_float *out2 = (t_float *)(w[3]);
+ int n = (int)(w[4]);
+ short *ivec = (short *)(x->mp3outbuf);
+ int size, mp3_encode_return, mp3_read_length, mp3_ch, down;
+ float scale = x->scale, outa, outb;
+ int mp3_out_index = x->mp3_out_index;
+
+ if (!x->file_is_open)
+ goto sigmp3play_labelzero;
+ if (x->play_state != 1)
+ goto sigmp3play_labelzero;
+
+ if(mp3_out_index >= x->mp3_encode_size)
+ {
+ x->frame_counter++;
+ x->time1_bang0_handle = 1;
+ clock_delay(x->x_clock, 0);
+ mp3_out_index = 0;
+ mp3_encode_return = decodeMP3(&(x->mp), NULL, 0, x->mp3outbuf,
+ MY_MP3_MALLOC_IN_SIZE2, &size);
+ if(mp3_encode_return == MP3_OK)
+ x->mp3_encode_size = size * sizeof(char) / sizeof(short);
+ else if(mp3_encode_return == MP3_EX)
+ {
+ sigmp3play_cleanup(x);
+ goto sigmp3play_labelzero;
+ }
+ else
+ {
+ if(x->file_block_num > 0)
+ {
+ mp3_read_length = MY_MP3_MALLOC_IN_SIZE;
+ x->file_block_num--;
+ }
+ else if(x->file_remain > 0)
+ {
+ mp3_read_length = x->file_remain;
+ x->file_remain = 0;
+ }
+ else
+ {
+ sigmp3play_cleanup(x);
+ goto sigmp3play_labelzero;
+ }
+
+ fread(x->mp3inbuf, mp3_read_length, sizeof(char), x->fh);
+ mp3_encode_return = decodeMP3(&(x->mp), x->mp3inbuf, mp3_read_length,
+ x->mp3outbuf, MY_MP3_MALLOC_IN_SIZE2, &size);
+ x->mp3_encode_size = size * sizeof(char) / sizeof(short);
+ if(mp3_encode_return == MP3_EX)
+ {
+ sigmp3play_cleanup(x);
+ goto sigmp3play_labelzero;
+ }
+ }
+ }
+
+ mp3_ch = x->mp3_ch;
+ down = x->down;
+ if(mp3_ch == 2)
+ {
+ if(down == 0)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + 2*n;
+ while (n--)
+ {
+ *out1++ = scale * (float)(*ivec++);
+ *out2++ = scale * (float)(*ivec++);
+ }
+ }
+ else if(down == 1)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + n;
+ n /= 2;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec++);
+ outb = scale * (float)(*ivec++);
+ *out1++ = outa;
+ *out2++ = outb;
+ *out1++ = outa;
+ *out2++ = outb;
+ }
+ }
+ else if(down == 2)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + n/2;
+ n /= 4;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec++);
+ outb = scale * (float)(*ivec++);
+ *out1++ = outa;
+ *out2++ = outb;
+ *out1++ = outa;
+ *out2++ = outb;
+ *out1++ = outa;
+ *out2++ = outb;
+ *out1++ = outa;
+ *out2++ = outb;
+ }
+ }
+ else if(down == -1)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + 4*n;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec++);
+ outb = scale * (float)(*ivec);
+ ivec += 3;
+ *out1++ = outa;
+ *out2++ = outa;
+ }
+ }
+ else if(down == -2)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + 8*n;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec++);
+ outb = scale * (float)(*ivec);
+ ivec += 7;
+ *out1++ = outa;
+ *out2++ = outa;
+ }
+ }
+ }
+ else
+ {
+ if(down == 0)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + n;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec++);
+ *out1++ = outa;
+ *out2++ = outa;
+ }
+ }
+ else if(down == 1)
+ {
+ ivec += mp3_out_index;
+ n /= 2;
+ x->mp3_out_index = mp3_out_index + n;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec++);
+ *out1++ = outa;
+ *out2++ = outa;
+ *out1++ = outa;
+ *out2++ = outa;
+ }
+ }
+ else if(down == 2)
+ {
+ ivec += mp3_out_index;
+ n /= 4;
+ x->mp3_out_index = mp3_out_index + n;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec++);
+ *out1++ = outa;
+ *out2++ = outa;
+ *out1++ = outa;
+ *out2++ = outa;
+ *out1++ = outa;
+ *out2++ = outa;
+ *out1++ = outa;
+ *out2++ = outa;
+ }
+ }
+ else if(down == -1)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + 2*n;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec);
+ ivec += 2;
+ *out1++ = outa;
+ *out2++ = outa;
+ }
+ }
+ else if(down == -2)
+ {
+ ivec += mp3_out_index;
+ x->mp3_out_index = mp3_out_index + 4*n;
+ while (n--)
+ {
+ outa = scale * (float)(*ivec);
+ ivec += 4;
+ *out1++ = outa;
+ *out2++ = outa;
+ }
+ }
+ }
+ return (w+5);
+
+sigmp3play_labelzero:
+
+ while (n--)
+ {
+ *out1++ = 0;
+ *out2++ = 0;
+ }
+ return (w+5);
+}
+
+static void sigmp3play_dsp(t_sigmp3play *x, t_signal **sp)
+{
+ x->obj_sr = (int)(sp[0]->s_sr);
+ x->obj_n = (int)(sp[0]->s_n);
+ dsp_add(sigmp3play_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
+}
+
+
+
+static void sigmp3play_stop(t_sigmp3play *x)
+{
+ if(x->file_is_open)
+ {
+ x->file_block_num = 0;
+ x->file_remain = 0;
+ }
+}
+
+static void sigmp3play_start(t_sigmp3play *x)
+{
+ if(x->file_is_open)
+ {
+ x->play_state = 1;
+ }
+}
+
+static void sigmp3play_ft1(t_sigmp3play *x, t_floatarg offset)
+{
+ if(offset < 0.0)
+ offset = 0.0;
+ x->offset_sec = (float)offset;
+}
+
+static void sigmp3play_pause(t_sigmp3play *x)
+{
+ if(x->file_is_open)
+ {
+ if(x->play_state == 0)
+ x->play_state = 1;
+ else if(x->play_state == 1)
+ x->play_state = 0;
+ }
+}
+
+static void sigmp3play_open(t_sigmp3play *x, t_symbol *s)
+{
+ x->frame_counter = 0;
+ sigmp3play_do_open(x, (char *)s->s_name, 1);
+}
+
+static void sigmp3play_open_again(t_sigmp3play *x)
+{
+ x->frame_counter = 0;
+ sigmp3play_do_open(x, x->filename, 0);
+}
+
+static void sigmp3play_open_at(t_sigmp3play *x, t_symbol *s)
+{
+ x->frame_counter = 1;
+ sigmp3play_do_open(x, (char *)s->s_name, 1);
+}
+
+static void sigmp3play_open_again_at(t_sigmp3play *x)
+{
+ x->frame_counter = 1;
+ sigmp3play_do_open(x, x->filename, 0);
+}
+
+
+static void sigmp3play_tick(t_sigmp3play *x)
+{
+ if(x->time1_bang0_handle)
+ {
+ outlet_float(x->x_floatout, (float)(x->frame_counter)*(x->time_factor));
+ }
+ else
+ {
+ outlet_bang(x->x_bangout);
+ }
+}
+
+static void sigmp3play_free(t_sigmp3play *x)
+{
+ if(x->mp_is_init)
+ ExitMP3(&(x->mp));
+ if(x->begframeseek)
+ freebytes(x->begframeseek, (x->maxframeseek)*sizeof(int));
+ freebytes(x->filename, MY_MP3_MALLOC_FN);
+ freebytes(x->mp3outbuf, MY_MP3_MALLOC_OUT_SIZE);
+ freebytes(x->mp3inbuf, MY_MP3_MALLOC_IN_SIZE);
+ clock_free(x->x_clock);
+}
+
+void sigmp3play_setup(void)
+{
+ sigmp3play_class = class_new(gensym("mp3play~"), (t_newmethod)sigmp3play_new,
+ (t_method)sigmp3play_free, sizeof(t_sigmp3play), 0, 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_dsp, gensym("dsp"), 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_start, gensym("start"), 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_ft1,
+ gensym("ft1"), A_FLOAT, 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_stop, gensym("stop"), 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_pause, gensym("pause"), 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_open_again_at, gensym("open_again_at"), 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_open, gensym("open"), A_DEFSYM, 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_open_again, gensym("open_again"), 0);
+ class_addmethod(sigmp3play_class, (t_method)sigmp3play_open_at, gensym("open_at"), A_DEFSYM, 0);
+ class_sethelpsymbol(sigmp3play_class, gensym("iemhelp/help-mp3play~"));
+ /*post("\nmp3play~ written by thomas musil & norbert math\nV 0.1 iem graz
+ austria 05 2000\n");*/
+}
diff --git a/src/iem_t3_lib/iem_t3_lib.c b/src/iem_t3_lib/iem_t3_lib.c
index 65365ae..91b3725 100644
--- a/src/iem_t3_lib/iem_t3_lib.c
+++ b/src/iem_t3_lib/iem_t3_lib.c
@@ -1,66 +1,66 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-/*
-#include <ctype.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#ifndef NT
-#include <sys/signal.h>
-#include <unistd.h>
-#endif
-
-#ifdef NT
-#include <io.h>
-#endif
-*/
-
-static t_class *iem_t3_lib_class;
-
-static void *iem_t3_lib_new(void)
-{
- t_object *x = (t_object *)pd_new(iem_t3_lib_class);
-
- return (x);
-}
-
-void sigt3_line_setup(void);
-void sigt3_sig_setup(void);
-void t3_bpe_setup(void);
-void t3_delay_setup(void);
-void t3_metro_setup(void);
-void t3_timer_setup(void);
-
-/* ------------------------ setup routine ------------------------- */
-
-void iem_t3_lib_setup(void)
-{
- iem_t3_lib_class = class_new(gensym("iem_t3_lib"), iem_t3_lib_new, 0,
- sizeof(t_object), CLASS_NOINLET, 0);
-
- sigt3_line_setup();
- sigt3_sig_setup();
- t3_bpe_setup();
- t3_delay_setup();
- t3_metro_setup();
- t3_timer_setup();
-
- post("iem_t3_lib (R-1.16) library loaded! (c) Gerhard Eckel, Thomas Musil 05.2005");
- post(" musil%ciem.at iem KUG Graz Austria", '@');
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+/*
+#include <ctype.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifndef NT
+#include <sys/signal.h>
+#include <unistd.h>
+#endif
+
+#ifdef NT
+#include <io.h>
+#endif
+*/
+
+static t_class *iem_t3_lib_class;
+
+static void *iem_t3_lib_new(void)
+{
+ t_object *x = (t_object *)pd_new(iem_t3_lib_class);
+
+ return (x);
+}
+
+void sigt3_line_setup(void);
+void sigt3_sig_setup(void);
+void t3_bpe_setup(void);
+void t3_delay_setup(void);
+void t3_metro_setup(void);
+void t3_timer_setup(void);
+
+/* ------------------------ setup routine ------------------------- */
+
+void iem_t3_lib_setup(void)
+{
+ iem_t3_lib_class = class_new(gensym("iem_t3_lib"), iem_t3_lib_new, 0,
+ sizeof(t_object), CLASS_NOINLET, 0);
+
+ sigt3_line_setup();
+ sigt3_sig_setup();
+ t3_bpe_setup();
+ t3_delay_setup();
+ t3_metro_setup();
+ t3_timer_setup();
+
+ post("iem_t3_lib (R-1.16) library loaded! (c) Gerhard Eckel, Thomas Musil 05.2005");
+ post(" musil%ciem.at iem KUG Graz Austria", '@');
+}
diff --git a/src/iem_t3_lib/sigt3_line.c b/src/iem_t3_lib/sigt3_line.c
index e58552f..3666098 100644
--- a/src/iem_t3_lib/sigt3_line.c
+++ b/src/iem_t3_lib/sigt3_line.c
@@ -1,279 +1,279 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-/* -------------------------- t3_line~ ------------------------------ */
-static t_class *sigt3_line_class;
-
-typedef struct _sigt3_line
-{
- t_object x_obj;
- t_clock *x_clock;
- float *x_beg;
- double x_cur_val;
- double x_dst_val;
- double x_inlet_val;
- double x_inc64;
- double x_inc;
- double x_ms2samps;
- double x_ticks2ms;
- double x_inlet_time;
- double x_dst_time;
- int x_cur_samps;
- int x_dur_samps;
- int x_n;
- int x_t3_bang_samps;
- int x_transient;
-} t_sigt3_line;
-
-static void sigt3_line_nontransient(float *vec, t_sigt3_line *x, int n)
-{
- int cur_samps = x->x_cur_samps, i;
- double inc = x->x_inc;
- double cur_val = x->x_cur_val;
-
- if(cur_samps)
- {
- if(cur_samps > n)
- {
- x->x_cur_samps -= n;
- while(n--)
- {
- cur_val += inc;
- *vec++ = (float)cur_val;
- }
- x->x_cur_val += x->x_inc64;
- }
- else if(cur_samps == n)
- {
- x->x_cur_samps = 0;
- while(n--)
- {
- cur_val += inc;
- *vec++ = (float)cur_val;
- }
- x->x_cur_val = x->x_dst_val;
- }
- else
- {
- for(i=0; i<cur_samps; i++)
- {
- cur_val += inc;
- *vec++ = (float)cur_val;
- }
- x->x_cur_val = cur_val = x->x_dst_val;
- for(i=cur_samps; i<n; i++)
- *vec++ = (float)cur_val;
- x->x_cur_samps = 0;
- }
- }
- else
- {
- while(n--)
- *vec++ = (float)cur_val;
- }
-}
-
-static t_int *sigt3_line_perform(t_int *w)
-{
- t_float *out = (t_float *)(w[1]);
- t_sigt3_line *x = (t_sigt3_line *)(w[2]);
- int n = (int)(w[3]);
-
- if(x->x_transient)
- {
- float *trans = x->x_beg;
-
- while(n--)
- *out++ = *trans++;
- x->x_transient = 0;
- }
- else
- sigt3_line_nontransient(out, x, n);
- return(w+4);
-}
-
-static void sigt3_line_tick(t_sigt3_line *x)
-{
- float *trans = x->x_beg;
- int n = x->x_n, t3_bang_samps, cur_samps, i;
- double inc, cur_val;
-
- if(!x->x_transient)
- sigt3_line_nontransient(trans, x, n);
- t3_bang_samps = x->x_t3_bang_samps;
- x->x_dst_val = x->x_inlet_val;
- if(x->x_inlet_time <= 0.0)
- {
- x->x_inlet_time = 0.0;
- x->x_dst_time = 0.0;
- x->x_dur_samps = 0;
- x->x_cur_samps = 0;
- cur_val = x->x_cur_val = x->x_dst_val;
- for(i=t3_bang_samps; i<n; i++)
- trans[i] = (float)cur_val;
- }
- else
- {
- int diff, end;
-
- x->x_dst_time = x->x_inlet_time;
- x->x_inlet_time = 0.0;
- cur_samps = (int)(x->x_dst_time * x->x_ms2samps);
- if(!cur_samps)
- cur_samps = 1;
- x->x_dur_samps = cur_samps;
- x->x_cur_samps = cur_samps;
- cur_val = x->x_cur_val = (double)trans[t3_bang_samps];
- inc = x->x_inc = (x->x_dst_val - cur_val)/(double)cur_samps;
- x->x_inc64 = (double)x->x_n * inc;
- diff = n - t3_bang_samps;
- if(cur_samps > diff)
- {
- for(i=t3_bang_samps; i<n; i++)
- {
- cur_val += inc;
- trans[i] = (float)cur_val;
- }
- x->x_cur_val += (double)diff * inc;
- x->x_cur_samps -= diff;
- }
- else if(cur_samps == diff)
- {
- for(i=t3_bang_samps; i<n; i++)
- {
- cur_val += inc;
- trans[i] = (float)cur_val;
- }
- x->x_cur_val = x->x_dst_val;
- x->x_cur_samps = 0;
- }
- else
- {
- end = t3_bang_samps + cur_samps;
- for(i=t3_bang_samps; i<end; i++)
- {
- cur_val += inc;
- trans[i] = (float)cur_val;
- }
- cur_val = x->x_cur_val = x->x_dst_val;
- x->x_cur_samps = 0;
- for(i=end; i<n; i++)
- trans[i] = (float)cur_val;
- }
- }
- x->x_transient = 1;
-}
-
-static void sigt3_line_list(t_sigt3_line *x, t_symbol *s, int ac, t_atom *av)
-{
- if((ac >= 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
- {
- int t3_bang_samps, ticks;
- double time;
-
- x->x_inlet_val = (double)atom_getfloatarg(1, ac, av);
- t3_bang_samps = (int)((float)atom_getfloatarg(0, ac, av)*x->x_ms2samps);
- if(t3_bang_samps < 0)
- t3_bang_samps = 0;
- ticks = t3_bang_samps / x->x_n;
- x->x_t3_bang_samps = t3_bang_samps - x->x_n * ticks;
- if((ac >= 3)&&IS_A_FLOAT(av,2))
- {
- time = (double)atom_getfloatarg(2, ac, av);
- if(time < 0.0)
- time = 0.0;
- x->x_inlet_time = time;
- }
- if(ticks < 1)
- sigt3_line_tick(x);
- else
- clock_delay(x->x_clock, (double)ticks * x->x_ticks2ms);
- }
-}
-
-static void sigt3_line_ft1(t_sigt3_line *x, t_float time)
-{
- if(time < 0.0)
- time = 0.0;
- x->x_inlet_time = (double)time;
-}
-
-static void sigt3_line_stop(t_sigt3_line *x)
-{
- clock_unset(x->x_clock);
- x->x_cur_samps = x->x_dur_samps = x->x_transient = 0;
- x->x_inc = x->x_inc64 = x->x_inlet_time = x->x_dst_time = 0.0;
-}
-
-static void sigt3_line_dsp(t_sigt3_line *x, t_signal **sp)
-{
- int i;
- float val, *trans;
-
- if(sp[0]->s_n > x->x_n)
- {
- freebytes(x->x_beg, x->x_n*sizeof(float));
- x->x_n = (int)sp[0]->s_n;
- x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
- }
- else
- x->x_n = (int)sp[0]->s_n;
- i = x->x_n;
- val = x->x_cur_val;
- trans = x->x_beg;
- while(i--)
- *trans++ = val;
- x->x_ms2samps = 0.001*(double)sp[0]->s_sr;
- x->x_ticks2ms = (double)x->x_n / x->x_ms2samps;
- dsp_add(sigt3_line_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
-}
-
-static void sigt3_line_free(t_sigt3_line *x)
-{
- if(x->x_beg)
- freebytes(x->x_beg, x->x_n*sizeof(float));
- clock_free(x->x_clock);
-}
-
-static void *sigt3_line_new(t_floatarg init_val)
-{
- t_sigt3_line *x = (t_sigt3_line *)pd_new(sigt3_line_class);
- int i;
-
- x->x_n = (int)sys_getblksize();
- x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
- x->x_inlet_val = x->x_cur_val = x->x_dst_val = init_val;
- x->x_t3_bang_samps = x->x_cur_samps = x->x_dur_samps = x->x_transient = 0;
- x->x_inlet_time = x->x_dst_time = 0.0;
- x->x_inc64 = x->x_inc = 0.0;
- x->x_ms2samps = 0.001 * (double)sys_getsr();
- x->x_ticks2ms = (double)x->x_n / x->x_ms2samps;
- x->x_clock = clock_new(x, (t_method)sigt3_line_tick);
- outlet_new(&x->x_obj, &s_signal);
- inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
- return (x);
-}
-
-void sigt3_line_setup(void)
-{
- sigt3_line_class = class_new(gensym("t3_line~"), (t_newmethod)sigt3_line_new,
- (t_method)sigt3_line_free, sizeof(t_sigt3_line), 0, A_DEFFLOAT, 0);
- class_addmethod(sigt3_line_class, (t_method)sigt3_line_dsp, gensym("dsp"), 0);
- class_addmethod(sigt3_line_class, (t_method)sigt3_line_stop, gensym("stop"), 0);
- class_addmethod(sigt3_line_class, (t_method)sigt3_line_ft1, gensym("ft1"), A_FLOAT, 0);
- class_addlist(sigt3_line_class, (t_method)sigt3_line_list);
- class_sethelpsymbol(sigt3_line_class, gensym("iemhelp/help-t3_line~"));
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+/* -------------------------- t3_line~ ------------------------------ */
+static t_class *sigt3_line_class;
+
+typedef struct _sigt3_line
+{
+ t_object x_obj;
+ t_clock *x_clock;
+ float *x_beg;
+ double x_cur_val;
+ double x_dst_val;
+ double x_inlet_val;
+ double x_inc64;
+ double x_inc;
+ double x_ms2samps;
+ double x_ticks2ms;
+ double x_inlet_time;
+ double x_dst_time;
+ int x_cur_samps;
+ int x_dur_samps;
+ int x_n;
+ int x_t3_bang_samps;
+ int x_transient;
+} t_sigt3_line;
+
+static void sigt3_line_nontransient(float *vec, t_sigt3_line *x, int n)
+{
+ int cur_samps = x->x_cur_samps, i;
+ double inc = x->x_inc;
+ double cur_val = x->x_cur_val;
+
+ if(cur_samps)
+ {
+ if(cur_samps > n)
+ {
+ x->x_cur_samps -= n;
+ while(n--)
+ {
+ cur_val += inc;
+ *vec++ = (float)cur_val;
+ }
+ x->x_cur_val += x->x_inc64;
+ }
+ else if(cur_samps == n)
+ {
+ x->x_cur_samps = 0;
+ while(n--)
+ {
+ cur_val += inc;
+ *vec++ = (float)cur_val;
+ }
+ x->x_cur_val = x->x_dst_val;
+ }
+ else
+ {
+ for(i=0; i<cur_samps; i++)
+ {
+ cur_val += inc;
+ *vec++ = (float)cur_val;
+ }
+ x->x_cur_val = cur_val = x->x_dst_val;
+ for(i=cur_samps; i<n; i++)
+ *vec++ = (float)cur_val;
+ x->x_cur_samps = 0;
+ }
+ }
+ else
+ {
+ while(n--)
+ *vec++ = (float)cur_val;
+ }
+}
+
+static t_int *sigt3_line_perform(t_int *w)
+{
+ t_float *out = (t_float *)(w[1]);
+ t_sigt3_line *x = (t_sigt3_line *)(w[2]);
+ int n = (int)(w[3]);
+
+ if(x->x_transient)
+ {
+ float *trans = x->x_beg;
+
+ while(n--)
+ *out++ = *trans++;
+ x->x_transient = 0;
+ }
+ else
+ sigt3_line_nontransient(out, x, n);
+ return(w+4);
+}
+
+static void sigt3_line_tick(t_sigt3_line *x)
+{
+ float *trans = x->x_beg;
+ int n = x->x_n, t3_bang_samps, cur_samps, i;
+ double inc, cur_val;
+
+ if(!x->x_transient)
+ sigt3_line_nontransient(trans, x, n);
+ t3_bang_samps = x->x_t3_bang_samps;
+ x->x_dst_val = x->x_inlet_val;
+ if(x->x_inlet_time <= 0.0)
+ {
+ x->x_inlet_time = 0.0;
+ x->x_dst_time = 0.0;
+ x->x_dur_samps = 0;
+ x->x_cur_samps = 0;
+ cur_val = x->x_cur_val = x->x_dst_val;
+ for(i=t3_bang_samps; i<n; i++)
+ trans[i] = (float)cur_val;
+ }
+ else
+ {
+ int diff, end;
+
+ x->x_dst_time = x->x_inlet_time;
+ x->x_inlet_time = 0.0;
+ cur_samps = (int)(x->x_dst_time * x->x_ms2samps);
+ if(!cur_samps)
+ cur_samps = 1;
+ x->x_dur_samps = cur_samps;
+ x->x_cur_samps = cur_samps;
+ cur_val = x->x_cur_val = (double)trans[t3_bang_samps];
+ inc = x->x_inc = (x->x_dst_val - cur_val)/(double)cur_samps;
+ x->x_inc64 = (double)x->x_n * inc;
+ diff = n - t3_bang_samps;
+ if(cur_samps > diff)
+ {
+ for(i=t3_bang_samps; i<n; i++)
+ {
+ cur_val += inc;
+ trans[i] = (float)cur_val;
+ }
+ x->x_cur_val += (double)diff * inc;
+ x->x_cur_samps -= diff;
+ }
+ else if(cur_samps == diff)
+ {
+ for(i=t3_bang_samps; i<n; i++)
+ {
+ cur_val += inc;
+ trans[i] = (float)cur_val;
+ }
+ x->x_cur_val = x->x_dst_val;
+ x->x_cur_samps = 0;
+ }
+ else
+ {
+ end = t3_bang_samps + cur_samps;
+ for(i=t3_bang_samps; i<end; i++)
+ {
+ cur_val += inc;
+ trans[i] = (float)cur_val;
+ }
+ cur_val = x->x_cur_val = x->x_dst_val;
+ x->x_cur_samps = 0;
+ for(i=end; i<n; i++)
+ trans[i] = (float)cur_val;
+ }
+ }
+ x->x_transient = 1;
+}
+
+static void sigt3_line_list(t_sigt3_line *x, t_symbol *s, int ac, t_atom *av)
+{
+ if((ac >= 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
+ {
+ int t3_bang_samps, ticks;
+ double time;
+
+ x->x_inlet_val = (double)atom_getfloatarg(1, ac, av);
+ t3_bang_samps = (int)((float)atom_getfloatarg(0, ac, av)*x->x_ms2samps);
+ if(t3_bang_samps < 0)
+ t3_bang_samps = 0;
+ ticks = t3_bang_samps / x->x_n;
+ x->x_t3_bang_samps = t3_bang_samps - x->x_n * ticks;
+ if((ac >= 3)&&IS_A_FLOAT(av,2))
+ {
+ time = (double)atom_getfloatarg(2, ac, av);
+ if(time < 0.0)
+ time = 0.0;
+ x->x_inlet_time = time;
+ }
+ if(ticks < 1)
+ sigt3_line_tick(x);
+ else
+ clock_delay(x->x_clock, (double)ticks * x->x_ticks2ms);
+ }
+}
+
+static void sigt3_line_ft1(t_sigt3_line *x, t_float time)
+{
+ if(time < 0.0)
+ time = 0.0;
+ x->x_inlet_time = (double)time;
+}
+
+static void sigt3_line_stop(t_sigt3_line *x)
+{
+ clock_unset(x->x_clock);
+ x->x_cur_samps = x->x_dur_samps = x->x_transient = 0;
+ x->x_inc = x->x_inc64 = x->x_inlet_time = x->x_dst_time = 0.0;
+}
+
+static void sigt3_line_dsp(t_sigt3_line *x, t_signal **sp)
+{
+ int i;
+ float val, *trans;
+
+ if(sp[0]->s_n > x->x_n)
+ {
+ freebytes(x->x_beg, x->x_n*sizeof(float));
+ x->x_n = (int)sp[0]->s_n;
+ x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
+ }
+ else
+ x->x_n = (int)sp[0]->s_n;
+ i = x->x_n;
+ val = x->x_cur_val;
+ trans = x->x_beg;
+ while(i--)
+ *trans++ = val;
+ x->x_ms2samps = 0.001*(double)sp[0]->s_sr;
+ x->x_ticks2ms = (double)x->x_n / x->x_ms2samps;
+ dsp_add(sigt3_line_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
+}
+
+static void sigt3_line_free(t_sigt3_line *x)
+{
+ if(x->x_beg)
+ freebytes(x->x_beg, x->x_n*sizeof(float));
+ clock_free(x->x_clock);
+}
+
+static void *sigt3_line_new(t_floatarg init_val)
+{
+ t_sigt3_line *x = (t_sigt3_line *)pd_new(sigt3_line_class);
+ int i;
+
+ x->x_n = (int)sys_getblksize();
+ x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
+ x->x_inlet_val = x->x_cur_val = x->x_dst_val = init_val;
+ x->x_t3_bang_samps = x->x_cur_samps = x->x_dur_samps = x->x_transient = 0;
+ x->x_inlet_time = x->x_dst_time = 0.0;
+ x->x_inc64 = x->x_inc = 0.0;
+ x->x_ms2samps = 0.001 * (double)sys_getsr();
+ x->x_ticks2ms = (double)x->x_n / x->x_ms2samps;
+ x->x_clock = clock_new(x, (t_method)sigt3_line_tick);
+ outlet_new(&x->x_obj, &s_signal);
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
+ return (x);
+}
+
+void sigt3_line_setup(void)
+{
+ sigt3_line_class = class_new(gensym("t3_line~"), (t_newmethod)sigt3_line_new,
+ (t_method)sigt3_line_free, sizeof(t_sigt3_line), 0, A_DEFFLOAT, 0);
+ class_addmethod(sigt3_line_class, (t_method)sigt3_line_dsp, gensym("dsp"), 0);
+ class_addmethod(sigt3_line_class, (t_method)sigt3_line_stop, gensym("stop"), 0);
+ class_addmethod(sigt3_line_class, (t_method)sigt3_line_ft1, gensym("ft1"), A_FLOAT, 0);
+ class_addlist(sigt3_line_class, (t_method)sigt3_line_list);
+ class_sethelpsymbol(sigt3_line_class, gensym("iemhelp/help-t3_line~"));
+}
diff --git a/src/iem_t3_lib/sigt3_sig.c b/src/iem_t3_lib/sigt3_sig.c
index fcfedee..27dc01d 100644
--- a/src/iem_t3_lib/sigt3_sig.c
+++ b/src/iem_t3_lib/sigt3_sig.c
@@ -1,200 +1,200 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-/* -------------------------- sigt3_sig~ ------------------------------ */
-static t_class *sigt3_sig_class;
-
-typedef struct _sigt3_sig
-{
- t_object x_obj;
- t_clock *x_clock;
- float x_old_val;
- float x_new_val;
- float *x_beg;
- int x_n;
- int x_t3_bang_samps;
- int x_transient;
- float x_ms2samps;
- float x_ticks2ms;
-} t_sigt3_sig;
-
-static void sigt3_sig_tick(t_sigt3_sig *x)
-{
- float *trans = x->x_beg, val;
- int n = x->x_n, t3_bang_samps, i;
-
- t3_bang_samps = x->x_t3_bang_samps;
- if(!x->x_transient)
- {
- val = x->x_old_val;
- for(i=0; i<t3_bang_samps; i++)
- trans[i] = val;
- x->x_transient = 1;
- }
- val = x->x_old_val = x->x_new_val;
- for(i=t3_bang_samps; i<n; i++)
- trans[i] = val;
-}
-
-static void sigt3_sig_stop(t_sigt3_sig *x)
-{
- clock_unset(x->x_clock);
- x->x_new_val = x->x_old_val;
-}
-
-static void sigt3_sig_list(t_sigt3_sig *x, t_symbol *s, int ac, t_atom *av)
-{
- if((ac == 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
- {
- int n = x->x_n, t3_bang_samps, ticks;
-
- t3_bang_samps = (int)((float)atom_getfloatarg(0, ac, av)*x->x_ms2samps);
- x->x_new_val = (float)atom_getfloatarg(1, ac, av);
- if(t3_bang_samps < 0)
- t3_bang_samps = 0;
- ticks = t3_bang_samps / n;
- x->x_t3_bang_samps = t3_bang_samps - n*ticks;
- if(ticks < 1)
- sigt3_sig_tick(x);
- else
- clock_delay(x->x_clock, (double)ticks * (double)x->x_ticks2ms);
- }
-}
-
-static t_int *sigt3_sig_perform(t_int *w)
-{
- t_float *out = (t_float *)(w[1]);
- t_sigt3_sig *x = (t_sigt3_sig *)(w[2]);
- int n = (int)(w[3]);
-
- if(x->x_transient)
- {
- float *trans = x->x_beg;
-
- while(n--)
- *out++ = *trans++;
- x->x_transient = 0;
- }
- else
- {
- float val = x->x_new_val;
-
- while(n--)
- *out++ = val;
- }
- return (w+4);
-}
-
-static t_int *sigt3_sig_perf8(t_int *w)
-{
- t_float *out = (t_float *)(w[1]);
- t_sigt3_sig *x = (t_sigt3_sig *)(w[2]);
- int n = (int)(w[3]), i;
-
- if(x->x_transient)
- {
- float *trans = x->x_beg;
-
- for(i=0; i<n; i+=8, out+=8, trans+=8)
- {
- out[0] = trans[0];
- out[1] = trans[1];
- out[2] = trans[2];
- out[3] = trans[3];
- out[4] = trans[4];
- out[5] = trans[5];
- out[6] = trans[6];
- out[7] = trans[7];
- }
- x->x_transient = 0;
- }
- else
- {
- float val = x->x_new_val;
-
- for(i=0; i<n; i+=8, out+=8)
- {
- out[0] = val;
- out[1] = val;
- out[2] = val;
- out[3] = val;
- out[4] = val;
- out[5] = val;
- out[6] = val;
- out[7] = val;
- }
- }
- return (w+4);
-}
-
-static void sigt3_sig_dsp(t_sigt3_sig *x, t_signal **sp)
-{
- int i;
- float *trans, val;
-
- if(sp[0]->s_n > x->x_n)
- {
- freebytes(x->x_beg, x->x_n*sizeof(float));
- x->x_n = sp[0]->s_n;
- x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
- }
- else
- x->x_n = sp[0]->s_n;
- x->x_ms2samps = 0.001*(float)sp[0]->s_sr;
- x->x_ticks2ms = (float)x->x_n / x->x_ms2samps;
- i = x->x_n;
- val = x->x_new_val;
- trans = x->x_beg;
- while(i--)
- *trans++ = val;
-
- if((sp[0]->s_n)&7)
- dsp_add(sigt3_sig_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
- else
- dsp_add(sigt3_sig_perf8, 3, sp[0]->s_vec, x, sp[0]->s_n);
-}
-
-static void sigt3_sig_free(t_sigt3_sig *x)
-{
- if(x->x_beg)
- freebytes(x->x_beg, x->x_n*sizeof(float));
- clock_free(x->x_clock);
-}
-
-static void *sigt3_sig_new(t_floatarg init_val)
-{
- t_sigt3_sig *x = (t_sigt3_sig *)pd_new(sigt3_sig_class);
-
- x->x_new_val = x->x_old_val = init_val;
- x->x_n = (int)sys_getblksize();
- x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
- x->x_t3_bang_samps = x->x_transient = 0;
- x->x_ms2samps = 0.001 * (float)sys_getsr();
- x->x_ticks2ms = (float)x->x_n / x->x_ms2samps;
- x->x_clock = clock_new(x, (t_method)sigt3_sig_tick);
- outlet_new(&x->x_obj, &s_signal);
- return (x);
-}
-
-void sigt3_sig_setup(void)
-{
- sigt3_sig_class = class_new(gensym("t3_sig~"), (t_newmethod)sigt3_sig_new,
- (t_method)sigt3_sig_free, sizeof(t_sigt3_sig), 0, A_DEFFLOAT, 0);
- class_addmethod(sigt3_sig_class, (t_method)sigt3_sig_dsp, gensym("dsp"), 0);
- class_addmethod(sigt3_sig_class, (t_method)sigt3_sig_stop, gensym("stop"), 0);
- class_addlist(sigt3_sig_class, (t_method)sigt3_sig_list);
- class_sethelpsymbol(sigt3_sig_class, gensym("iemhelp/help-t3_sig~"));
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+/* -------------------------- sigt3_sig~ ------------------------------ */
+static t_class *sigt3_sig_class;
+
+typedef struct _sigt3_sig
+{
+ t_object x_obj;
+ t_clock *x_clock;
+ float x_old_val;
+ float x_new_val;
+ float *x_beg;
+ int x_n;
+ int x_t3_bang_samps;
+ int x_transient;
+ float x_ms2samps;
+ float x_ticks2ms;
+} t_sigt3_sig;
+
+static void sigt3_sig_tick(t_sigt3_sig *x)
+{
+ float *trans = x->x_beg, val;
+ int n = x->x_n, t3_bang_samps, i;
+
+ t3_bang_samps = x->x_t3_bang_samps;
+ if(!x->x_transient)
+ {
+ val = x->x_old_val;
+ for(i=0; i<t3_bang_samps; i++)
+ trans[i] = val;
+ x->x_transient = 1;
+ }
+ val = x->x_old_val = x->x_new_val;
+ for(i=t3_bang_samps; i<n; i++)
+ trans[i] = val;
+}
+
+static void sigt3_sig_stop(t_sigt3_sig *x)
+{
+ clock_unset(x->x_clock);
+ x->x_new_val = x->x_old_val;
+}
+
+static void sigt3_sig_list(t_sigt3_sig *x, t_symbol *s, int ac, t_atom *av)
+{
+ if((ac == 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
+ {
+ int n = x->x_n, t3_bang_samps, ticks;
+
+ t3_bang_samps = (int)((float)atom_getfloatarg(0, ac, av)*x->x_ms2samps);
+ x->x_new_val = (float)atom_getfloatarg(1, ac, av);
+ if(t3_bang_samps < 0)
+ t3_bang_samps = 0;
+ ticks = t3_bang_samps / n;
+ x->x_t3_bang_samps = t3_bang_samps - n*ticks;
+ if(ticks < 1)
+ sigt3_sig_tick(x);
+ else
+ clock_delay(x->x_clock, (double)ticks * (double)x->x_ticks2ms);
+ }
+}
+
+static t_int *sigt3_sig_perform(t_int *w)
+{
+ t_float *out = (t_float *)(w[1]);
+ t_sigt3_sig *x = (t_sigt3_sig *)(w[2]);
+ int n = (int)(w[3]);
+
+ if(x->x_transient)
+ {
+ float *trans = x->x_beg;
+
+ while(n--)
+ *out++ = *trans++;
+ x->x_transient = 0;
+ }
+ else
+ {
+ float val = x->x_new_val;
+
+ while(n--)
+ *out++ = val;
+ }
+ return (w+4);
+}
+
+static t_int *sigt3_sig_perf8(t_int *w)
+{
+ t_float *out = (t_float *)(w[1]);
+ t_sigt3_sig *x = (t_sigt3_sig *)(w[2]);
+ int n = (int)(w[3]), i;
+
+ if(x->x_transient)
+ {
+ float *trans = x->x_beg;
+
+ for(i=0; i<n; i+=8, out+=8, trans+=8)
+ {
+ out[0] = trans[0];
+ out[1] = trans[1];
+ out[2] = trans[2];
+ out[3] = trans[3];
+ out[4] = trans[4];
+ out[5] = trans[5];
+ out[6] = trans[6];
+ out[7] = trans[7];
+ }
+ x->x_transient = 0;
+ }
+ else
+ {
+ float val = x->x_new_val;
+
+ for(i=0; i<n; i+=8, out+=8)
+ {
+ out[0] = val;
+ out[1] = val;
+ out[2] = val;
+ out[3] = val;
+ out[4] = val;
+ out[5] = val;
+ out[6] = val;
+ out[7] = val;
+ }
+ }
+ return (w+4);
+}
+
+static void sigt3_sig_dsp(t_sigt3_sig *x, t_signal **sp)
+{
+ int i;
+ float *trans, val;
+
+ if(sp[0]->s_n > x->x_n)
+ {
+ freebytes(x->x_beg, x->x_n*sizeof(float));
+ x->x_n = sp[0]->s_n;
+ x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
+ }
+ else
+ x->x_n = sp[0]->s_n;
+ x->x_ms2samps = 0.001*(float)sp[0]->s_sr;
+ x->x_ticks2ms = (float)x->x_n / x->x_ms2samps;
+ i = x->x_n;
+ val = x->x_new_val;
+ trans = x->x_beg;
+ while(i--)
+ *trans++ = val;
+
+ if((sp[0]->s_n)&7)
+ dsp_add(sigt3_sig_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
+ else
+ dsp_add(sigt3_sig_perf8, 3, sp[0]->s_vec, x, sp[0]->s_n);
+}
+
+static void sigt3_sig_free(t_sigt3_sig *x)
+{
+ if(x->x_beg)
+ freebytes(x->x_beg, x->x_n*sizeof(float));
+ clock_free(x->x_clock);
+}
+
+static void *sigt3_sig_new(t_floatarg init_val)
+{
+ t_sigt3_sig *x = (t_sigt3_sig *)pd_new(sigt3_sig_class);
+
+ x->x_new_val = x->x_old_val = init_val;
+ x->x_n = (int)sys_getblksize();
+ x->x_beg = (float *)getbytes(x->x_n*sizeof(float));
+ x->x_t3_bang_samps = x->x_transient = 0;
+ x->x_ms2samps = 0.001 * (float)sys_getsr();
+ x->x_ticks2ms = (float)x->x_n / x->x_ms2samps;
+ x->x_clock = clock_new(x, (t_method)sigt3_sig_tick);
+ outlet_new(&x->x_obj, &s_signal);
+ return (x);
+}
+
+void sigt3_sig_setup(void)
+{
+ sigt3_sig_class = class_new(gensym("t3_sig~"), (t_newmethod)sigt3_sig_new,
+ (t_method)sigt3_sig_free, sizeof(t_sigt3_sig), 0, A_DEFFLOAT, 0);
+ class_addmethod(sigt3_sig_class, (t_method)sigt3_sig_dsp, gensym("dsp"), 0);
+ class_addmethod(sigt3_sig_class, (t_method)sigt3_sig_stop, gensym("stop"), 0);
+ class_addlist(sigt3_sig_class, (t_method)sigt3_sig_list);
+ class_sethelpsymbol(sigt3_sig_class, gensym("iemhelp/help-t3_sig~"));
+}
diff --git a/src/iem_t3_lib/t3_bpe.c b/src/iem_t3_lib/t3_bpe.c
index 24c61f9..2aa7846 100644
--- a/src/iem_t3_lib/t3_bpe.c
+++ b/src/iem_t3_lib/t3_bpe.c
@@ -1,141 +1,141 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-/* ------------------------ t3_bpe ---------------------------- */
-static t_class *t3_bpe_class;
-
-typedef struct _t3_bpe
-{
- t_object x_obj;
- t_atom x_at[2];
- t_clock *x_clock;
- int x_maxnum;
- int x_curnum;
- int x_curindex;
- t_atom *x_beg;
- double x_t3_bang;
- double x_ticks2ms;
- int x_hit;
- void *x_out_val;
- void *x_out_time;
- void *x_out_finished;
-} t_t3_bpe;
-
-static void t3_bpe_stop(t_t3_bpe *x)
-{
- clock_unset(x->x_clock);
-}
-
-static void t3_bpe_tick(t_t3_bpe *x)
-{
- t_atom *vec = x->x_beg;
- float val;
- double dticks, time;
- int iticks;
-
- if(x->x_curindex >= x->x_curnum)
- {
- t3_bpe_stop(x);
- outlet_float(x->x_out_finished, x->x_t3_bang);
- }
- else
- {
- x->x_hit = 0;
- vec += x->x_curindex;
- val = atom_getfloat(vec++);
- time = (double)atom_getfloat(vec);
- outlet_float(x->x_out_time, (float)time);
- x->x_at[1].a_w.w_float = val;
- x->x_at[0].a_w.w_float = x->x_t3_bang;
- outlet_list(x->x_obj.ob_outlet, &s_list, 2, x->x_at);
- dticks = (time + x->x_t3_bang)/x->x_ticks2ms;
- iticks = (int)dticks;
- x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
- if(!x->x_hit)
- clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
- x->x_curindex += 2;
- }
-}
-
-static void t3_bpe_float(t_t3_bpe *x, t_floatarg f)
-{
- double dticks;
- int iticks;
-
- if(x->x_curnum)
- {
- x->x_curindex = 0;
- dticks = (double)f/x->x_ticks2ms;
- iticks = (int)dticks;
- x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
- clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
- x->x_hit = 1;
- }
-}
-
-static void t3_bpe_list(t_t3_bpe *x, t_symbol *s, int ac, t_atom *av)
-{
- int n = ac & 0xfffffffe, i;
- t_atom *vec = x->x_beg;
- if(n > x->x_maxnum)
- {
- freebytes(x->x_beg, x->x_maxnum*sizeof(t_atom));
- x->x_maxnum = 2 + n;
- x->x_beg = (t_atom *)getbytes(x->x_maxnum*sizeof(t_atom));
- vec = x->x_beg;
- }
- x->x_curnum = n;
- for(i=0; i<n; i++)
- {
- *vec++ = *av++;
- }
-}
-
-static void t3_bpe_free(t_t3_bpe *x)
-{
- freebytes(x->x_beg, x->x_maxnum*sizeof(t_atom));
- clock_free(x->x_clock);
-}
-
-static void *t3_bpe_new(void)
-{
- t_t3_bpe *x = (t_t3_bpe *)pd_new(t3_bpe_class);
-
- x->x_t3_bang = 0.0;
- x->x_ticks2ms = 1000.0*(double)sys_getblksize()/(double)sys_getsr();
- x->x_curindex = 0;
- x->x_maxnum = 20;
- x->x_curnum = 0;
- x->x_hit = 0;
- x->x_beg = (t_atom *)getbytes(x->x_maxnum*sizeof(t_atom));
- x->x_clock = clock_new(x, (t_method)t3_bpe_tick);
- outlet_new(&x->x_obj, &s_list);
- x->x_out_time = outlet_new(&x->x_obj, &s_float);
- x->x_out_finished = outlet_new(&x->x_obj, &s_float);
- x->x_at[0].a_type = A_FLOAT;
- x->x_at[1].a_type = A_FLOAT;
- return (x);
-}
-
-void t3_bpe_setup(void)
-{
- t3_bpe_class = class_new(gensym("t3_bpe"), (t_newmethod)t3_bpe_new,
- (t_method)t3_bpe_free, sizeof(t_t3_bpe), 0, 0);
- class_addmethod(t3_bpe_class, (t_method)t3_bpe_stop, gensym("stop"), 0);
- class_addfloat(t3_bpe_class, (t_method)t3_bpe_float);
- class_addlist(t3_bpe_class, (t_method)t3_bpe_list);
- class_sethelpsymbol(t3_bpe_class, gensym("iemhelp/help-t3_bpe"));
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+/* ------------------------ t3_bpe ---------------------------- */
+static t_class *t3_bpe_class;
+
+typedef struct _t3_bpe
+{
+ t_object x_obj;
+ t_atom x_at[2];
+ t_clock *x_clock;
+ int x_maxnum;
+ int x_curnum;
+ int x_curindex;
+ t_atom *x_beg;
+ double x_t3_bang;
+ double x_ticks2ms;
+ int x_hit;
+ void *x_out_val;
+ void *x_out_time;
+ void *x_out_finished;
+} t_t3_bpe;
+
+static void t3_bpe_stop(t_t3_bpe *x)
+{
+ clock_unset(x->x_clock);
+}
+
+static void t3_bpe_tick(t_t3_bpe *x)
+{
+ t_atom *vec = x->x_beg;
+ float val;
+ double dticks, time;
+ int iticks;
+
+ if(x->x_curindex >= x->x_curnum)
+ {
+ t3_bpe_stop(x);
+ outlet_float(x->x_out_finished, x->x_t3_bang);
+ }
+ else
+ {
+ x->x_hit = 0;
+ vec += x->x_curindex;
+ val = atom_getfloat(vec++);
+ time = (double)atom_getfloat(vec);
+ outlet_float(x->x_out_time, (float)time);
+ x->x_at[1].a_w.w_float = val;
+ x->x_at[0].a_w.w_float = x->x_t3_bang;
+ outlet_list(x->x_obj.ob_outlet, &s_list, 2, x->x_at);
+ dticks = (time + x->x_t3_bang)/x->x_ticks2ms;
+ iticks = (int)dticks;
+ x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
+ if(!x->x_hit)
+ clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
+ x->x_curindex += 2;
+ }
+}
+
+static void t3_bpe_float(t_t3_bpe *x, t_floatarg f)
+{
+ double dticks;
+ int iticks;
+
+ if(x->x_curnum)
+ {
+ x->x_curindex = 0;
+ dticks = (double)f/x->x_ticks2ms;
+ iticks = (int)dticks;
+ x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
+ clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
+ x->x_hit = 1;
+ }
+}
+
+static void t3_bpe_list(t_t3_bpe *x, t_symbol *s, int ac, t_atom *av)
+{
+ int n = ac & 0xfffffffe, i;
+ t_atom *vec = x->x_beg;
+ if(n > x->x_maxnum)
+ {
+ freebytes(x->x_beg, x->x_maxnum*sizeof(t_atom));
+ x->x_maxnum = 2 + n;
+ x->x_beg = (t_atom *)getbytes(x->x_maxnum*sizeof(t_atom));
+ vec = x->x_beg;
+ }
+ x->x_curnum = n;
+ for(i=0; i<n; i++)
+ {
+ *vec++ = *av++;
+ }
+}
+
+static void t3_bpe_free(t_t3_bpe *x)
+{
+ freebytes(x->x_beg, x->x_maxnum*sizeof(t_atom));
+ clock_free(x->x_clock);
+}
+
+static void *t3_bpe_new(void)
+{
+ t_t3_bpe *x = (t_t3_bpe *)pd_new(t3_bpe_class);
+
+ x->x_t3_bang = 0.0;
+ x->x_ticks2ms = 1000.0*(double)sys_getblksize()/(double)sys_getsr();
+ x->x_curindex = 0;
+ x->x_maxnum = 20;
+ x->x_curnum = 0;
+ x->x_hit = 0;
+ x->x_beg = (t_atom *)getbytes(x->x_maxnum*sizeof(t_atom));
+ x->x_clock = clock_new(x, (t_method)t3_bpe_tick);
+ outlet_new(&x->x_obj, &s_list);
+ x->x_out_time = outlet_new(&x->x_obj, &s_float);
+ x->x_out_finished = outlet_new(&x->x_obj, &s_float);
+ x->x_at[0].a_type = A_FLOAT;
+ x->x_at[1].a_type = A_FLOAT;
+ return (x);
+}
+
+void t3_bpe_setup(void)
+{
+ t3_bpe_class = class_new(gensym("t3_bpe"), (t_newmethod)t3_bpe_new,
+ (t_method)t3_bpe_free, sizeof(t_t3_bpe), 0, 0);
+ class_addmethod(t3_bpe_class, (t_method)t3_bpe_stop, gensym("stop"), 0);
+ class_addfloat(t3_bpe_class, (t_method)t3_bpe_float);
+ class_addlist(t3_bpe_class, (t_method)t3_bpe_list);
+ class_sethelpsymbol(t3_bpe_class, gensym("iemhelp/help-t3_bpe"));
+}
diff --git a/src/iem_t3_lib/t3_delay.c b/src/iem_t3_lib/t3_delay.c
index da7dd06..0298832 100644
--- a/src/iem_t3_lib/t3_delay.c
+++ b/src/iem_t3_lib/t3_delay.c
@@ -1,96 +1,96 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-/* ------------------------ t3_delay ---------------------------- */
-static t_class *t3_delay_class;
-
-typedef struct _t3_delay
-{
- t_object x_obj;
- t_clock *x_clock;
- double x_deltime;
- double x_ticks2ms;
- double x_t3_bang;
-} t_t3_delay;
-
-static void t3_delay_tick(t_t3_delay *x)
-{
- outlet_float(x->x_obj.ob_outlet, x->x_t3_bang);
-}
-
-static void t3_delay_stop(t_t3_delay *x)
-{
- clock_unset(x->x_clock);
-}
-
-static void t3_delay_float(t_t3_delay *x, t_floatarg t3_bang)
-{
- double dticks;
- int iticks;
-
- if(t3_bang < 0)
- t3_bang = 0;
- dticks = (x->x_deltime + (double)t3_bang)/x->x_ticks2ms;
- iticks = (int)dticks;
- x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
- clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
-}
-
-static void t3_delay_ft1(t_t3_delay *x, t_floatarg f)
-{
- if(f < 0)
- f = 0;
- x->x_deltime = f;
-}
-
-static void t3_delay_list(t_t3_delay *x, t_symbol *s, int ac, t_atom *av)
-{
- if((ac == 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
- {
- t3_delay_ft1(x, atom_getfloatarg(1, ac, av));
- t3_delay_float(x, atom_getfloatarg(0, ac, av));
- }
-}
-
-static void t3_delay_free(t_t3_delay *x)
-{
- clock_free(x->x_clock);
-}
-
-static void *t3_delay_new(t_floatarg f)
-{
- t_t3_delay *x = (t_t3_delay *)pd_new(t3_delay_class);
-
- x->x_ticks2ms = 1000.0*(double)sys_getblksize()/(double)sys_getsr();
- t3_delay_ft1(x, f);
- x->x_clock = clock_new(x, (t_method)t3_delay_tick);
- outlet_new(&x->x_obj, &s_float);
- inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
- return (x);
-}
-
-void t3_delay_setup(void)
-{
- t3_delay_class = class_new(gensym("t3_delay"), (t_newmethod)t3_delay_new,
- (t_method)t3_delay_free, sizeof(t_t3_delay), 0, A_DEFFLOAT, 0);
- class_addcreator((t_newmethod)t3_delay_new, gensym("t3_del"), A_DEFFLOAT, 0);
- class_addmethod(t3_delay_class, (t_method)t3_delay_stop, gensym("stop"), 0);
- class_addmethod(t3_delay_class, (t_method)t3_delay_ft1,
- gensym("ft1"), A_FLOAT, 0);
- class_addfloat(t3_delay_class, (t_method)t3_delay_float);
- class_addlist(t3_delay_class, (t_method)t3_delay_list);
- class_sethelpsymbol(t3_delay_class, gensym("iemhelp/help-t3_delay"));
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+/* ------------------------ t3_delay ---------------------------- */
+static t_class *t3_delay_class;
+
+typedef struct _t3_delay
+{
+ t_object x_obj;
+ t_clock *x_clock;
+ double x_deltime;
+ double x_ticks2ms;
+ double x_t3_bang;
+} t_t3_delay;
+
+static void t3_delay_tick(t_t3_delay *x)
+{
+ outlet_float(x->x_obj.ob_outlet, x->x_t3_bang);
+}
+
+static void t3_delay_stop(t_t3_delay *x)
+{
+ clock_unset(x->x_clock);
+}
+
+static void t3_delay_float(t_t3_delay *x, t_floatarg t3_bang)
+{
+ double dticks;
+ int iticks;
+
+ if(t3_bang < 0)
+ t3_bang = 0;
+ dticks = (x->x_deltime + (double)t3_bang)/x->x_ticks2ms;
+ iticks = (int)dticks;
+ x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
+ clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
+}
+
+static void t3_delay_ft1(t_t3_delay *x, t_floatarg f)
+{
+ if(f < 0)
+ f = 0;
+ x->x_deltime = f;
+}
+
+static void t3_delay_list(t_t3_delay *x, t_symbol *s, int ac, t_atom *av)
+{
+ if((ac == 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
+ {
+ t3_delay_ft1(x, atom_getfloatarg(1, ac, av));
+ t3_delay_float(x, atom_getfloatarg(0, ac, av));
+ }
+}
+
+static void t3_delay_free(t_t3_delay *x)
+{
+ clock_free(x->x_clock);
+}
+
+static void *t3_delay_new(t_floatarg f)
+{
+ t_t3_delay *x = (t_t3_delay *)pd_new(t3_delay_class);
+
+ x->x_ticks2ms = 1000.0*(double)sys_getblksize()/(double)sys_getsr();
+ t3_delay_ft1(x, f);
+ x->x_clock = clock_new(x, (t_method)t3_delay_tick);
+ outlet_new(&x->x_obj, &s_float);
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
+ return (x);
+}
+
+void t3_delay_setup(void)
+{
+ t3_delay_class = class_new(gensym("t3_delay"), (t_newmethod)t3_delay_new,
+ (t_method)t3_delay_free, sizeof(t_t3_delay), 0, A_DEFFLOAT, 0);
+ class_addcreator((t_newmethod)t3_delay_new, gensym("t3_del"), A_DEFFLOAT, 0);
+ class_addmethod(t3_delay_class, (t_method)t3_delay_stop, gensym("stop"), 0);
+ class_addmethod(t3_delay_class, (t_method)t3_delay_ft1,
+ gensym("ft1"), A_FLOAT, 0);
+ class_addfloat(t3_delay_class, (t_method)t3_delay_float);
+ class_addlist(t3_delay_class, (t_method)t3_delay_list);
+ class_sethelpsymbol(t3_delay_class, gensym("iemhelp/help-t3_delay"));
+}
diff --git a/src/iem_t3_lib/t3_metro.c b/src/iem_t3_lib/t3_metro.c
index 8dcdb61..d71c54a 100644
--- a/src/iem_t3_lib/t3_metro.c
+++ b/src/iem_t3_lib/t3_metro.c
@@ -1,120 +1,120 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-/* ------------------------ t3_metro ---------------------------- */
-static t_class *t3_metro_class;
-
-typedef struct _t3_metro
-{
- t_object x_obj;
- t_clock *x_clock;
- double x_metrotime;
- double x_ticks2ms;
- double x_t3_bang;
- int x_hit;
- void *x_out_next;
-} t_t3_metro;
-
-static void t3_metro_stop(t_t3_metro *x)
-{
- clock_unset(x->x_clock);
-}
-
-static void t3_metro_tick(t_t3_metro *x)
-{
- double dticks;
- int iticks;
-
- x->x_hit = 0;
- outlet_float(x->x_out_next, x->x_metrotime);
- outlet_float(x->x_obj.ob_outlet, x->x_t3_bang);
- dticks = (x->x_metrotime + x->x_t3_bang)/x->x_ticks2ms;
- iticks = (int)dticks;
- x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
- if(!x->x_hit)
- clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
-}
-
-static void t3_metro_float(t_t3_metro *x, t_floatarg t3_bang)
-{
- double dticks;
- int iticks;
-
- if(t3_bang < 0)
- t3_bang = 0;
- dticks = (double)t3_bang/x->x_ticks2ms;
- iticks = (int)dticks;
- x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
- clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
- x->x_hit = 1;
-}
-
-static void t3_metro_start(t_t3_metro *x, t_floatarg f)
-{
- t3_metro_float(x, f);
- x->x_hit = 1;
-}
-
-static void t3_metro_ft1(t_t3_metro *x, t_floatarg f)
-{
- if(f < 0.01) f = 0.01;
- x->x_metrotime = (double)f;
-}
-
-static void t3_metro_list(t_t3_metro *x, t_symbol *s, int ac, t_atom *av)
-{
- if((ac == 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
- {
- t3_metro_ft1(x, atom_getfloatarg(1, ac, av));
- t3_metro_float(x, atom_getfloatarg(0, ac, av));
- }
-}
-
-static void t3_metro_free(t_t3_metro *x)
-{
- clock_free(x->x_clock);
-}
-
-static void *t3_metro_new(t_symbol *s, int ac, t_atom *av)
-{
- t_t3_metro *x = (t_t3_metro *)pd_new(t3_metro_class);
-
- x->x_metrotime = 10.0;
- x->x_t3_bang = 0.0;
- x->x_hit = 0;
- if((ac == 1)&&IS_A_FLOAT(av,0))
- {
- t3_metro_ft1(x, atom_getfloatarg(0, ac, av));
- }
- x->x_ticks2ms = 1000.0*(double)sys_getblksize()/(double)sys_getsr();
- x->x_clock = clock_new(x, (t_method)t3_metro_tick);
- outlet_new(&x->x_obj, &s_float);
- x->x_out_next = outlet_new(&x->x_obj, &s_float);
- inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
- return (x);
-}
-
-void t3_metro_setup(void)
-{
- t3_metro_class = class_new(gensym("t3_metro"), (t_newmethod)t3_metro_new,
- (t_method)t3_metro_free, sizeof(t_t3_metro), 0, A_GIMME, 0);
- class_addmethod(t3_metro_class, (t_method)t3_metro_stop, gensym("stop"), 0);
- class_addmethod(t3_metro_class, (t_method)t3_metro_start, gensym("start"), A_FLOAT, 0);
- class_addmethod(t3_metro_class, (t_method)t3_metro_ft1, gensym("ft1"), A_FLOAT, 0);
- class_addfloat(t3_metro_class, (t_method)t3_metro_float);
- class_addlist(t3_metro_class, (t_method)t3_metro_list);
- class_sethelpsymbol(t3_metro_class, gensym("iemhelp/help-t3_metro"));
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+/* ------------------------ t3_metro ---------------------------- */
+static t_class *t3_metro_class;
+
+typedef struct _t3_metro
+{
+ t_object x_obj;
+ t_clock *x_clock;
+ double x_metrotime;
+ double x_ticks2ms;
+ double x_t3_bang;
+ int x_hit;
+ void *x_out_next;
+} t_t3_metro;
+
+static void t3_metro_stop(t_t3_metro *x)
+{
+ clock_unset(x->x_clock);
+}
+
+static void t3_metro_tick(t_t3_metro *x)
+{
+ double dticks;
+ int iticks;
+
+ x->x_hit = 0;
+ outlet_float(x->x_out_next, x->x_metrotime);
+ outlet_float(x->x_obj.ob_outlet, x->x_t3_bang);
+ dticks = (x->x_metrotime + x->x_t3_bang)/x->x_ticks2ms;
+ iticks = (int)dticks;
+ x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
+ if(!x->x_hit)
+ clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
+}
+
+static void t3_metro_float(t_t3_metro *x, t_floatarg t3_bang)
+{
+ double dticks;
+ int iticks;
+
+ if(t3_bang < 0)
+ t3_bang = 0;
+ dticks = (double)t3_bang/x->x_ticks2ms;
+ iticks = (int)dticks;
+ x->x_t3_bang = (dticks - (double)iticks)*x->x_ticks2ms;
+ clock_delay(x->x_clock, (double)iticks*x->x_ticks2ms);
+ x->x_hit = 1;
+}
+
+static void t3_metro_start(t_t3_metro *x, t_floatarg f)
+{
+ t3_metro_float(x, f);
+ x->x_hit = 1;
+}
+
+static void t3_metro_ft1(t_t3_metro *x, t_floatarg f)
+{
+ if(f < 0.01) f = 0.01;
+ x->x_metrotime = (double)f;
+}
+
+static void t3_metro_list(t_t3_metro *x, t_symbol *s, int ac, t_atom *av)
+{
+ if((ac == 2)&&IS_A_FLOAT(av,0)&&IS_A_FLOAT(av,1))
+ {
+ t3_metro_ft1(x, atom_getfloatarg(1, ac, av));
+ t3_metro_float(x, atom_getfloatarg(0, ac, av));
+ }
+}
+
+static void t3_metro_free(t_t3_metro *x)
+{
+ clock_free(x->x_clock);
+}
+
+static void *t3_metro_new(t_symbol *s, int ac, t_atom *av)
+{
+ t_t3_metro *x = (t_t3_metro *)pd_new(t3_metro_class);
+
+ x->x_metrotime = 10.0;
+ x->x_t3_bang = 0.0;
+ x->x_hit = 0;
+ if((ac == 1)&&IS_A_FLOAT(av,0))
+ {
+ t3_metro_ft1(x, atom_getfloatarg(0, ac, av));
+ }
+ x->x_ticks2ms = 1000.0*(double)sys_getblksize()/(double)sys_getsr();
+ x->x_clock = clock_new(x, (t_method)t3_metro_tick);
+ outlet_new(&x->x_obj, &s_float);
+ x->x_out_next = outlet_new(&x->x_obj, &s_float);
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
+ return (x);
+}
+
+void t3_metro_setup(void)
+{
+ t3_metro_class = class_new(gensym("t3_metro"), (t_newmethod)t3_metro_new,
+ (t_method)t3_metro_free, sizeof(t_t3_metro), 0, A_GIMME, 0);
+ class_addmethod(t3_metro_class, (t_method)t3_metro_stop, gensym("stop"), 0);
+ class_addmethod(t3_metro_class, (t_method)t3_metro_start, gensym("start"), A_FLOAT, 0);
+ class_addmethod(t3_metro_class, (t_method)t3_metro_ft1, gensym("ft1"), A_FLOAT, 0);
+ class_addfloat(t3_metro_class, (t_method)t3_metro_float);
+ class_addlist(t3_metro_class, (t_method)t3_metro_list);
+ class_sethelpsymbol(t3_metro_class, gensym("iemhelp/help-t3_metro"));
+}
diff --git a/src/iem_t3_lib/t3_timer.c b/src/iem_t3_lib/t3_timer.c
index c6dc392..5f0bc3a 100644
--- a/src/iem_t3_lib/t3_timer.c
+++ b/src/iem_t3_lib/t3_timer.c
@@ -1,55 +1,55 @@
-/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
-
-iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-#include "m_pd.h"
-#include "iemlib.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-/* -------------------------- t3_timer ------------------------------ */
-static t_class *t3_timer_class;
-
-typedef struct _t3_timer
-{
- t_object x_obj;
- double x_settime;
- double x_t3_off;
-} t_t3_timer;
-
-static void t3_timer_float(t_t3_timer *x, t_float t3_bang)
-{
- x->x_settime = (double)clock_getsystime();
- x->x_t3_off = (double)t3_bang;
-}
-
-static void t3_timer_ft1(t_t3_timer *x, t_float t3_bang)
-{
- outlet_float(x->x_obj.ob_outlet, clock_gettimesince(x->x_settime)
- + (double)t3_bang - x->x_t3_off);
-}
-
-static void *t3_timer_new(void)
-{
- t_t3_timer *x = (t_t3_timer *)pd_new(t3_timer_class);
- t3_timer_float(x, 0.0);
- outlet_new(&x->x_obj, &s_float);
- inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
- return (x);
-}
-
-void t3_timer_setup(void)
-{
- t3_timer_class = class_new(gensym("t3_timer"), (t_newmethod)t3_timer_new, 0,
- sizeof(t_t3_timer), 0, 0);
- class_addfloat(t3_timer_class, t3_timer_float);
- class_addmethod(t3_timer_class, (t_method)t3_timer_ft1, gensym("ft1"), A_FLOAT, 0);
- class_sethelpsymbol(t3_timer_class, gensym("iemhelp/help-t3_timer"));
-}
+/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
+
+iem_t3_lib written by Gerhard Eckel, Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
+
+#ifdef NT
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4305 )
+#endif
+
+#include "m_pd.h"
+#include "iemlib.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+/* -------------------------- t3_timer ------------------------------ */
+static t_class *t3_timer_class;
+
+typedef struct _t3_timer
+{
+ t_object x_obj;
+ double x_settime;
+ double x_t3_off;
+} t_t3_timer;
+
+static void t3_timer_float(t_t3_timer *x, t_float t3_bang)
+{
+ x->x_settime = (double)clock_getsystime();
+ x->x_t3_off = (double)t3_bang;
+}
+
+static void t3_timer_ft1(t_t3_timer *x, t_float t3_bang)
+{
+ outlet_float(x->x_obj.ob_outlet, clock_gettimesince(x->x_settime)
+ + (double)t3_bang - x->x_t3_off);
+}
+
+static void *t3_timer_new(void)
+{
+ t_t3_timer *x = (t_t3_timer *)pd_new(t3_timer_class);
+ t3_timer_float(x, 0.0);
+ outlet_new(&x->x_obj, &s_float);
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
+ return (x);
+}
+
+void t3_timer_setup(void)
+{
+ t3_timer_class = class_new(gensym("t3_timer"), (t_newmethod)t3_timer_new, 0,
+ sizeof(t_t3_timer), 0, 0);
+ class_addfloat(t3_timer_class, t3_timer_float);
+ class_addmethod(t3_timer_class, (t_method)t3_timer_ft1, gensym("ft1"), A_FLOAT, 0);
+ class_sethelpsymbol(t3_timer_class, gensym("iemhelp/help-t3_timer"));
+}
diff --git a/src/iemlib2/makefile_win b/src/iemlib2/makefile_win
index e1cd6ae..1dc3bf7 100644
--- a/src/iemlib2/makefile_win
+++ b/src/iemlib2/makefile_win
@@ -63,7 +63,6 @@ SRC = add2_comma.c \
OBJ = $(SRC:.c=.obj)
.c.obj:
-
cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c
..\..\lib\iemlib2.dll: $(OBJ)