summaryrefslogtreecommitdiff
path: root/orkbasecxx
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-01-20 22:47:56 +0000
committerHenri Herscher <henri@oreka.org>2006-01-20 22:47:56 +0000
commite918c412e63769d1db155e1314bb384e092216ec (patch)
tree7597fcbe70de51963f03fd50668420a2069030f0 /orkbasecxx
parente07f34274b8912f773993ed96624242115440a3b (diff)
AudioChunks now contain a "details" class that can be easily serializable.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@121 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx')
-rw-r--r--orkbasecxx/AudioCapture.cpp99
-rw-r--r--orkbasecxx/AudioCapture.h64
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;