diff options
author | Henri Herscher <henri@oreka.org> | 2006-09-21 19:24:22 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2006-09-21 19:24:22 +0000 |
commit | 6234299e5a3db9393b3f000854e6c1c0ac3e2256 (patch) | |
tree | 2c37e7d4695ffffbd18de4975c277a0660de4270 | |
parent | 4b30474b50b5282705eabe481b850e0bf80bcfae (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.cpp | 2 | ||||
-rw-r--r-- | orkbasecxx/Config.h | 3 | ||||
-rw-r--r-- | orkbasecxx/audiofile/MediaChunkFile.cpp | 57 | ||||
-rw-r--r-- | orkbasecxx/audiofile/MediaChunkFile.h | 5 |
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 |