|  | /*
 * Carla Engine Thread
 * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com>
 *
 * This program 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
 * any later version.
 *
 * This program 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 more details.
 *
 * For a full copy of the GNU General Public License see the COPYING file
 */
#include "carla_engine.hpp"
#include "carla_plugin.hpp"
CARLA_BACKEND_START_NAMESPACE
CarlaEngineThread::CarlaEngineThread(CarlaEngine* const engine_, QObject* const parent)
    : QThread(parent),
      engine(engine_)
{
    qDebug("CarlaEngineThread::CarlaEngineThread(%p, %p)", engine, parent);
    CARLA_ASSERT(engine);
    m_stopNow = true;
}
CarlaEngineThread::~CarlaEngineThread()
{
    qDebug("CarlaEngineThread::~CarlaEngineThread()");
    CARLA_ASSERT(m_stopNow);
}
void CarlaEngineThread::startNow()
{
    qDebug("CarlaEngineThread::startNow()");
    CARLA_ASSERT(m_stopNow);
    m_stopNow = false;
    start(QThread::HighPriority);
}
void CarlaEngineThread::stopNow()
{
    qDebug("CarlaEngineThread::stopNow()");
    if (m_stopNow)
        return;
    m_stopNow = true;
    const ScopedLocker m(this);
    if (isRunning() && ! wait(200))
    {
        quit();
        if (isRunning() && ! wait(300))
            terminate();
    }
}
void CarlaEngineThread::run()
{
    qDebug("CarlaEngineThread::run()");
    CARLA_ASSERT(engine->isRunning());
    bool oscControlRegisted, usesSingleThread;
    unsigned short i;
    double value;
    while (engine->isRunning() && ! m_stopNow)
    {
        const ScopedLocker m(this);
        oscControlRegisted = engine->isOscControlRegisted();
        for (i=0; i < engine->maxPluginNumber(); i++)
        {
            CarlaPlugin* const plugin = engine->getPluginUnchecked(i);
            if (plugin && plugin->enabled())
            {
#ifndef BUILD_BRIDGE
                const unsigned short id = plugin->id();
#endif
                usesSingleThread = (plugin->hints() & PLUGIN_USES_SINGLE_THREAD);
                // -------------------------------------------------------
                // Process postponed events
                if (! usesSingleThread)
                    plugin->postEventsRun();
                // -------------------------------------------------------
                // Update parameter outputs
                if (oscControlRegisted || ! usesSingleThread)
                {
                    for (uint32_t i=0; i < plugin->parameterCount(); i++)
                    {
                        if (! plugin->parameterIsOutput(i))
                            continue;
                        value = plugin->getParameterValue(i);
                        // Update UI
                        if (! usesSingleThread)
                            plugin->uiParameterChange(i, value);
                        // Update OSC control client
                        if (oscControlRegisted)
                        {
#ifdef BUILD_BRIDGE
                            engine->osc_send_bridge_set_parameter_value(i, value);
#else
                            engine->osc_send_control_set_parameter_value(id, i, value);
#endif
                        }
                    }
                }
                // -------------------------------------------------------
                // Update OSC control client (peaks)
                if (oscControlRegisted)
                {
                    // Peak values
                    if (plugin->audioInCount() > 0)
                    {
#ifdef BUILD_BRIDGE
                        engine->osc_send_bridge_set_inpeak(1);
                        engine->osc_send_bridge_set_inpeak(2);
#else
                        engine->osc_send_control_set_input_peak_value(id, 1);
                        engine->osc_send_control_set_input_peak_value(id, 2);
#endif
                    }
                    if (plugin->audioOutCount() > 0)
                    {
#ifdef BUILD_BRIDGE
                        engine->osc_send_bridge_set_outpeak(1);
                        engine->osc_send_bridge_set_outpeak(2);
#else
                        engine->osc_send_control_set_output_peak_value(id, 1);
                        engine->osc_send_control_set_output_peak_value(id, 2);
#endif
                    }
                }
            }
        }
#ifndef BUILD_BRIDGE
        if (! engine->idleOsc())
#endif
            msleep(50);
    }
}
CARLA_BACKEND_END_NAMESPACE
 |