// ReadMp3File.cpp: implementation of the CReadMp3File class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MediaClient.h"
#include "ReadMp3File.h"
#include <queue>
using namespace std;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
int sample_rate[4][4]={{11025,0,22050,44100},{12000,0,24000,48000},{8000,0,16000,32000},{0,0,0,0}};
int bitrate_MPEG1[16][4] = {{0,0,0,0},{0,32,32,32},{0,40,48,64},{0,48,56,96},
{0,56,64,128},{0,64,80,160},{0,80,96,192},{0,96,112,224},{0,112,128,256},
{0,128,160,288},{0,160,192,320},{0,192,224,352},{0,224,256,384},{0,256,320,416},
{0,320,384,448},{0,0,0,0}};
int bitrate_MPEG23[16][4] ={{0,0,0,0,},{0,8,8,32},{0,16,16,48},{0,24,24,56},{0,32,32,64},
{0,40,40,80},{0,48,48,96},{0,56,56,112},{0,64,64,128},{0,80,80,144},{0,96,96,160},{0,112,112,176},
{0,128,128,192},{0,144,144,224},{0,160,160,256},{0,0,0,0}};
int sample_per_frame[4][4]={{0,0,0,0},{576,0,576,1152},{1152,0,1152,1152},{384,0,384,384}};
char Genre[12][15]={"Blues","ClassicRock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal","NewAge","Oldies"};
extern queue<PLAY_DATA> g_read_data;
extern CRITICAL_SECTION cs_read_queue;
CReadMp3File::CReadMp3File()
{
m_filename = NULL;
memset(&m_label_header, 0, sizeof(ID3V2_LABEL_HEADER));
memset(&m_label_header, 0, sizeof(ID3V2_LABEL_HEADER));
memset(&m_ID3V1Head, 0, sizeof(ID3V1_FRAME_HEADER));
memset(&m_label_info, 0, sizeof(ID3V2_LABEL_INFO));
memset(&m_FrameHead, 0, sizeof(DATA_FRAME_HEADER));
m_frame_info.clear();
m_is_protect = false;
m_is_vbr = false;
m_frame_count = 0;
m_play_time = 0;
m_aver_bitrate = 0;
m_samples_per_Frame = 0;
m_sampling_rate = 0;
}
CReadMp3File::~CReadMp3File()
{
delete [] m_filename;
}
/*********************接口函数**********************************/
void CReadMp3File::Initializtion_mp3(char *filename) //初始化函数
{
int len = strlen(filename)+1;
m_filename = new char[len];
memset(m_filename,0,len);
strcpy(m_filename,filename);
ReadID3V1Header();
ReadLabelHeader();
ReadLabelFrame();
if(DefenceFile()) //true 为vbr型
{
m_is_vbr = true;
ReadFrameInfo_vbr();
}
else
{
m_is_vbr = false;
ReadFrameInfo_cbr(); //false
}
DefenceIsProtect();
}
BOOL CReadMp3File::IsMydefineFile_mp3(CString filename)
{
if(filename.GetAllocLength() == 0)
{
return FALSE;
}
FILE *fp = NULL;
char buf[2] = {0};
fp = fopen(m_filename,"rb");
int len = fread(buf, sizeof(char), 1, fp);
fclose(fp);
if(len < 1)
{
return FALSE;
}
if(buf[0] == 'M')
{
return TRUE;
}
else
{
return TRUE;
}
}
BOOL CReadMp3File::CreateFile_mp3(CString filename)
{
if(filename.GetAllocLength() == 0)
{
return FALSE;
}
FILE *fp = NULL;
char buf[2] = {0};
buf[0] = 'M';
fp = fopen(m_filename,"wb");
int len = fwrite(buf,sizeof(char),1,fp);
fclose(fp);
if(len == 1)
{
return TRUE;
}
else
{
return FALSE;
}
}
BOOL CReadMp3File::WriteFile_mp3(CString filename,char *buf,int len) // TIME 播放时间 SNUM 采样数 RATE 采样率
{
if(filename.GetAllocLength() == 0)
{
return FALSE;
}
FILE *fp = NULL;
fp = fopen(m_filename,"wb");
fseek(fp,0,SEEK_END);
int slen = fwrite(buf, sizeof(char), len, fp);
fclose(fp);
if(slen < len)
{
return FALSE;
}
return TRUE;
}
BOOL CReadMp3File::Read_M_File_mp3() // TIME 播放时间 SNUM 采样数 RATE 采样率
{
return TRUE;
}
BOOL CReadMp3File::ReadFrameData_mp3(int begin_frame)
{
FILE *fp = NULL;
int i = 0;
if(begin_frame>m_frame_count||begin_frame<0)
{
begin_frame = 0;
}
fp = fopen(m_filename,"rb");
if(fp == NULL)
{
return FALSE;
}
for(i = begin_frame;i<m_frame_count;i++)
{
fseek(fp, m_frame_info[i-1].start_Index, SEEK_SET);
PLAY_DATA temp_data;
temp_data.ser = i;
temp_data.Size = m_frame_info[i-1].frame_Size;
temp_data.data = new char[temp_data.Size+1];
if(temp_data.data == NULL)
{
temp_data.data = new char[temp_data.Size+1];
}
memset(temp_data.data, 0, temp_data.Size+1);
fread(temp_data.data,sizeof(char), m_frame_info[i-1].frame_Size, fp);
if(ferror(fp)||feof(fp))
{
break;
}
EnterCriticalSection(&cs_read_queue);
g_read_data.push(temp_data);
LeaveCriticalSection(&cs_read_queue);
}
return TRUE;
}
FILE_INFO CReadMp3File::GetFileInfo()
{
FILE_INFO temp;
memset(&temp, 0, sizeof(FILE_INFO));
if(strlen(m_ID3V1Head.Title)!=0)
{
strcpy(temp.Title,m_ID3V1Head.Title);
}
else
{
strcpy(temp.Title,m_label_info.TIT2);
}
if(strlen(m_ID3V1Head.Artist)!=0)
{
strcpy(temp.Artist,m_ID3V1Head.Artist);
}
else
{
strcpy(temp.Artist,m_label_info.TPE1);
}
if(strlen(m_ID3V1Head.Album)!=0)
{
strcpy(temp.Album, m_ID3V1Head.Album);
}
else
{
strcpy(temp.Album, m_label_info.TALB);
}
if(strlen(m_ID3V1Head.Year)!=0)
{
strcpy(temp.Year, m_ID3V1Head.Year);
}
else
{
strcpy(temp.Year, m_label_info.TYER);
}
if(strlen(m_ID3V1Head.Comment)!=0)
{
strcpy(temp.Comment, m_ID3V1Head.Comment);
}
else
{
strcpy(temp.Comment,m_label_info.COMM);
}
temp.track = m_ID3V1Head.Track;
if(m_ID3V1Head.Genre<12)
{
strcpy(temp.Genre , Genre[m_ID3V1Head.Genre]);
}
else
{
strcpy(temp.Genre , "other");
}
temp.is_Protect = m_is_protect;
temp.file_size = ComputerFileSize(); //文件大小
temp.bitrate = m_aver_bitrate;
temp.sample_rate = m_sampling_rate; //(采样率)采样级别
temp.sample_per_frame = m_samples_per_Frame; //采样数
ComputerPlayTime();
temp.play_time = m_play_time; //播放时间
return temp;
}
vector<FRAM_INFO> &CReadMp3File::GetFrameInfoList()
{
return m_frame_info;
}
int CReadMp3File::GetFrameCount()
{
return m_frame_count;
}
char *CReadMp3File::GetIndexFrameByCount(char *buf,int index) //根据提供的第几个帧去获得该帧的内容
{
//vector<FRAM_INFO>::iterator plist;
char temp_buf[1500] = {0};
FILE *fp = NULL;
if(buf == NULL)
{
return NULL;
}
if(index>m_frame_count)
{
return NULL;
}
fp = fopen(m_filename,"rb");
if(fp == NULL)
{
return NULL;
}
fseek(fp, m_frame_info[index-1].start_Index, SEEK_SET);
fread(temp_buf,sizeof(char), m_frame_info[index-1].frame_Size, fp);
memcpy(buf, temp_buf,m_frame_info[index-1].frame_Size);
fclose(fp);
return buf;
}
/**************************私有内部函数********************************/
long CReadMp3File::ComputerFileSize()
{
FILE *fp = NULL;
long file = 0;
if( (fp = fopen( m_filename, "rb")) == NULL )
{
return 0;
}
fseek(fp, 0, SEEK_END);
file = ftell(fp);
fclose(fp);
return file;
}
bool CReadMp3File::ComputerPlayTime()
{
long filesize = 0 ;
if(m_is_vbr)
{
m_play_time = m_frame_count*m_samples_per_Frame/m_sampling_rate;
}
else
{
vector<FRAM_INFO>::iterator plist;
for(plist=m_frame_info.begin(); plist!=m_frame_info.end(); plist++)
{
filesize+=plist->frame_Size;
}
m_play_time = filesize/(1000*m_aver_bitrate)*8;
}
return true;
}
bool CReadMp3File::ReadLabelHeader() //读标签头信息
{
char buf[11] = {0};
FILE *read_label;
int result = 0;
if( (read_label = fopen( m_filename, "rb")) == NULL )
{
return false;
}
int read_len = 0;
read_len = fread(buf,sizeof(char),10,read_label);
fclose(read_label);
if(read_len < 10)
{
return false;
}
if(!((buf[0] == 'I'|| buf[0] == 'i')&&(buf[1] == 'D'|| buf[1] == 'd')&&(buf[2] == '3')))
{
return false;
}
memcpy(m_label_header.Header, &buf[0],3);
m_label_header.Ver = buf[3];
m_label_header.Revision = buf[4];
m_label_header.Flag = buf[5];
memcpy(m_label_header.Size, &buf[6], 4)
- 1
- 2
前往页