summaryrefslogtreecommitdiff
path: root/orkbasecxx/audiofile
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-09-21 19:24:22 +0000
committerHenri Herscher <henri@oreka.org>2006-09-21 19:24:22 +0000
commit6234299e5a3db9393b3f000854e6c1c0ac3e2256 (patch)
tree2c37e7d4695ffffbd18de4975c277a0660de4270 /orkbasecxx/audiofile
parent4b30474b50b5282705eabe481b850e0bf80bcfae (diff)
Capture Batch Size now configurable. This makes it possible to control how much data will be buffered in RAM for an individual capture before it is written to disk in the media capture file (mcf).
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@335 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/audiofile')
-rw-r--r--orkbasecxx/audiofile/MediaChunkFile.cpp57
-rw-r--r--orkbasecxx/audiofile/MediaChunkFile.h5
2 files changed, 48 insertions, 14 deletions
diff --git a/orkbasecxx/audiofile/MediaChunkFile.cpp b/orkbasecxx/audiofile/MediaChunkFile.cpp
index 47b2e8b..d750399 100644
--- a/orkbasecxx/audiofile/MediaChunkFile.cpp
+++ b/orkbasecxx/audiofile/MediaChunkFile.cpp
@@ -10,7 +10,9 @@
* Please refer to http://www.gnu.org/copyleft/gpl.html
*
*/
+#pragma warning( disable: 4786 ) // disables truncated symbols in browse-info warning
+#include "ConfigManager.h"
#include "MediaChunkFile.h"
#define MAX_CHUNK_SIZE 100000
@@ -22,6 +24,8 @@ MediaChunkFile::MediaChunkFile()
m_mode = READ;
m_numChunksWritten = 0;
m_sampleRate = 0;
+
+ m_chunkQueueDataSize = 0;
}
MediaChunkFile::~MediaChunkFile()
@@ -34,11 +38,38 @@ void MediaChunkFile::Close()
{
if(m_stream)
{
+ FlushToDisk();
ACE_OS::fclose(m_stream);
m_stream = NULL;
}
}
+bool MediaChunkFile::FlushToDisk()
+{
+ bool writeError = false;
+ while(m_chunkQueue.size() > 0)
+ {
+ AudioChunkRef tmpChunk = m_chunkQueue.front();
+ m_chunkQueue.pop();
+ int tmp = sizeof(AudioChunkDetails);
+ unsigned int numWritten = ACE_OS::fwrite(tmpChunk->GetDetails(), sizeof(AudioChunkDetails), 1, m_stream);
+ if(numWritten != 1)
+ {
+ writeError = true;
+ break;
+ }
+ numWritten = ACE_OS::fwrite(tmpChunk->m_pBuffer, sizeof(char), tmpChunk->GetNumBytes(), m_stream);
+ if(numWritten != tmpChunk->GetNumBytes())
+ {
+ writeError = true;
+ break;
+ }
+ }
+ m_chunkQueueDataSize = 0;
+ return writeError;
+}
+
+
void MediaChunkFile::WriteChunk(AudioChunkRef chunkRef)
{
if(chunkRef.get() == NULL)
@@ -50,27 +81,25 @@ void MediaChunkFile::WriteChunk(AudioChunkRef chunkRef)
return;
}
- unsigned int numWritten = 0;
bool writeError = false;
- if (m_stream)
+
+ if(m_chunkQueueDataSize < (CONFIG.m_captureFileBatchSizeKByte*1024))
{
- int tmp = sizeof(AudioChunkDetails);
- numWritten = ACE_OS::fwrite(chunkRef->GetDetails(), sizeof(AudioChunkDetails), 1, m_stream);
- if(numWritten != 1)
+ AudioChunk* pChunk = chunkRef.get();
+ m_chunkQueueDataSize += pChunk->GetNumBytes();
+ m_chunkQueue.push(chunkRef);
+ }
+ else
+ {
+ if (m_stream)
{
- writeError = true;
+ writeError = FlushToDisk();
}
- numWritten = ACE_OS::fwrite(chunkRef->m_pBuffer, sizeof(char), chunkRef->GetNumBytes(), m_stream);
- if(numWritten != chunkRef->GetNumBytes())
+ else
{
- writeError = true;
+ throw(CStdString("Write attempt on unopened file:")+ m_filename);
}
}
- else
- {
- throw(CStdString("Write attempt on unopened file:")+ m_filename);
- }
-
if (writeError)
{
throw(CStdString("Could not write to file:")+ m_filename);
diff --git a/orkbasecxx/audiofile/MediaChunkFile.h b/orkbasecxx/audiofile/MediaChunkFile.h
index e60a3fe..84c403b 100644
--- a/orkbasecxx/audiofile/MediaChunkFile.h
+++ b/orkbasecxx/audiofile/MediaChunkFile.h
@@ -14,6 +14,7 @@
#ifndef __MEDIACHUNKFILE_H__
#define __MEDIACHUNKFILE_H__
+#include <queue>
#include "audiofile/AudioFile.h"
@@ -32,8 +33,12 @@ public:
CStdString GetExtension();
protected:
+ bool FlushToDisk();
FILE* m_stream;
+
+ size_t m_chunkQueueDataSize;
+ std::queue<AudioChunkRef> m_chunkQueue;
};
#endif