00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <math.h>
00023 #include <out_lame.h>
00024 #ifdef HAVE_LAME
00025
00026 #include <jutils.h>
00027 #include <generic.h>
00028 #include <config.h>
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 OutLame::OutLame()
00040 : OutChannel("lame") {
00041 func("OutLame::OutLame()");
00042
00043 sprintf(name,"Lame MP3 encoder");
00044 sprintf(version,"version %s",get_lame_version());
00045
00046 tipo = MP3;
00047 enc_flags = NULL;
00048
00049 }
00050
00051
00052
00053 int OutLame::encode() {
00054 int num, smp;
00055
00056
00057
00058 num = erbapipa->read(OUT_CHUNK<<2,pcm);
00059 if(num<0) return num;
00060
00061 smp = num>>2;
00062
00063 if(!enc_flags) {
00064 error("Lame encoder is not initialized");
00065 return -5;
00066 }
00067
00068 encoded =
00069 lame_encode_buffer_interleaved
00070 (enc_flags, pcm, smp, (unsigned char *)buffer, 0);
00071
00072 if(encoded<0)
00073 switch(encoded) {
00074 case -1:
00075 error("lame encoder: mp3 buffer is too small");
00076 break;
00077 case -2:
00078 error("lame encoder: malloc() problem");
00079 break;
00080 case -3:
00081 error("lame encoder: lame_init_params() not called");
00082 break;
00083 case -4:
00084 error("lame encoder: psycho acoustic problems (yes, shamanic indeed)");
00085 break;
00086 default:
00087 error("lame encoder: internal error");
00088 break;
00089 }
00090
00091 return encoded;
00092 }
00093
00094 void OutLame::flush() {
00095 if(!enc_flags) {
00096 error("Lame encoder is not initialized");
00097 return;
00098 }
00099 lock();
00100 encoded = lame_encode_flush_nogap
00101 (enc_flags,(unsigned char*)buffer,ENCBUFFER_SIZE);
00102 shout();
00103 unlock();
00104 }
00105
00106 bool OutLame::init() {
00107 func("initializing %s %s",name,version);
00108
00109 if(!apply_profile()) {
00110 error("problems in setting up codec parameters");
00111 lame_close(enc_flags);
00112 enc_flags = NULL;
00113 return false;
00114 }
00115
00116 initialized = true;
00117 return initialized;
00118 }
00119
00120 bool OutLame::apply_profile() {
00121
00122
00123 if(enc_flags) lame_close(enc_flags);
00124 enc_flags = lame_init();
00125
00126 lame_set_errorf(enc_flags,(void (*)(const char*, va_list))error);
00127 lame_set_debugf(enc_flags,(void (*)(const char*, va_list))func);
00128 lame_set_msgf(enc_flags,(void (*)(const char*, va_list))act);
00129
00130 lame_set_num_samples(enc_flags,OUT_CHUNK);
00131 lame_set_num_channels(enc_flags,2);
00132 lame_set_in_samplerate(enc_flags,SAMPLE_RATE);
00133 lame_set_error_protection(enc_flags,1);
00134 lame_set_compression_ratio(enc_flags,0);
00135 lame_set_quality(enc_flags,2);
00136
00137
00138
00139
00140 lame_set_brate(enc_flags,bps());
00141 Shouter *ice = (Shouter*)icelist.begin();
00142 while(ice) {
00143 ice->bps( bps() );
00144 ice = (Shouter*)ice->next;
00145 }
00146
00147 lame_set_out_samplerate(enc_flags,freq());
00148
00149
00150
00151 int mode;
00152 switch( channels() ) {
00153
00154 case 1: mode = 3; break;
00155 case 2: mode = 1; break;
00156 default: mode = 3; break;
00157 }
00158 lame_set_mode(enc_flags,(MPEG_mode_e)mode);
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 lame_set_lowpassfreq(enc_flags,lowpass());
00169 lame_set_highpassfreq(enc_flags,highpass());
00170
00171 int res = lame_init_params(enc_flags);
00172 if(res<0) {
00173 error("lame_init_params failed");
00174 lame_close(enc_flags);
00175 enc_flags = NULL;
00176 }
00177
00178 return (res<0)?false:true;
00179
00180 }
00181
00182 OutLame::~OutLame() {
00183 func("OutLame::~OutLame() %p",this);
00184 act("closing lame encoder");
00185
00186 if(enc_flags) lame_close(enc_flags);
00187 }
00188
00189 #endif