www.pudn.com > ConcatWaveFiles_demo.zip > Wave.cpp


 // Wave.cpp: implementation of the CWave class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Wave.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CWave::CWave(string _fileName){ 
	extraParam = NULL; 
	wave=NULL; 
	fileName=_fileName; 
	extraParamLength = 0; 
	fact.samplesNumber=-1; 
	HANDLE hF = CreateFile(fileName.data(),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); 
	if (hF==INVALID_HANDLE_VALUE){ 
		LPVOID lpMsgBuf; 
		FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
				NULL, 
				GetLastError(), 
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
				(LPTSTR) &lpMsgBuf, 
				0, 
				NULL ); 
		string errorMsg((LPTSTR) lpMsgBuf); 
		LocalFree( lpMsgBuf ); 
		throw errorMsg.data(); 
	} 
	DWORD read; 
	ReadFile(hF,(LPVOID)&riff,RIFF_SIZE,&read,NULL); 
	ReadFile(hF,(LPVOID)&fmt,FMT_SIZE,&read,NULL); 
	if (fmt.wFormatTag!=1){ 
		ReadFile(hF,(LPVOID)&extraParamLength,2,&read,NULL); //2 bytes 
		if (extraParamLength>0){ 
			extraParam=new BYTE[extraParamLength]; 
			ReadFile(hF,(LPVOID)extraParam,extraParamLength,&read,NULL);  
		} 
	} 
	 
	ReadFile(hF,(LPVOID)&data.dataID,4,&read,NULL); 
	if (data.dataID[0]=='f' && 
		data.dataID[1]=='a' && 
		data.dataID[2]=='c' && 
		data.dataID[3]=='t'){ 
		ReadFile(hF,(LPVOID)&fact,FACT_SIZE,&read,NULL); 
		ReadFile(hF,(LPVOID)&data,DATA_SIZE,&read,NULL); 
	} 
	else 
		ReadFile(hF,(LPVOID)&data.dataSIZE,4,&read,NULL); 
	wave = new BYTE[data.dataSIZE]; 
	ReadFile(hF,(LPVOID)wave,data.dataSIZE,&read,NULL); 
	CloseHandle(hF); 
} 
CWave::CWave(){ 
	extraParam = NULL; 
	wave=NULL; 
	fileName=""; 
	fact.samplesNumber=-1; 
} 
CWave::CWave(const CWave& w){ 
	init(w); 
} 
CWave& CWave::operator= (const CWave &w){ 
	init(w); 
	return *this; 
} 
CWave::~CWave(){ 
	if (extraParam) 
		delete[] extraParam; 
	if (wave) 
		delete[] wave; 
} 
 
CWave CWave::operator+ (const CWave &w) const{ 
	if (fmt.wFormatTag!=w.fmt.wFormatTag) 
		throw "Can't concatenate waves with different format tags"; 
	CWave ret_val; 
	ret_val.fmt = w.fmt; 
	ret_val.riff = w.riff; 
	ret_val.data = w.data; 
	ret_val.data.dataSIZE= data.dataSIZE+w.data.dataSIZE; 
 
	  
	ret_val.extraParamLength = w.extraParamLength; 
	ret_val.extraParam = w.extraParam; 
	ret_val.wave = new BYTE[ret_val.data.dataSIZE]; 
	memcpy(ret_val.wave,wave,data.dataSIZE); 
	memcpy(ret_val.wave+data.dataSIZE,w.wave,w.data.dataSIZE); 
 
	string folder = getFileFolder(fileName); 
	string title1 = getFileTitle(fileName); 
	string title2 = getFileTitle(w.fileName); 
	 
	 
	ret_val.fileName = folder; 
	ret_val.fileName.append(title1); 
	ret_val.fileName.append(title2); 
	ret_val.fileName.append(".wav"); 
 
	return ret_val; 
} 
 
 
 
void CWave::init(const CWave& w){ 
	fmt = w.fmt; 
	riff = w.riff; 
	data = w.data; 
	fact = w.fact; 
	fileName = w.fileName; 
 
	extraParamLength = w.extraParamLength; 
	extraParam = w.extraParam; 
	wave = new BYTE[data.dataSIZE]; 
	memcpy(wave,w.wave,data.dataSIZE); 
	 
	 
} 
 
 
void CWave::saveToFile(){ 
	HANDLE hFile = CreateFile(fileName.data(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 
	DWORD written; 
	WriteFile(hFile,(LPCVOID)&riff,RIFF_SIZE,&written,NULL); 
	WriteFile(hFile,(LPCVOID)&fmt,FMT_SIZE,&written,NULL); 
	if (fmt.wFormatTag>1){ 
		WriteFile(hFile,(LPCVOID)&extraParamLength,2,&written,NULL); 
		if (extraParamLength>0) 
			WriteFile(hFile,(LPCVOID)extraParam,extraParamLength,&written,NULL); 
	} 
	if (fact.samplesNumber>-1){ 
		WriteFile(hFile,(LPCVOID)"fact",4,&written,NULL); 
		WriteFile(hFile,(LPCVOID)&fact,FACT_SIZE,&written,NULL); 
	} 
	WriteFile(hFile,(LPCVOID)&data,DATA_SIZE,&written,NULL); 
	WriteFile(hFile,(LPCVOID)wave,data.dataSIZE,&written,NULL); 
 
	CloseHandle(hFile); 
} 
 
string CWave::getFileName(){ 
	return fileName; 
} 
 
void CWave::setFileName(string _fileName){ 
 	fileName=_fileName; 
} 
 
string CWave::getFileFolder(string fullPath) 
{ 
	string::size_type last= fullPath.find_last_of("\\"); 
	if (last==string::npos) 
		return ""; 
	char* buffer = new char[fullPath.size()]; 
	memset(buffer,0,fullPath.size()); 
	string::size_type copied = fullPath.copy(buffer,last+1); 
 
	string folder(buffer); 
	delete[] buffer; 
	return folder; 
} 
 
string CWave::getFileTitle(string fullPath){ 
	int begin= fullPath.find_last_of("\\"); 
	if (begin ==string::npos) 
		begin=-1; 
	string::size_type end= fullPath.find_last_of("."); 
	 
	char* buffer = new char[end-begin]; 
	memset(buffer,0,end-begin); 
	fullPath.copy(buffer,end-begin-1,begin+1); 
	string title(buffer); 
	delete[] buffer; 
	return title; 
}