diff options
Diffstat (limited to 'orkbasecxx')
-rw-r--r-- | orkbasecxx/AudioCapture.cpp | 99 | ||||
-rw-r--r-- | orkbasecxx/AudioCapture.h | 64 |
2 files changed, 128 insertions, 35 deletions
diff --git a/orkbasecxx/AudioCapture.cpp b/orkbasecxx/AudioCapture.cpp index 1dd700a..e1c64c3 100644 --- a/orkbasecxx/AudioCapture.cpp +++ b/orkbasecxx/AudioCapture.cpp @@ -20,12 +20,8 @@ AudioChunk::AudioChunk() { - m_encoding = UnknownAudio; - m_timestamp = 0; - m_sequenceNumber = 0; - m_numBytes = 0; + m_details.Clear(); m_pBuffer = NULL; - m_sampleRate = 8000; } AudioChunk::~AudioChunk() @@ -36,12 +32,38 @@ AudioChunk::~AudioChunk() } } -void AudioChunk::SetBuffer(void* pBuffer, size_t numBytes, AudioEncodingEnum encoding, unsigned int timestamp, unsigned int sequenceNumber, unsigned int sampleRate) +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_numBytes = 0; + m_pBuffer = NULL; + m_details.m_numBytes = 0; } if(numBytes && pBuffer) { @@ -53,24 +75,21 @@ void AudioChunk::SetBuffer(void* pBuffer, size_t numBytes, AudioEncodingEnum enc } else { - m_numBytes = numBytes; memcpy(m_pBuffer, pBuffer, numBytes); - m_encoding = encoding; - m_timestamp = timestamp; - m_sequenceNumber = sequenceNumber; - m_sampleRate = sampleRate; + m_details = details; + m_details.m_numBytes = numBytes; } } } int AudioChunk::GetNumSamples() { - switch(m_encoding) + switch(m_details.m_encoding) { case PcmAudio: - return m_numBytes/2; + return m_details.m_numBytes/2; case AlawAudio: case UlawAudio: - return m_numBytes; + return m_details.m_numBytes; default: throw(CStdString("AudioChunk::GetNumSamples: unknown encoding")); } @@ -79,14 +98,14 @@ int AudioChunk::GetNumSamples() double AudioChunk::GetDurationSec() { int i = 0; - return ((double)GetNumSamples())/((double)m_sampleRate); + return ((double)GetNumSamples())/((double)m_details.m_sampleRate); } double AudioChunk::ComputeRms() { double rmsValue = 0; - if(m_encoding == PcmAudio) + if(m_details.m_encoding == PcmAudio) { for(int i=0; i<GetNumSamples(); i++) { @@ -100,13 +119,57 @@ double AudioChunk::ComputeRms() double AudioChunk::ComputeRmsDb() { double rmsDbValue = 10 * log10(1.0/32768.0); // default value, the lowest possible - if(m_encoding == PcmAudio) + if(m_details.m_encoding == PcmAudio) { rmsDbValue = 10 * log10(ComputeRms()/32768.0); } return rmsDbValue; } +AudioEncodingEnum AudioChunk::GetEncoding() +{ + return m_details.m_encoding; +} + +int AudioChunk::GetSampleRate() +{ + return m_details.m_sampleRate; +} + +AudioChunkDetails* AudioChunk::GetDetails() +{ + return &m_details; +} + +void AudioChunk::SetDetails(AudioChunkDetails* details) +{ + m_details = *details; +} + + +int AudioChunk::GetNumBytes() +{ + return m_details.m_numBytes; +} + +//================================ +AudioChunkDetails::AudioChunkDetails() +{ + Clear(); +} + +void AudioChunkDetails::Clear() +{ + m_marker = MEDIA_CHUNK_MARKER; + m_encoding = UnknownAudio; + m_timestamp = 0; + m_arrivalTimestamp = 0; + m_sequenceNumber = 0; + m_numBytes = 0; + m_sampleRate = 8000; + m_rtpPayloadType = -1; + m_channel = 0; // mono by default +} //================================= diff --git a/orkbasecxx/AudioCapture.h b/orkbasecxx/AudioCapture.h index 41b6130..4e6a53c 100644 --- a/orkbasecxx/AudioCapture.h +++ b/orkbasecxx/AudioCapture.h @@ -20,25 +20,52 @@ #include "boost/shared_ptr.hpp" -/** This class represents a piece of audio. -*/ + +typedef enum +{ + UnknownAudio = 0, + PcmAudio = 1, + AlawAudio = 2, + UlawAudio = 3, + InvalidAudio = 4 +} AudioEncodingEnum; + +/** + * Serialization friendly details struct + */ +#define MEDIA_CHUNK_MARKER 0x2A2A2A2A // corresponds to "****" + +class DLL_IMPORT_EXPORT AudioChunkDetails +{ +public: + AudioChunkDetails(); + void Clear(); + + int m_marker; + AudioEncodingEnum m_encoding; + unsigned int m_numBytes; + unsigned int m_timestamp; // usually relative timestamp measured in samples + unsigned int m_arrivalTimestamp; // usually unix timestamp of arrival + unsigned int m_sequenceNumber; + unsigned int m_sampleRate; + char m_rtpPayloadType; // -1 if none + unsigned char m_channel; // 0 if mono, 1 or 2 if stereo +}; + +/** + * This class represents a piece of audio. + */ class DLL_IMPORT_EXPORT AudioChunk { public: - typedef enum - { - UnknownAudio = 0, - PcmAudio = 1, - AlawAudio = 2, - UlawAudio = 3, - InvalidAudio = 4 - } AudioEncodingEnum; - AudioChunk(); ~AudioChunk(); + /** Allocate a new empty buffer */ + void* CreateBuffer(size_t numBytes, AudioChunkDetails& details); + /** Copy external buffer to internal buffer. Create internal buffer if necessary */ - void SetBuffer(void* pBuffer, size_t numBytes, AudioEncodingEnum, unsigned int timestamp = 0, unsigned int sequenceNumber = 0, unsigned int sampleRate = 8000); + void SetBuffer(void* pBuffer, size_t numBytes, AudioChunkDetails& details); /** Computes the Root-Mean-Square power value of the buffer */ double ComputeRms(); @@ -46,14 +73,17 @@ public: double ComputeRmsDb(); int GetNumSamples(); + int GetNumBytes(); + int GetSampleRate(); double GetDurationSec(); + AudioEncodingEnum GetEncoding(); + AudioChunkDetails* GetDetails(); + void SetDetails(AudioChunkDetails* details); - AudioEncodingEnum m_encoding; - unsigned int m_numBytes; void * m_pBuffer; - unsigned int m_timestamp; // usually: relative timestamp measured in samples - unsigned int m_sequenceNumber; - unsigned int m_sampleRate; + +private: + AudioChunkDetails m_details; }; typedef boost::shared_ptr<AudioChunk> AudioChunkRef; |