summaryrefslogtreecommitdiff
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
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
-rw-r--r--orkbasecxx/Config.cpp2
-rw-r--r--orkbasecxx/Config.h3
-rw-r--r--orkbasecxx/audiofile/MediaChunkFile.cpp57
-rw-r--r--orkbasecxx/audiofile/MediaChunkFile.h5
4 files changed, 53 insertions, 14 deletions
diff --git a/orkbasecxx/Config.cpp b/orkbasecxx/Config.cpp
index 41d8771..199b301 100644
--- a/orkbasecxx/Config.cpp
+++ b/orkbasecxx/Config.cpp
@@ -44,6 +44,7 @@ Config::Config()
m_batchProcessingQueueSize = BATCH_PROCESSING_QUEUE_SIZE_DEFAULT;
m_batchProcessingEnhancePriority = BATCH_PROCESSING_ENHANCE_PRIORITY_DEFAULT;
m_deleteFailedCaptureFile = DELETE_FAILED_CAPTURE_FILE_DEFAULT;
+ m_captureFileBatchSizeKByte = CAPTURE_FILE_BATCH_SIZE_KBYTE_DEFAULT;
char hostname[40];
ACE_OS::hostname(hostname, 40);
@@ -84,6 +85,7 @@ void Config::Define(Serializer* s)
s->BoolValue(DELETE_FAILED_CAPTURE_FILE_PARAM, m_deleteFailedCaptureFile);
s->CsvValue(CAPTURE_PORT_FILTERS_PARAM, m_capturePortFilters);
s->CsvValue(TAPE_PROCESSORS_PARAM, m_tapeProcessors);
+ s->IntValue(CAPTURE_FILE_BATCH_SIZE_KBYTE_PARAM, m_captureFileBatchSizeKByte);
}
void Config::Validate()
diff --git a/orkbasecxx/Config.h b/orkbasecxx/Config.h
index 54a0787..09fe6a4 100644
--- a/orkbasecxx/Config.h
+++ b/orkbasecxx/Config.h
@@ -71,6 +71,8 @@
#define DELETE_FAILED_CAPTURE_FILE_DEFAULT false
#define CAPTURE_PORT_FILTERS_PARAM "CapturePortFilters"
#define TAPE_PROCESSORS_PARAM "TapeProcessors"
+#define CAPTURE_FILE_BATCH_SIZE_KBYTE_PARAM "CaptureFileBatchSizeKByte"
+#define CAPTURE_FILE_BATCH_SIZE_KBYTE_DEFAULT 4
class DLL_IMPORT_EXPORT_ORKBASE Config : public Object
{
@@ -111,6 +113,7 @@ public:
bool m_deleteFailedCaptureFile;
std::list<CStdString> m_capturePortFilters;
std::list<CStdString> m_tapeProcessors;
+ int m_captureFileBatchSizeKByte;
private:
log4cxx::LoggerPtr m_log;
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