summaryrefslogtreecommitdiff
path: root/orkaudio/BatchProcessing.cpp
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2005-10-20 13:40:58 +0000
committerHenri Herscher <henri@oreka.org>2005-10-20 13:40:58 +0000
commit7e1d63dd9fd149e4934bf77095c8610fac786b04 (patch)
tree5fe486a1b0300c3b84fb559107a868e5cc2c95da /orkaudio/BatchProcessing.cpp
parent467768fc956fc3e5a253373f26c71c681b31b6b8 (diff)
First checkin
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@2 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkaudio/BatchProcessing.cpp')
-rw-r--r--orkaudio/BatchProcessing.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/orkaudio/BatchProcessing.cpp b/orkaudio/BatchProcessing.cpp
new file mode 100644
index 0000000..6aa1600
--- /dev/null
+++ b/orkaudio/BatchProcessing.cpp
@@ -0,0 +1,107 @@
+/*
+ * Oreka -- A media capture and retrieval platform
+ *
+ * Copyright (C) 2005, orecx LLC
+ *
+ * http://www.orecx.com
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License.
+ * Please refer to http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include "ConfigManager.h"
+#include "BatchProcessing.h"
+#include "LogManager.h"
+#include "ace/OS_NS_unistd.h"
+#include "audiofile/LibSndFileFile.h"
+
+BatchProcessing BatchProcessing::m_batchProcessingSingleton;
+
+BatchProcessing::BatchProcessing()
+{
+ m_threadCount = 0;
+}
+
+
+BatchProcessing* BatchProcessing::GetInstance()
+{
+ return &m_batchProcessingSingleton;
+}
+
+void BatchProcessing::AddAudioTape(AudioTapeRef audioTapeRef)
+{
+ if (!m_audioTapeQueue.push(audioTapeRef))
+ {
+ // Log error
+ LOG4CXX_ERROR(LOG.batchProcessingLog, CStdString("BatchProcessing: queue full"));
+ }
+}
+
+void BatchProcessing::ThreadHandler(void *args)
+{
+ BatchProcessing* pBatchProcessing = BatchProcessing::GetInstance();
+ int threadId = 0;
+ {
+ MutexSentinel sentinel(pBatchProcessing->m_mutex);
+ threadId = pBatchProcessing->m_threadCount++;
+ }
+ CStdString threadIdString = IntToString(threadId);
+ LOG4CXX_DEBUG(LOG.batchProcessingLog, CStdString("Created thread #") + threadIdString);
+
+ for(;;)
+ {
+ try
+ {
+ AudioTapeRef audioTapeRef = pBatchProcessing->m_audioTapeQueue.pop();
+ CStdString threadIdString = IntToString(threadId);
+ LOG4CXX_INFO(LOG.batchProcessingLog, CStdString("Th") + threadIdString + " processing: " + audioTapeRef->GetIdentifier());
+
+ AudioFileRef fileRef = audioTapeRef->GetAudioFileRef();
+ fileRef->MoveOrig();
+ fileRef->Open(AudioFile::READ);
+
+ AudioChunkRef chunkRef;
+ AudioFileRef outFileRef;
+
+ switch(CONFIG.m_storageAudioFormat)
+ {
+ case AudioTape::FfUlaw:
+ outFileRef.reset(new LibSndFileFile(SF_FORMAT_ULAW | SF_FORMAT_WAV));
+ break;
+ case AudioTape::FfAlaw:
+ outFileRef.reset(new LibSndFileFile(SF_FORMAT_ALAW | SF_FORMAT_WAV));
+ break;
+ case AudioTape::FfGsm:
+ default:
+ outFileRef.reset(new LibSndFileFile(SF_FORMAT_GSM610 | SF_FORMAT_WAV));
+ }
+ CStdString file = audioTapeRef->GetPath() + audioTapeRef->GetIdentifier();
+ outFileRef->Open(file, AudioFile::WRITE);
+
+ while(fileRef->ReadChunkMono(chunkRef))
+ {
+ outFileRef->WriteChunk(chunkRef);
+ }
+
+ if(CONFIG.m_deleteNativeFile)
+ {
+ fileRef->Close();
+ fileRef->Delete();
+ CStdString threadIdString = IntToString(threadId);
+ LOG4CXX_INFO(LOG.batchProcessingLog, CStdString("Th") + threadIdString + " deleting native: " + audioTapeRef->GetIdentifier());
+ }
+ }
+ catch (CStdString& e)
+ {
+ LOG4CXX_ERROR(LOG.batchProcessingLog, CStdString("BatchProcessing: ") + e);
+ }
+ catch(...)
+ {
+ }
+
+ }
+}
+
+