www.pudn.com > audiocapture.zip > WaveFile.cpp, change:2001-04-20,size:2689b


//--------------------------------------------------------------------------- 
#include <vcl.h> 
#pragma hdrstop 
 
#include "WaveFile.h" 
 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
 
 
CWaveFile::CWaveFile(char *Nombre,WORD Frecuencia,WORD Resolucion,DWORD SizeData) 
{ 
  //Crea el fichero WAV destino. 
  m_HFile=CreateFile(Nombre, 
                     GENERIC_WRITE, 
                     0, 
                     NULL, 
                     CREATE_ALWAYS, 
                     FILE_ATTRIBUTE_NORMAL, 
                     NULL); 
 
  if(m_HFile==INVALID_HANDLE_VALUE) 
    throw("No se puede crear el fichero"); 
 
  m_SizeOfFile=0x00; 
  m_SizeWaveChunck=0x10; 
  m_WaveTypeFormat=0x01;  //PCM. 
  m_MonoStereo=0x01;      //Mono. 
  m_SampleRate=Frecuencia; 
  m_BitsSample=Resolucion; 
  m_BlockAlignment=m_BitsSample/8;   //Número de canales  * BitsSample/8 
  m_BytesSample=m_SampleRate*m_BlockAlignment; 
 
  //Por ahora cero. Al cerrar se calcula el valor real. 
  m_SizeOfDatos=0x00; 
 
  //Tamaño del bloque individual de datos. 
  m_SizeChunk=SizeData; 
 
  //Indica el número de chuncks de datos presentes en el WAV. 
  m_nDataChuncks=0; 
 
  //Cabecera Canónica. 
  WriteFile(m_HFile,"RIFF",4,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_SizeOfFile,4,&m_Escritos,NULL); 
  WriteFile(m_HFile,"WAVE",4,&m_Escritos,NULL); 
 
  //Formato de Datos. 
  WriteFile(m_HFile,"fmt ",4,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_SizeWaveChunck,4,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_WaveTypeFormat,2,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_MonoStereo,2,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_SampleRate,4,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_BytesSample,4,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_BlockAlignment,2,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_BitsSample,2,&m_Escritos,NULL); 
 
  //Comienzo del Bloque de Datos. 
  WriteFile(m_HFile,"data",4,&m_Escritos,NULL); 
  WriteFile(m_HFile,&m_SizeOfDatos,4,&m_Escritos,NULL); 
} 
 
CWaveFile::~CWaveFile() 
{ 
  bool ok; 
 
  //Asigna el tamaño del fichero en el segundo campo. Tamaño-8. 
  m_SizeOfFile=44+m_nDataChuncks*m_SizeChunk-8; 
  SetFilePointer(m_HFile,4,NULL,FILE_BEGIN); 
  WriteFile(m_HFile,&m_SizeOfFile,4,&m_Escritos,NULL); 
 
  //Asigna el Tamaño de los datos. 
  m_SizeOfDatos=m_nDataChuncks*m_SizeChunk; 
  SetFilePointer(m_HFile,40,NULL,FILE_BEGIN); 
  WriteFile(m_HFile,&m_SizeOfDatos,4,&m_Escritos,NULL); 
 
  CloseHandle(m_HFile); 
} 
 
void CWaveFile::AddSample(byte *Buffer) 
{ 
  //Datos. 
  WriteFile(m_HFile,Buffer,m_SizeChunk,&m_Escritos,NULL); 
 
  //Para calcular el tamaño de bloques. 
  m_nDataChuncks++; 
}