📄 ywavproc_t.h
字号:
//////////////////////////////////////////////////////////////////////
// yWavProc_T.h: interface for the yWavProc_T class.
//
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
////////// EDITED BY YORK //////////hiding in my body, your blood//////
///////////////////////////////////////////////////////////////////////
#ifndef _Tmpl_WvProc
#define _Tmpl_WvProc
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
using namespace std;
typedef struct{
//WAVE_FROMAT_PCM(=1) WORD
short wFormatTag;
// 1 OR 2 WORD
short nChannels;
// 采样率(单位-赫兹)DWORD
int nSamplesPerSec;
//平均传输率(=nSamplesPerSec*nBlockAlign) DWORD
int nAvgBytesPerSec;
//每个采样点字节数(nChannels*nBitsPerSample/8) DWORD
short nBlockAlign;
//每个采样点位数 WORD
short wBitsPerSample;
//附加信息字节数(通常为零)WORD
short cbSize;
}WAVEFORMATEX_T;
typedef struct {
char RIFF_c[4]; //="RIFF";
int nChunkSize; //文件大小减8(字节);DWORD
char WAVE_c[4]; //="WAVE";
char fmt_c[4]; //="fmt ";
int nFmtSize; //格式块的大小;DWORD
WAVEFORMATEX_T* pWAVEF;
char data_c[4]; //="data";
int nWaveSize; //波形文件大小;DWORD
}WAVEHEAD_T;
template <class xType> class yWavProc_T
{
private:
//save the wave data.
xType * c_pWaveData;
//save the wave head information
WAVEHEAD_T * c_pWaveHead;
//indicate the number of the data.
int c_nDataNum;
public:
//Function: get the wave data
//argument: the buffer pointer of the buffer
//attention: you need not allocate the memory space for the pointer
// but you DO NEED DELETE the pointer bcz the function new it;
int c_GetData( xType *& );
//Function: get the wave data
//argument: the buffer pointer of the buffer
//attention: you need not allocate the memory space for the pointer
// but you DO NEED DELETE the pointer bcz the function new it;
int c_GetData( vector<xType> & );
//Function: overload save data from a buffer to a special file
//argument: first-> special file name;
// second-> begin position of buffer
// third-> end position of buffer
void c_SaveWav(string,int,int);
//Function: overload save data from a buffer to a special file
//argument: first-> special segment point pair vector;
// second-> special file name
void c_SaveWav(vector<pair<int,int> > &, string);
//Function: overload save data from a buffer to a special file
//argument: first-> special data vector for save;
// second-> special file name
void c_SaveWav(vector<xType>, string);
void c_SaveWav( xType*& , int, string );
//Function: not pass test
//argument:
bool c_GetHeadInfo(WAVEHEAD_T* &);
//Function: not pass test
//argument:
bool c_Get_wave_format(WAVEFORMATEX_T &);
//Function : open a wave file
//Argument : a string file name
//Return : the number of samples
int c_OpenWav(string const);
public:
//Function:
//argument:
yWavProc_T(string const);
yWavProc_T():c_pWaveHead(0),c_pWaveData(0){ };
virtual ~yWavProc_T( ){
if( c_pWaveHead )
delete c_pWaveHead->pWAVEF;
delete c_pWaveHead;
delete[] c_pWaveData;
};
};
template <class xType>
int yWavProc_T< xType >::c_GetData(xType* &f_pWvData)
{
// delete[] f_pWvData;
f_pWvData = new xType[c_nDataNum];
for(int i_nX=0;i_nX<c_nDataNum;i_nX++)
{
f_pWvData[i_nX]=c_pWaveData[i_nX];
}
return c_nDataNum;
}
template <class xType>
int yWavProc_T< xType >::c_GetData(vector<xType> &f_vWvData)
{
f_vWvData.clear();
f_vWvData.assign( c_pWaveData, c_pWaveData + c_nDataNum );
return c_nDataNum;
}
template <class xType>
int yWavProc_T<xType>::c_OpenWav(const string i_sFileName)
{
ifstream i_OpFile(i_sFileName.c_str(),ios::binary);
if(!i_OpFile)
{
cout<<"u havent give me a file name, string is empty!"<<endl;
c_pWaveHead = 0;
c_pWaveData = 0;
return 0;
}
c_pWaveHead=new WAVEHEAD_T;
i_OpFile.read((c_pWaveHead->RIFF_c),4);
i_OpFile.read((char*)&(c_pWaveHead->nChunkSize),4);
i_OpFile.read((c_pWaveHead->WAVE_c),4);
i_OpFile.read((c_pWaveHead->fmt_c),4);
i_OpFile.read((char*)&(c_pWaveHead->nFmtSize),4);
c_pWaveHead->pWAVEF = new WAVEFORMATEX_T;
i_OpFile.read((char*)c_pWaveHead->pWAVEF,c_pWaveHead->nFmtSize);
i_OpFile.read((c_pWaveHead->data_c),4);
i_OpFile.read((char*)&(c_pWaveHead->nWaveSize),4);
c_nDataNum = (c_pWaveHead->nWaveSize)/(c_pWaveHead->pWAVEF->wBitsPerSample/8);
char* i_pWaveData = new char[c_pWaveHead->nWaveSize];
c_pWaveData = new xType[c_nDataNum];
i_OpFile.read(i_pWaveData,c_pWaveHead->nWaveSize);
i_OpFile.close();
/*
*/
int i_nFlag = c_pWaveHead->pWAVEF->wBitsPerSample/8;
int i_J;
switch (i_nFlag)
{
case 1:
for(i_J=0;i_J<c_nDataNum;i_J++)
{
c_pWaveData[i_J]=(xType)(*(unsigned char*)(i_pWaveData+i_J)-128);
}
break;
case 2:
for(i_J=0;i_J<c_nDataNum;i_J++)
{
c_pWaveData[i_J]=(xType)(*(short*)(i_pWaveData+2*i_J));
}
break;
case 4:
for(i_J=0;i_J<c_nDataNum;i_J++)
{
c_pWaveData[i_J]=(xType)(*(int*)(i_pWaveData+4*i_J));
}
break;
default:
cout<<"err occur, unknown type for open"<<endl;
}
delete[] i_pWaveData;
return c_nDataNum;
}
template <class xType>
yWavProc_T<xType>::yWavProc_T(const string f_sFileName):c_pWaveHead(0),c_pWaveData(0)
{
c_OpenWav( f_sFileName );
/*
ifstream i_OpFile(i_sFileName.c_str(),ios::binary);
if(!i_OpFile)
{
cout<<"u havent give me a file name, string is empty!"<<endl;
exit(0);
}
c_pWaveHead=new WAVEHEAD_T;
i_OpFile.read((c_pWaveHead->RIFF_c),4);
i_OpFile.read((char*)&(c_pWaveHead->nChunkSize),4);
// c_pWaveHead->nChunkSize -= 4; ///bcz itself occupy 4 bytes
i_OpFile.read((c_pWaveHead->WAVE_c),4);
i_OpFile.read((c_pWaveHead->fmt_c),4);
i_OpFile.read((char*)&(c_pWaveHead->nFmtSize),4);
c_pWaveHead->pWAVEF = new WAVEFORMATEX_T;
i_OpFile.read((char*)c_pWaveHead->pWAVEF,c_pWaveHead->nFmtSize);
i_OpFile.read((c_pWaveHead->data_c),4);
i_OpFile.read((char*)&(c_pWaveHead->nWaveSize),4);
c_nDataNum = (c_pWaveHead->nWaveSize)/(c_pWaveHead->pWAVEF->wBitsPerSample/8);
char* i_pWaveData = new char[c_pWaveHead->nWaveSize];
c_pWaveData = new xType[c_nDataNum];
i_OpFile.read(i_pWaveData,c_pWaveHead->nWaveSize);
i_OpFile.close();
int i_nFlag = c_pWaveHead->pWAVEF->wBitsPerSample/8;
int i_J;
switch (i_nFlag)
{
case 1:
for(i_J=0;i_J<c_nDataNum;i_J++)
{
c_pWaveData[i_J]=(xType)(*(unsigned char*)(i_pWaveData+i_J)-128);
}
break;
case 2:
for(i_J=0;i_J<c_nDataNum;i_J++)
{
c_pWaveData[i_J]=(xType)(*(short*)(i_pWaveData+2*i_J));
}
break;
case 4:
for(i_J=0;i_J<c_nDataNum;i_J++)
{
c_pWaveData[i_J]=(xType)(*(int*)(i_pWaveData+4*i_J));
}
break;
default:
cout<<"err occur, unknown type for open"<<endl;
}
delete[] i_pWaveData;
*/
}
template <class xType>
void yWavProc_T< xType >::c_SaveWav(string i_sFName,int i_nHead=0,int i_nEnd=0)
{
if(i_nEnd==0||i_nEnd<=i_nHead)
i_nEnd=c_nDataNum;
ofstream i_SvFile(i_sFName.c_str(),ios::out|ios::binary);
if(! i_SvFile)
{
cerr<<"cant open "<<endl;
exit(-1);
}
//write wave head infomation.
i_SvFile.write("RIFF",4);
int i_nFlag=c_pWaveHead->pWAVEF->wBitsPerSample/8;
int i_nChunkSize = c_pWaveHead->nFmtSize+(i_nEnd-i_nHead)*i_nFlag+20;
i_SvFile.write((char*)&i_nChunkSize,4);
i_SvFile.write("WAVE",4);
i_SvFile.write("fmt ",4);
i_SvFile.write((char*)&(c_pWaveHead->nFmtSize),4);
i_SvFile.write((char*)c_pWaveHead->pWAVEF,c_pWaveHead->nFmtSize);
i_SvFile.write("data",4);
int i_nWaveSize;
//write wave data.
int i_I;
unsigned char i_ucTmp;
short i_sTmp;
int i_iTmp;
switch(i_nFlag)
{
case 1:
i_nWaveSize = (i_nEnd-i_nHead);//wave data size in byte;
i_SvFile.write((char*)&i_nWaveSize,4);
for(i_I=i_nHead;i_I<i_nEnd;i_I++)
{
i_ucTmp=(unsigned char)(c_pWaveData[i_I])+128;
i_SvFile.write((char*)&(i_ucTmp),1);
}
break;
case 2:
i_nWaveSize = (i_nEnd-i_nHead)*2;//wave data size in byte;
i_SvFile.write((char*)&i_nWaveSize,4);
for(i_I=i_nHead; i_I<i_nEnd; i_I++)
{
i_sTmp=(short)(c_pWaveData[i_I]);
i_SvFile.write((char*)&i_sTmp,2);
}
break;
case 4:
i_nWaveSize = (i_nEnd-i_nHead)*4;//wave data size in byte;
i_SvFile.write((char*)&i_nWaveSize,4);
for(i_I=i_nHead; i_I<i_nEnd; i_I++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -