/* * 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::ToString(CStdString& string) { string.Format("encoding:%d numBytes:%u ts:%u ats:%u seq:%u rtp-pt:%d ch:%u", m_details.m_encoding, m_details.m_numBytes, m_details.m_timestamp, m_details.m_arrivalTimestamp, m_details.m_sequenceNumber, m_details.m_rtpPayloadType, m_details.m_channel); } void* AudioChunk::CreateBuffer(AudioChunkDetails& details) { if(m_pBuffer) { free(m_pBuffer); m_pBuffer = NULL; } if(details.m_numBytes) { m_pBuffer = calloc(details.m_numBytes, 1); } if (!m_pBuffer) { CStdString numBytesString = IntToString(details.m_numBytes); throw("AudioChunk::AudioChunk: could not calloc a buffer of size:" + numBytesString); } else { m_details = details; } return m_pBuffer; } void AudioChunk::SetBuffer(void* pBuffer, AudioChunkDetails& details) { if(m_pBuffer) { free(m_pBuffer); m_pBuffer = NULL; m_details.m_numBytes = 0; } if(details.m_numBytes && pBuffer) { m_pBuffer = malloc(details.m_numBytes); if (!m_pBuffer) { CStdString numBytesString = IntToString(details.m_numBytes); throw("AudioChunk::AudioChunk: could not malloc a buffer of size:" + numBytesString); } else { memcpy(m_pBuffer, pBuffer, details.m_numBytes); m_details = details; } } } 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: CStdString msg; ToString(msg); throw(CStdString("AudioChunk::GetNumSamples(): unknown encoding. Chunk:") + msg); } } 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