/* * Oreka -- A media capture and retrieval platform * * Copyright (C) 2005, orecx LLC * * http://www.orecx.com * * This program is free software, distributed under the terms of * the GNU General Public License. * Please refer to http://www.gnu.org/copyleft/gpl.html * */ #define _WINSOCKAPI_ // prevents the inclusion of winsock.h #include "Utils.h" #include "math.h" #include "AudioCapture.h" AudioChunk::AudioChunk() { m_details.Clear(); m_pBuffer = NULL; } AudioChunk::~AudioChunk() { if(m_pBuffer) { free(m_pBuffer); } } void* AudioChunk::CreateBuffer(size_t numBytes, AudioChunkDetails& details) { if(m_pBuffer) { free(m_pBuffer); m_pBuffer = NULL; m_details.m_numBytes = 0; } if(numBytes) { m_pBuffer = calloc(numBytes, 1); } if (!m_pBuffer) { CStdString numBytesString = IntToString(numBytes); throw("AudioChunk::AudioChunk: could not calloc a buffer of size:" + numBytesString); } else { m_details = details; m_details.m_numBytes = numBytes; } return m_pBuffer; } void AudioChunk::SetBuffer(void* pBuffer, size_t numBytes, AudioChunkDetails& details) { if(m_pBuffer) { free(m_pBuffer); m_pBuffer = NULL; m_details.m_numBytes = 0; } if(numBytes && pBuffer) { m_pBuffer = malloc(numBytes); if (!m_pBuffer) { CStdString numBytesString = IntToString(numBytes); throw("AudioChunk::AudioChunk: could not malloc a buffer of size:" + numBytesString); } else { memcpy(m_pBuffer, pBuffer, numBytes); m_details = details; m_details.m_numBytes = numBytes; } } } int AudioChunk::GetNumSamples() { switch(m_details.m_encoding) { case PcmAudio: return m_details.m_numBytes/2; case AlawAudio: case UlawAudio: return m_details.m_numBytes; default: throw(CStdString("AudioChunk::GetNumSamples: unknown encoding")); } } double AudioChunk::GetDurationSec() { int i = 0; return ((double)GetNumSamples())/((double)m_details.m_sampleRate); } double AudioChunk::ComputeRms() { double rmsValue = 0; if(m_details.m_encoding == PcmAudio) { for(int i=0; i