summaryrefslogtreecommitdiff
path: root/orkbasecxx/AudioCapture.cpp
diff options
context:
space:
mode:
authorGerald Begumisa <ben_g@users.sourceforge.net>2008-02-27 19:21:41 +0000
committerGerald Begumisa <ben_g@users.sourceforge.net>2008-02-27 19:21:41 +0000
commit0937742d2f5689c93efca3a5a56e8b36f81152c7 (patch)
treea0c817c8b45c888c88d020583a45a5ec65a225dd /orkbasecxx/AudioCapture.cpp
parent9483156b326918005bb42751cc0e37a16b3e3e41 (diff)
Added support for storage of stereo files - typically files containing 2 separate channels. Added the config.xml variable StereoRecording which needs to be set to true for this to work. Added another config.xml variable TapeNumChannels which should be set to 2 to test this. If TapeNumChannels is set to 1, default behaviour happens. Currently only 1 and 2 are the only supported values for TapeNumChannels.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@526 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/AudioCapture.cpp')
-rw-r--r--orkbasecxx/AudioCapture.cpp118
1 files changed, 111 insertions, 7 deletions
diff --git a/orkbasecxx/AudioCapture.cpp b/orkbasecxx/AudioCapture.cpp
index 706c657..77b9e95 100644
--- a/orkbasecxx/AudioCapture.cpp
+++ b/orkbasecxx/AudioCapture.cpp
@@ -22,33 +22,105 @@ AudioChunk::AudioChunk()
{
m_details.Clear();
m_pBuffer = NULL;
+ m_numChannels = 0;
+ m_pChannelAudio = NULL;
}
-AudioChunk::~AudioChunk()
+AudioChunk::AudioChunk(int numChannels)
{
- if(m_pBuffer)
+ m_details.Clear();
+ m_pBuffer = NULL;
+ m_pChannelAudio = NULL;
+ if(numChannels <= 0)
{
- free(m_pBuffer);
+ // Force at least one channel to resolve this possible
+ // error condition
+ numChannels = 1;
+ }
+
+ m_numChannels = numChannels;
+ m_pChannelAudio = (void**)calloc(m_numChannels, sizeof(void*));
+ m_details.m_channel = 100;
+
+ if(!m_pChannelAudio)
+ {
+ CStdString numBytesString;
+
+ numBytesString.Format("%d", m_numChannels*sizeof(void*));
+ throw("AudioChunk::AudioChunk(numChannels) could not allocate a buffer of size " + numBytesString);
}
}
+AudioChunk::~AudioChunk()
+{
+ FreeAll();
+}
+
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);
+ if(!m_numChannels)
+ {
+ 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);
+ }
+ else
+ {
+ string.Format("encoding:%d numBytesPerChannel:%u numChannels:%d ts:%u ats:%u seq:%u rtp-pt:%d",
+ m_details.m_encoding, m_details.m_numBytes, m_numChannels, m_details.m_timestamp,
+ m_details.m_arrivalTimestamp, m_details.m_sequenceNumber, m_details.m_rtpPayloadType);
+ }
}
-void* AudioChunk::CreateBuffer(AudioChunkDetails& details)
+void AudioChunk::FreeAll()
{
if(m_pBuffer)
{
free(m_pBuffer);
m_pBuffer = NULL;
}
+ if(m_numChannels)
+ {
+ for(int i = 0; i < m_numChannels; i++)
+ {
+ if(m_pChannelAudio[i])
+ {
+ free(m_pChannelAudio[i]);
+ }
+ }
+
+ free(m_pChannelAudio);
+ m_pChannelAudio = NULL;
+ }
+}
+
+void AudioChunk::CreateMultiChannelBuffers(AudioChunkDetails& details)
+{
+ if(!m_numChannels)
+ {
+ return;
+ }
+
+ for(int i = 0; i < m_numChannels; i++)
+ {
+ m_pChannelAudio[i] = calloc(details.m_numBytes, 1);
+ if(!m_pChannelAudio[i])
+ {
+ CStdString exception;
+
+ exception.Format("AudioChunk::CreateMultiChannelBuffers failed to calloc buffer of size:%d for channel:%d", details.m_numBytes, i);
+ throw(exception);
+ }
+ }
+}
+
+void* AudioChunk::CreateBuffer(AudioChunkDetails& details)
+{
+ FreeAll();
if(details.m_numBytes)
{
m_pBuffer = calloc(details.m_numBytes, 1);
+ CreateMultiChannelBuffers(details);
}
if (!m_pBuffer)
{
@@ -86,6 +158,38 @@ void AudioChunk::SetBuffer(void* pBuffer, AudioChunkDetails& details)
}
}
+void AudioChunk::SetBuffer(void* pBuffer, AudioChunkDetails& details, int chan)
+{
+ CStdString exception;
+ int chanIdx = 0;
+
+ if(chan > m_numChannels || chan < 1)
+ {
+ exception.Format("AudioChunk::SetBuffer: invalid channel %d", chan);
+ throw(exception);
+ }
+
+ chanIdx = chan - 1;
+ if(m_pChannelAudio[chanIdx])
+ {
+ free(m_pChannelAudio[chanIdx]);
+ m_pChannelAudio[chanIdx] = NULL;
+ }
+ if(details.m_numBytes && pBuffer)
+ {
+ m_pChannelAudio[chanIdx] = malloc(details.m_numBytes);
+ if(!m_pChannelAudio[chanIdx])
+ {
+ exception.Format("AudioChunk::SetBuffer: failed to allocate buffer of size:%d for channel:%d channelidx:%d", details.m_numBytes, chan, chanIdx);
+ throw(exception);
+ }
+ else
+ {
+ memcpy(m_pChannelAudio[chanIdx], pBuffer, details.m_numBytes);
+ }
+ }
+}
+
int AudioChunk::GetNumSamples()
{
switch(m_details.m_encoding)