| |
Code:
typedef struct
{
unsigned char save; // Save the Info
unsigned char mode; // Mono Stereo J-Stereo ...
unsigned char channels; // Count off channels
unsigned char name_pos; // Filename pos unsigned
int play_len; // Playing lenght as 1/16 sec.
unsigned int sample_rate; // Sample frequency
unsigned int stream_rate; // Streamrate as kbits/s
char
path[CTL_MAX_PATH]; // Filename
} SoundInfo,*lpSoundInfo;
//**********************************
//*
//* Mp3BlockInfo
//*
//**********************************
// If Scan in not zero the count of scanned byte are stored there
// If Info in not zero the info of the soundinfo is stored there
// Returns the count of samples in den Mp3 array or 0 if the buffer
has no Mp3 head
int Mp3BlockInfo(void *Block,int Size,SoundInfo *Info,int *Scan)
{
static long snd_freqs[8] = { 44100, 48000, 32000, 22050,
24000, 16000, 11025, 0};
static
long mpeg_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,}}
};
static
long mpeg_fs[3][16] =
{{ 0 , 104, 156, 182, 208, 261, 313, 365, 417, 522, 626, 731, 835,
1044, 1253, },
{ 0 , 96 , 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768,
960, 1152, },
{ 0 , 144, 216, 252, 288, 360, 432, 504, 576, 720, 864, 1008, 1152,
1440, 1728}};
unsigned
head;
int version,num;
int layer;
int bitrate;
int frequency;
int error_bit;
int padding;
int mpeg_mode;
int stereo;
int framesize;
int ssize;
int mpeg25;
unsigned char *buffer=(unsigned char*)Block;
head=GetMpeg(buffer);
if((head&0xFFE00000)
!= 0xFFE00000) // Wrong header ?
{
for(num=0;num<=Size-4;num++) // Search for Header
{
if( buffer[num ]!=0xFF )continue;
if( buffer[num+1]==0xFF )continue;
if((buffer[num+1]& 0xE0)==0xE0)
{
head=GetMpeg(buffer+num);
break;
}
}
if(Scan)*Scan=num;
return 0;
}
mpeg25
= ((head>>20)&0x01)^0x1; // Mepeg 2.5
version = (((head>>19)&0x01)^0x1)|mpeg25; // version-number
layer = 4-((head>>17)&0x03); // layer
bitrate = ((head>>12)&0x0F); // bitrate
frequency = ((head>>10)&0x03) + (version*3);
error_bit = ((head>>16)&0x01)^0x1;
padding = ((head>> 9)&0x01);
mpeg_mode = ((head>> 6)&0x03);
stereo = (mpeg_mode == MPG_MD_MONO) ? 1 : 2;
if(mpeg25)
{
layer = 1;
frequency=6;
}
switch(layer)
// calculate frame size
{
case 1: framesize = mpeg_123[version][0][bitrate] * 12000;
framesize /= snd_freqs[frequency];
framesize = ((framesize+padding)<<2)-4;
break;
case 2: framesize = mpeg_fs[frequency&0x3][bitrate]-4;
framesize += padding;
break;
case 3:
if(version) ssize = (stereo == 1) ? 9 : 17;
else ssize = (stereo == 1) ? 17 : 32;
if(error_bit)ssize += 2;
framesize
= mpeg_123[version][2][bitrate] * 144000;
framesize /= snd_freqs[frequency]<<(version);
framesize = framesize + padding - 4;
break;
default:if(Scan)*Scan=1;
return 0;
}
if(framesize<=0)
{
if(Scan)*Scan=1;
return 0;
}
if(Scan)*Scan=framesize+4;
if(Info)
// Get file info
{
Info->play_len = 0;
Info->mode = mpeg_mode+1;
Info->channels = stereo;
Info->sample_rate = snd_freqs[frequency];
Info->stream_rate = mpeg_123[version][layer-1][bitrate];
}
if(version)return
(layer==1)? 384/2:1152/2;
return
(layer==1)? 384:1152;
}
//**********************************
//*
//* Mp3Length
//*
//**********************************
int Mp3Length(char *Datei)
{
FILE *f;
int wo,fpos,flen,anz,fanz,size,samples;
unsigned char buffer[4100];
SoundInfo info;
f=fopen(Datei,"r");
if(!f)return 0;
wo
= 4;
fpos = 0;
flen = flength(f); // Dateilänge einlesen
size = 0;
samples = 0;
while(fpos<flen)
// Datei einlesen
{
fanz=flen-fpos;
if(fanz>4096)fanz=4096;
fread(buffer,fanz,1,f); // Datei einlesen
while(wo<=4096)
// Samples zählen {
x=Mp3BlockInfo(mem+wo,4096+4-wo,&info,&anz);
samples+=x;
wo+=anz;
if(x)size+=anz;
}
memcpy(mem,mem+4096,4);
wo&=0x0FFF;
fpos+=fanz;
x=(flen<=0)? 1:flen;
}
fclose(f);
// Abspiellänge berechen
if(fpos==flen && samples>0)
{
if(!info.sample_rate)info.sample_rate=44100;
flen=samples/(info->sample_rate>>4);
// flen ist die Spieldauer in 16tel Sekunden
inf.play_len=flen;
}
return flen;
} |