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 /orkbasecxx/audiofile | |
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
Diffstat (limited to 'orkbasecxx/audiofile')
-rw-r--r-- | orkbasecxx/audiofile/MediaChunkFile.cpp | 57 | ||||
-rw-r--r-- | orkbasecxx/audiofile/MediaChunkFile.h | 5 |
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 |