00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <dec_mp3.h>
00023 #include <jutils.h>
00024 #include <config.h>
00025
00026
00027 MuseDecMp3::MuseDecMp3() : MuseDec() {
00028 loader = NULL;
00029 server = NULL;
00030 strncpy(name,"Mp3",4);
00031 }
00032
00033 MuseDecMp3::~MuseDecMp3() {
00034 if(loader) {
00035 delete loader;
00036 loader = NULL;
00037 }
00038
00039 if(server) {
00040 delete server;
00041 server = NULL;
00042 }
00043
00044 }
00045
00046 int MuseDecMp3::load(char *file) {
00047 func("MuseDecMp3::load(%s)",file);
00048 int res = 0;
00049
00050 loader = Soundinputstream::hopen(file,&res);
00051 if(loader == NULL) {
00052 warning("MuseDecMp3::load : i don't see any stream flowing from %s",file);
00053
00054
00055 return(0);
00056 }
00057
00058 server = new Mpegtoraw(loader);
00059 if(server == NULL) {
00060 warning("MuseDecMp3::load(%s) - uuops! NULL Mpegtoraw",file);
00061 delete loader;
00062 loader = NULL;
00063
00064
00065 return(0);
00066 }
00067
00068 server->initialize(file);
00069
00070 samplerate = server->getfrequency();
00071 channels = (server->getmode()<3) ? 2 : 1;
00072 bitrate = server->getbitrate();
00073
00074
00075 framepos = 0;
00076
00077
00078 res = (loader->seekable) ? 1: 2;
00079 seekable = (loader->seekable) ? true : false;
00080
00081
00082
00083 framesize = server->getpcmperframe() * channels;
00084
00085 if(samplerate<=22050) {
00086
00087 framesize /=2;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096 if(seekable) {
00097
00098 frametot = server->gettotalframe();
00099
00100 fps = samplerate / server->getpcmperframe();
00101 }
00102
00103
00104 strncpy(_file,file,MAX_PATH_SIZE);
00105
00106
00107
00108 return(res);
00109 }
00110
00111
00112
00113 IN_DATATYPE *MuseDecMp3::get_audio() {
00114
00115 if(!server->run(1)) {
00116 switch(server->geterrorcode()) {
00117 case SOUND_ERROR_FINISH:
00118
00119 if(seekable) {
00120 framepos = server->getcurrentframe();
00121 func(_("mpeglib: end of stream at frame position %u"),framepos);
00122 } else
00123 func(_("mpeglib: end of stream"));
00124 eos = true;
00125 return(NULL);
00126 case SOUND_ERROR_FILEOPENFAIL:
00127 error(_("mpeglib: failed opening file (FILEOPENFAIL)"));
00128 err = true;
00129 return(NULL);
00130 case SOUND_ERROR_FILEREADFAIL:
00131 error(_("mpeglib: failed reading from file (FILEREADFAIL)"));
00132 err = true;
00133 return(NULL);
00134 case SOUND_ERROR_UNKNOWNPROXY:
00135 error(_("mpeglib: unknown proxy"));
00136 err = true;
00137 return(NULL);
00138 case SOUND_ERROR_UNKNOWNHOST:
00139 error(_("mpeglib: unknown host"));
00140 err = true;
00141 return(NULL);
00142 case SOUND_ERROR_SOCKET:
00143 error(_("mpeglib: socket error"));
00144 err = true;
00145 return(NULL);
00146 case SOUND_ERROR_CONNECT:
00147 error(_("mpeglib: connect error"));
00148 err = true;
00149 return(NULL);
00150 case SOUND_ERROR_FDOPEN:
00151 error("mpeglib: FDOPEN");
00152 err = true;
00153 return(NULL);
00154 case SOUND_ERROR_HTTPFAIL:
00155 error(_("mpeglib: http failure"));
00156 err = true;
00157 return(NULL);
00158 case SOUND_ERROR_HTTPWRITEFAIL:
00159 error(_("mpeglib: http write failed"));
00160 err = true;
00161 return(NULL);
00162 case SOUND_ERROR_TOOMANYRELOC:
00163 error("mpeglib: TOOMANYRELOC");
00164 err = true;
00165 return(NULL);
00166 case SOUND_ERROR_THREADFAIL:
00167 error(_("mpeglib: thread failure"));
00168 err = true;
00169 return(NULL);
00170 default:
00171 error(_("mpeglib: unknown error '%d' :("), server->geterrorcode());
00172 err = true;
00173 return(NULL);
00174 }
00175 }
00176
00177
00178
00179
00180
00181
00182 frames = framesize;
00183
00184
00185 if(seekable) {
00186 framepos = server->getcurrentframe();
00187 }
00188
00189
00190 return((IN_DATATYPE *)server->rawdata);
00191 }
00192
00193 bool MuseDecMp3::seek(float pos) {
00194 func("MuseDecMp3::seek(%f)",pos);
00195
00196 if(pos==0.0)
00197
00198
00199 load(_file);
00200 else
00201 server->setframe((int) (frametot*pos));
00202
00203
00204 return(true);
00205 }