1 /* 2 Copyright (C) 2001 Paul Davis 3 Copyright (C) 2004-2008 Grame 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 19 */ 20 21 #include "JackSystemDeps.h" 22 #include "JackWaitThreadedDriver.h" 23 #include "JackGlobals.h" 24 #include "JackClient.h" 25 #include "JackEngineControl.h" 26 #include "JackException.h" 27 #include "JackError.h" 28 #include "JackTools.h" 29 30 namespace Jack 31 { 32 Init()33bool JackWaitThreadedDriver::Init() 34 { 35 return (fStarter.Start() == 0); 36 } 37 Execute()38bool JackWaitThreadedDriver::Execute() 39 { 40 SetRealTime(); 41 42 // Process a null cycle until NetDriver has started 43 while (!fStarter.fRunning && fThread.GetStatus() == JackThread::kRunning) { 44 // Use base class method 45 assert(static_cast<JackWaiterDriver*>(fDriver)); 46 static_cast<JackWaiterDriver*>(fDriver)->ProcessNull(); 47 } 48 49 return ExecuteReal(); 50 } 51 ExecuteReal()52bool JackWaitThreadedDriver::ExecuteReal() 53 { 54 try { 55 56 // Switch to keep running even in case of error 57 while (fThread.GetStatus() == JackThread::kRunning) { 58 fDriver->Process(); 59 } 60 61 return false; 62 63 } catch (JackNetException& e) { 64 65 e.PrintMessage(); 66 jack_info("Driver is restarted"); 67 fThread.DropSelfRealTime(); 68 69 // Thread has been stopped... 70 if (fThread.GetStatus() == JackThread::kIdle) { 71 return false; 72 } 73 74 // Thread in kIniting status again... 75 fThread.SetStatus(JackThread::kIniting); 76 if (Init()) { 77 // Thread in kRunning status again... 78 fThread.SetStatus(JackThread::kRunning); 79 return true; 80 } 81 82 return false; 83 } 84 } 85 86 } // end of namespace 87