www.pudn.com > audiocapture.zip > GenWav.cpp, change:2001-04-18,size:2006b


//--------------------------------------------------------------------------- 
#include <vcl.h> 
#pragma hdrstop 
 
#include "GenWav.h" 
 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
 
 
TGenWav::TGenWav(char *Nombre,DWORD FrecMuestreo,WORD Resolucion) 
{ 
  m_Indice=0; 
 
  //Configuración de Onda. 
  m_WaveFormat.wFormatTag=WAVE_FORMAT_PCM; 
  m_WaveFormat.nChannels=1; 
  m_WaveFormat.nSamplesPerSec=FrecMuestreo; 
  m_WaveFormat.wBitsPerSample=Resolucion; 
  m_WaveFormat.nBlockAlign=m_WaveFormat.nChannels*m_WaveFormat.wBitsPerSample/8; 
  m_WaveFormat.nAvgBytesPerSec=m_WaveFormat.wBitsPerSample*m_WaveFormat.nBlockAlign; 
 
  //Configuración del Stream. 
  m_InfoStream.fccType=streamtypeAUDIO; 
  m_InfoStream.dwScale=m_WaveFormat.nBlockAlign; 
  m_InfoStream.dwStart=0; 
  m_InfoStream.dwSampleSize=m_WaveFormat.nBlockAlign; 
 
  //Incrementa la referencia a AVI Lib. 
  AVIFileInit(); 
 
  //Crea el fichero AVI. 
  hr=AVIFileOpen(&m_HFile,Nombre,OF_WRITE|OF_CREATE|OF_SHARE_EXCLUSIVE,NULL); 
  if(hr!=AVIERR_OK) 
    throw("No puede crearse un fichero de audio"); 
 
  //Crea el Stream de Audio. 
  hr=AVIFileCreateStream(m_HFile,&m_AudioStream,&m_InfoStream); 
  if(hr!=AVIERR_OK) 
    throw("No puede crearse un stream de audio"); 
} 
 
TGenWav::~TGenWav() 
{ 
  //Cierra el Stream 
  if(m_AudioStream) 
    AVIStreamRelease(m_AudioStream); 
 
  //Cierra el AVI. 
  AVIFileRelease(m_HFile); 
 
  //Decrementa el contador de referencias. 
  AVIFileExit(); 
} 
 
bool TGenWav::AddAudioBlock(BYTE * Block, WORD Size) 
{ 
  //Añade el bloque de audio al Stream. 
  //Establece el formato del Stream de Audio. 
  if(m_Indice==0) 
   { 
    hr=AVIStreamSetFormat(m_AudioStream,0,&m_WaveFormat,sizeof(WAVEFORMATEX)); 
    if(hr!=0) 
      throw("No puede establecerse el formato del stream de audio"); 
   } 
 
  hr=AVIStreamWrite(m_AudioStream,m_Indice,1,Block,Size,AVIIF_KEYFRAME,NULL,NULL); 
  m_Indice++; 
 
  return (hr==0); 
}