This wrapper driver has the same usage as its parent JackWaitThreadedDriver, but for non-threaded (callback) drivers. After waiting for Initialize to return, its main thread simply ends instead of calling the driver's Process method in a loop. The decorated driver, which must extends JackRestarerDriver instead of JackWaiterDriver, can restart the wait cycle by calling its RestartWait method.tags/v1.9.11-RC1
| @@ -86,4 +86,18 @@ int JackWaiterDriver::ProcessNull() | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void JackRestarterDriver::SetRestartDriver(JackDriver* driver) | |||||
| { | |||||
| fRestartDriver = driver; | |||||
| } | |||||
| int JackRestarterDriver::RestartWait() | |||||
| { | |||||
| if (!fRestartDriver) { | |||||
| jack_error("JackRestartedDriver::RestartWait driver not set"); | |||||
| return -1; | |||||
| } | |||||
| return fRestartDriver->Start(); | |||||
| } | |||||
| } // end of namespace | } // end of namespace | ||||
| @@ -75,6 +75,32 @@ class SERVER_EXPORT JackWaiterDriver : public JackTimedDriver | |||||
| }; | }; | ||||
| /*! | |||||
| \brief A restartable driver. | |||||
| When wrapped into a JackWaitCallbackDriver, this driver can restart the | |||||
| wrapper thread which will wait again for the Initialize method to return. | |||||
| */ | |||||
| class SERVER_EXPORT JackRestarterDriver : public JackWaiterDriver | |||||
| { | |||||
| private: | |||||
| JackDriver* fRestartDriver; /*!< The wrapper driver */ | |||||
| public: | |||||
| JackRestarterDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table) | |||||
| : JackWaiterDriver(name, alias, engine, table), fRestartDriver(NULL) | |||||
| {} | |||||
| virtual ~JackRestarterDriver() | |||||
| {} | |||||
| void SetRestartDriver(JackDriver* driver); /*!< Let the wrapper register itself */ | |||||
| int RestartWait(); /*!< Restart the wrapper thread */ | |||||
| }; | |||||
| } // end of namespace | } // end of namespace | ||||
| #endif | #endif | ||||
| @@ -0,0 +1,39 @@ | |||||
| /* | |||||
| Copyright (C) 2014 Cédric Schieli | |||||
| 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 (at your option) 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. | |||||
| 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
| */ | |||||
| #include "JackWaitCallbackDriver.h" | |||||
| namespace Jack | |||||
| { | |||||
| JackWaitCallbackDriver::JackWaitCallbackDriver(JackRestarterDriver* driver) | |||||
| : JackWaitThreadedDriver(driver) | |||||
| { | |||||
| // Self register with the decorated driver so it can restart us | |||||
| assert(driver); | |||||
| driver->SetRestartDriver((JackDriver*)this); | |||||
| } | |||||
| bool JackWaitCallbackDriver::ExecuteReal() | |||||
| { | |||||
| // End the thread and let the callback driver do its job | |||||
| return false; | |||||
| } | |||||
| } // end of namespace | |||||
| @@ -0,0 +1,50 @@ | |||||
| /* | |||||
| Copyright (C) 2014 Cédric Schieli | |||||
| 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 (at your option) 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. | |||||
| 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
| */ | |||||
| #ifndef __JackWaitCallbackDriver__ | |||||
| #define __JackWaitCallbackDriver__ | |||||
| #include "JackWaitThreadedDriver.h" | |||||
| namespace Jack | |||||
| { | |||||
| /*! | |||||
| \brief Wrapper for a restartable non-threaded driver (e.g. JackProxyDriver). | |||||
| Simply ends its thread when the decorated driver Initialize method returns. | |||||
| Self register with the supplied JackRestarterDriver so it can restart the thread. | |||||
| */ | |||||
| class SERVER_EXPORT JackWaitCallbackDriver : public JackWaitThreadedDriver | |||||
| { | |||||
| public: | |||||
| JackWaitCallbackDriver(JackRestarterDriver* driver); | |||||
| protected: | |||||
| bool ExecuteReal(); | |||||
| }; | |||||
| } // end of namespace | |||||
| #endif | |||||
| @@ -223,6 +223,7 @@ def build(bld): | |||||
| 'JackThreadedDriver.cpp', | 'JackThreadedDriver.cpp', | ||||
| 'JackRestartThreadedDriver.cpp', | 'JackRestartThreadedDriver.cpp', | ||||
| 'JackWaitThreadedDriver.cpp', | 'JackWaitThreadedDriver.cpp', | ||||
| 'JackWaitCallbackDriver.cpp', | |||||
| 'JackServerAPI.cpp', | 'JackServerAPI.cpp', | ||||
| 'JackDriverLoader.cpp', | 'JackDriverLoader.cpp', | ||||
| 'JackServerGlobals.cpp', | 'JackServerGlobals.cpp', | ||||