23 #error with_mad was not set to 1 with scons, but you are including files that require this. Please fix your settings.cfg
27 #error with_id3 was not set to 1 with scons, but you are including files that require this. Please fix your settings.cfg
41 #include <sys/types.h>
58 unsigned char toc[100];
69 # define XING_MAGIC (('X' << 24) | ('i' << 16) | ('n' << 8) | 'g')
72 int parse_xing(
struct xing *xing,
struct mad_bitptr ptr,
unsigned int bitlen)
74 if (bitlen < 64)
goto fail;
75 if (mad_bit_read(&ptr, 32) !=
XING_MAGIC)
goto fail;
77 xing->flags = mad_bit_read(&ptr, 32);
81 if (bitlen < 32)
goto fail;
83 xing->frames = mad_bit_read(&ptr, 32);
88 if (bitlen < 32)
goto fail;
90 xing->bytes = mad_bit_read(&ptr, 32);
95 if (bitlen < 800)
goto fail;
98 for (
unsigned i = 0; i < 100; ++i)
99 xing->toc[i] = (
unsigned char)mad_bit_read(&ptr, 8);
104 if (bitlen < 32)
goto fail;
105 xing->scale = mad_bit_read(&ptr, 32);
117 MpegCodec::MpegCodec()
135 std::string::size_type startExt = uri.rfind(
'.' );
136 if ( startExt != std::string::npos )
138 std::string ext = uri.substr(startExt+1);
139 if ( ext!=
"mp3" && ext!=
"mpg" && ext!=
"mpeg")
144 FILE* handle = fopen( uri.c_str(),
"rb" );
150 bitstream.
Init(handle);
151 bool foundSomeMpegFrame =
false;
152 while( !foundSomeMpegFrame
154 foundSomeMpegFrame = bitstream.
NextFrame();
157 return foundSomeMpegFrame;
174 FILE* handle = fopen( uri.c_str(),
"rb" );
179 struct stat fileStats;
181 if ( stat( uri.c_str(), &fileStats ) != 0 )
188 unsigned long fileLength = fileStats.st_size;
190 if ( fseek( handle, -128, SEEK_END ) < 0 )
199 if ( fread( buffer, 1, 3, handle ) != 3 )
205 if ( !strncmp( buffer,
"TAG", 3 ) )
211 handle = fopen( uri.c_str(),
"rb" );
224 bitstream.
Init(handle);
227 struct xing xingHeader;
229 bool hasXingHeader =
false;
231 unsigned int bitrate = 0;
249 if ( frameCount == 0 )
264 hasXingHeader =
true;
265 numFrames = xingHeader.frames;
272 if ( frameCount <= 20 )
274 if ( bitstream.
CurrentFrame().header.bitrate != bitrate )
278 if ( !isVBR && frameCount > 20 )
286 double time = ( fileLength * 8.0 ) / bitstream.
CurrentFrame().header.bitrate;
287 double timeFrac = (double)time - ((
long)(time));
288 long nsamples = 32 * MAD_NSBSAMPLES(&bitstream.
CurrentFrame().header);
289 numFrames = ( long) ( time * bitstream.
CurrentFrame().header.samplerate / nsamples );
290 mad_timer_t madFmtTime;
291 mad_timer_set( &madFmtTime, (
long)time, (
long)(timeFrac*100), 100 );
295 hdr.SetLength( (
TTime)mad_timer_count( madFmtTime, MAD_UNITS_MILLISECONDS ) );
297 else if ( hasXingHeader )
299 mad_timer_multiply( &bitstream.
CurrentFrame().header.duration, numFrames );
300 mad_timer_t madFmtTime = bitstream.
CurrentFrame().header.duration;
304 hdr.SetLength( (
TTime)mad_timer_count( madFmtTime, MAD_UNITS_MILLISECONDS ) );
311 hdr.SetLength( decodedFramesLength );
316 hdr.SetSamples(
TSize((hdr.GetLength()/1000.)*hdr.GetSampleRate()) );
325 switch( MPEGFrame.header.layer )
340 switch( MPEGFrame.header.emphasis )
342 case MAD_EMPHASIS_NONE:
345 case MAD_EMPHASIS_50_15_US:
348 case MAD_EMPHASIS_CCITT_J_17:
355 header.SetSampleRate(
TData(MPEGFrame.header.samplerate) );
356 header.SetChannels( MAD_NCHANNELS(&MPEGFrame.header) );
360 static const char *
getField(ID3_Tag & tag,
const ID3_FrameID & field)
362 ID3_Frame* fieldFrame = tag.Find( field );
363 if (not fieldFrame)
return 0;
364 ID3_Field* fieldString = fieldFrame->GetField( ID3FN_TEXT );
365 if (not fieldString)
return 0;
366 return fieldString->GetRawText();
372 fileTag.Link( uri.c_str() );
374 const char * artist =
getField(fileTag, ID3FID_LEADARTIST);
375 const char * title =
getField(fileTag, ID3FID_TITLE);
376 const char * album =
getField(fileTag, ID3FID_ALBUM);
377 const char * tracknum =
getField(fileTag, ID3FID_TRACKNUM);
378 const char * composer =
getField(fileTag, ID3FID_COMPOSER);
379 const char * performer =
getField(fileTag, ID3FID_CONDUCTOR);
381 if (artist) txt.AddArtist();
382 if (title) txt.AddTitle();
383 if (album) txt.AddAlbum();
384 if (tracknum) txt.AddTrackNumber();
385 if (composer) txt.AddComposer();
386 if (performer) txt.AddPerformer();
390 if (artist) txt.SetArtist(artist);
391 if (title) txt.SetTitle(title);
392 if (album) txt.SetAlbum(album);
393 if (tracknum) txt.SetTrackNumber(tracknum);
394 if (composer) txt.SetComposer(composer);
395 if (performer) txt.SetPerformer(performer);