From acbda29f838280ba98cf9e9e539e9d8a6e8fc6ad Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 9 Jun 2006 15:07:31 +0000 Subject: Added Om aka Graph aka god knows what git-svn-id: http://svn.drobilla.net/lad/grauph@9 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/PostProcessor.cpp | 122 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/engine/PostProcessor.cpp (limited to 'src/engine/PostProcessor.cpp') diff --git a/src/engine/PostProcessor.cpp b/src/engine/PostProcessor.cpp new file mode 100644 index 00000000..65b92015 --- /dev/null +++ b/src/engine/PostProcessor.cpp @@ -0,0 +1,122 @@ +/* This file is part of Om. Copyright (C) 2006 Dave Robillard. + * + * Om is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Om is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "PostProcessor.h" +#include +#include +#include +#include "Om.h" +#include "OmApp.h" +#include "Event.h" +#include "util/Queue.h" +#include "Maid.h" + + +using std::cerr; using std::cout; using std::endl; + +namespace Om { + +bool PostProcessor::m_process_thread_exit_flag = false; + + +PostProcessor::PostProcessor(size_t queue_size) +: m_events(queue_size), + m_thread_exists(false), + m_semaphore(0) +{ +} + + +PostProcessor::~PostProcessor() +{ + stop(); +} + + +/** Start the process thread. + */ +void +PostProcessor::start() +{ + cout << "[PostProcessor] Starting." << endl; + + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 1500000); + + pthread_create(&m_process_thread, &attr, process_events, this); + m_thread_exists = true; +} + + +/** Stop the process thread. + */ +void +PostProcessor::stop() +{ + if (m_thread_exists) { + m_process_thread_exit_flag = true; + pthread_cancel(m_process_thread); + pthread_join(m_process_thread, NULL); + m_thread_exists = false; + } +} + + +/** Signal the PostProcessor to process all pending events. + */ +void +PostProcessor::signal() +{ + m_semaphore.post(); +} + + +void* +PostProcessor::process_events(void* osc_processer) +{ + PostProcessor* me = (PostProcessor*)osc_processer; + return me->m_process_events(); +} + + +/** OSC message processing thread. + */ +void* +PostProcessor::m_process_events() +{ + Event* ev = NULL; + + while (true) { + m_semaphore.wait(); + + if (m_process_thread_exit_flag) + break; + + while (!m_events.is_empty()) { + ev = m_events.pop(); + assert(ev != NULL); + ev->post_process(); + om->maid()->push(ev); + } + } + + cout << "[PostProcessor] Exiting post processor thread." << endl; + + return NULL; +} + +} // namespace Om -- cgit v1.2.1