diff --git a/common/JackDriver.cpp b/common/JackDriver.cpp index 7c108392..cf6737ed 100644 --- a/common/JackDriver.cpp +++ b/common/JackDriver.cpp @@ -174,7 +174,7 @@ int JackDriver::ClientNotify(int refnum, const char* name, int notify, int sync, return 0; } -bool JackDriver::IsRealTime() +bool JackDriver::IsRealTime() const { return fEngineControl->fRealTime; } @@ -231,4 +231,60 @@ int JackDriverClient::ProcessSlaves() return res; } +int JackDriver::Process() +{ + return 0; +} + +int JackDriver::ProcessNull() +{ + return 0; +} + +int JackDriver::Attach() +{ + return 0; +} + +int JackDriver::Detach() +{ + return 0; +} + +int JackDriver::Read() +{ + return 0; +} + +int JackDriver::Write() +{ + return 0; +} + +int JackDriver::Start() +{ + return 0; +} + +int JackDriver::Stop() +{ + return 0; +} + +int JackDriver::SetBufferSize(jack_nframes_t buffer_size) +{ + return 0; +} + +int JackDriver::SetSampleRate(jack_nframes_t sample_rate) +{ + return 0; +} + +bool JackDriver::Init() +{ + return true; +} + + } // end of namespace diff --git a/common/JackDriver.h b/common/JackDriver.h index 501758e8..859806c0 100644 --- a/common/JackDriver.h +++ b/common/JackDriver.h @@ -83,7 +83,7 @@ class EXPORT JackDriverInterface virtual void RemoveSlave(JackDriverInterface* slave) = 0; virtual int ProcessSlaves() = 0; - virtual bool IsRealTime() = 0; + virtual bool IsRealTime() const = 0; }; /*! \brief The base interface for drivers clients. @@ -165,66 +165,32 @@ class EXPORT JackDriver : public JackDriverClient virtual int Close(); - virtual int Process() - { - return 0; - } - - virtual int ProcessNull() - { - return 0; - } - - virtual int Attach() - { - return 0; - } - virtual int Detach() - { - return 0; - } - - virtual int Read() - { - return 0; - } - virtual int Write() - { - return 0; - } - - virtual int Start() - { - return 0; - } - virtual int Stop() - { - return 0; - } - - virtual int SetBufferSize(jack_nframes_t buffer_size) - { - return 0; - } - - virtual int SetSampleRate(jack_nframes_t sample_rate) - { - return 0; - } + virtual int Process(); + virtual int ProcessNull(); + + virtual int Attach(); + virtual int Detach(); + + virtual int Read(); + virtual int Write(); + + virtual int Start(); + virtual int Stop(); + + virtual int SetBufferSize(jack_nframes_t buffer_size); + virtual int SetSampleRate(jack_nframes_t sample_rate); + void NotifyXRun(jack_time_t callback_usecs, float delayed_usecs); // XRun notification sent by the driver - virtual bool IsRealTime(); + virtual bool IsRealTime() const; int ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2); void SetupDriverSync(int ref, bool freewheel); - virtual bool Init() - { - return true; - } - + virtual bool Init(); + }; } // end of namespace diff --git a/common/JackException.h b/common/JackException.h index e764873f..843e14d8 100644 --- a/common/JackException.h +++ b/common/JackException.h @@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include #include "JackExports.h" +#include "JackError.h" namespace Jack { diff --git a/common/JackRestartThreadedDriver.cpp b/common/JackRestartThreadedDriver.cpp new file mode 100644 index 00000000..a318822d --- /dev/null +++ b/common/JackRestartThreadedDriver.cpp @@ -0,0 +1,59 @@ +/* + Copyright (C) 2001 Paul Davis + Copyright (C) 2004-2008 Grame + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#if defined(HAVE_CONFIG_H) +#include "config.h" +#endif + +#ifdef WIN32 +#pragma warning (disable : 4786) +#endif + +#include "JackRestartThreadedDriver.h" +#include "JackException.h" + +namespace Jack +{ + +bool JackRestartThreadedDriver::Execute() +{ + try { + // Keep running even in case of error + while (fThread.GetStatus() == JackThread::kRunning) { + Process(); + } + return false; + } catch (JackDriverException& e) { + e.PrintMessage(); + jack_log("Driver is restarted"); + fThread.DropRealTime(); + // Thread in kIniting status again... + fThread.SetStatus(JackThread::kIniting); + if (Init()) { + // Thread in kRunning status again... + fThread.SetStatus(JackThread::kRunning); + return true; + } else { + return false; + } + } +} + +} // end of namespace diff --git a/common/JackRestartThreadedDriver.h b/common/JackRestartThreadedDriver.h new file mode 100644 index 00000000..2658258f --- /dev/null +++ b/common/JackRestartThreadedDriver.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2001 Paul Davis + Copyright (C) 2004-2008 Grame + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __JackRestartThreadedDriver__ +#define __JackRestartThreadedDriverr__ + +#include "JackThreadedDriver.h" + +namespace Jack +{ + +class EXPORT JackRestartThreadedDriver : public JackThreadedDriver +{ + public: + + JackRestartThreadedDriver(JackDriverClient* driver) + :JackThreadedDriver(driver) + {} + virtual ~JackRestartThreadedDriver() + {} + + // JackRunnableInterface interface + virtual bool Execute(); +}; + +} // end of namespace + + +#endif diff --git a/common/JackThreadedDriver.cpp b/common/JackThreadedDriver.cpp index 506a550f..7d30bad0 100644 --- a/common/JackThreadedDriver.cpp +++ b/common/JackThreadedDriver.cpp @@ -46,6 +46,111 @@ JackThreadedDriver::~JackThreadedDriver() delete fDriver; } +int JackThreadedDriver::Open() +{ + return fDriver->Open(); +} + +int JackThreadedDriver::Open(jack_nframes_t nframes, + jack_nframes_t samplerate, + bool capturing, + bool playing, + int inchannels, + int outchannels, + bool monitor, + const char* capture_driver_name, + const char* playback_driver_name, + jack_nframes_t capture_latency, + jack_nframes_t playback_latency) +{ + return fDriver->Open(nframes, samplerate, capturing, playing, inchannels, outchannels, monitor, capture_driver_name, playback_driver_name, capture_latency, playback_latency); +} + +int JackThreadedDriver::Close() +{ + return fDriver->Close(); +} + +int JackThreadedDriver::Process() +{ + return fDriver->Process(); +} + +int JackThreadedDriver::ProcessNull() +{ + return fDriver->ProcessNull(); +} + +int JackThreadedDriver::Attach() +{ + return fDriver->Attach(); +} + +int JackThreadedDriver::Detach() +{ + return fDriver->Detach(); +} + +int JackThreadedDriver::Read() +{ + return fDriver->Read(); +} + +int JackThreadedDriver::Write() +{ + return fDriver->Write(); +} + +int JackThreadedDriver::SetBufferSize(jack_nframes_t buffer_size) +{ + return fDriver->SetBufferSize(buffer_size); +} + +int JackThreadedDriver::SetSampleRate(jack_nframes_t sample_rate) +{ + return fDriver->SetSampleRate(sample_rate); +} + +void JackThreadedDriver::SetMaster(bool onoff) +{ + fDriver->SetMaster(onoff); +} + +bool JackThreadedDriver::GetMaster() +{ + return fDriver->GetMaster(); +} + +void JackThreadedDriver::AddSlave(JackDriverInterface* slave) +{ + fDriver->AddSlave(slave); +} + +void JackThreadedDriver::RemoveSlave(JackDriverInterface* slave) +{ + fDriver->RemoveSlave(slave); +} + +int JackThreadedDriver::ProcessSlaves() +{ + return fDriver->ProcessSlaves(); +} + +int JackThreadedDriver::ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2) +{ + return fDriver->ClientNotify(refnum, name, notify, sync, value1, value2); +} + +JackClientControl* JackThreadedDriver::GetClientControl() const +{ + return fDriver->GetClientControl(); +} + +bool JackThreadedDriver::IsRealTime() const +{ + return fDriver->IsRealTime(); +} + int JackThreadedDriver::Start() { jack_log("JackThreadedDriver::Start"); @@ -120,28 +225,4 @@ bool JackThreadedDriver::Init() } } -bool JackRestartThreadedDriver::Execute() -{ - try { - // Keep running even in case of error - while (fThread.GetStatus() == JackThread::kRunning) { - Process(); - } - return false; - } catch (JackDriverException& e) { - e.PrintMessage(); - jack_log("Driver is restarted"); - fThread.DropRealTime(); - // Thread in kIniting status again... - fThread.SetStatus(JackThread::kIniting); - if (Init()) { - // Thread in kRunning status again... - fThread.SetStatus(JackThread::kRunning); - return true; - } else { - return false; - } - } -} - } // end of namespace diff --git a/common/JackThreadedDriver.h b/common/JackThreadedDriver.h index e4490294..1f3ba7df 100644 --- a/common/JackThreadedDriver.h +++ b/common/JackThreadedDriver.h @@ -44,11 +44,7 @@ class EXPORT JackThreadedDriver : public JackDriverClientInterface, public JackR JackThreadedDriver(JackDriverClient* driver); virtual ~JackThreadedDriver(); - virtual int Open() - { - return fDriver->Open(); - } - + virtual int Open(); virtual int Open(jack_nframes_t nframes, jack_nframes_t samplerate, bool capturing, @@ -59,113 +55,44 @@ class EXPORT JackThreadedDriver : public JackDriverClientInterface, public JackR const char* capture_driver_name, const char* playback_driver_name, jack_nframes_t capture_latency, - jack_nframes_t playback_latency) - { - return fDriver->Open(nframes, samplerate, capturing, playing, inchannels, outchannels, monitor, capture_driver_name, playback_driver_name, capture_latency, playback_latency); - } - - int Close() - { - return fDriver->Close(); - } - - int Process() - { - return fDriver->Process(); - } + jack_nframes_t playback_latency); + + virtual int Close(); + + virtual int Process(); - int ProcessNull() - { - return fDriver->ProcessNull(); - } - - int Attach() - { - return fDriver->Attach(); - } - int Detach() - { - return fDriver->Detach(); - } - - int Read() - { - return fDriver->Read(); - } - int Write() - { - return fDriver->Write(); - } - - int Start(); - int Stop(); - - int SetBufferSize(jack_nframes_t buffer_size) - { - return fDriver->SetBufferSize(buffer_size); - } - - int SetSampleRate(jack_nframes_t sample_rate) - { - return fDriver->SetSampleRate(sample_rate); - } - - void SetMaster(bool onoff) - { - fDriver->SetMaster(onoff); - } - bool GetMaster() - { - return fDriver->GetMaster(); - } - - void AddSlave(JackDriverInterface* slave) - { - fDriver->AddSlave(slave); - } - void RemoveSlave(JackDriverInterface* slave) - { - fDriver->RemoveSlave(slave); - } - int ProcessSlaves() - { - return fDriver->ProcessSlaves(); - } - - int ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2) - { - return fDriver->ClientNotify(refnum, name, notify, sync, value1, value2); - } - - JackClientControl* GetClientControl() const - { - return fDriver->GetClientControl(); - } - - bool IsRealTime() - { - return fDriver->IsRealTime(); - } - + virtual int ProcessNull(); + + virtual int Attach(); + virtual int Detach(); + + virtual int Read(); + virtual int Write(); + + virtual int Start(); + virtual int Stop(); + + virtual int SetBufferSize(jack_nframes_t buffer_size); + virtual int SetSampleRate(jack_nframes_t sample_rate); + + virtual void SetMaster(bool onoff); + virtual bool GetMaster(); + virtual void AddSlave(JackDriverInterface* slave); + virtual void RemoveSlave(JackDriverInterface* slave); + virtual int ProcessSlaves(); + + virtual int ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2); + + virtual JackClientControl* GetClientControl() const; + + virtual bool IsRealTime() const; + // JackRunnableInterface interface virtual bool Execute(); virtual bool Init(); }; -class EXPORT JackRestartThreadedDriver : public JackThreadedDriver -{ - public: - - JackRestartThreadedDriver(JackDriverClient* driver):JackThreadedDriver(driver) - {} - virtual ~JackRestartThreadedDriver() - {} - - // JackRunnableInterface interface - virtual bool Execute(); -}; - } // end of namespace diff --git a/macosx/Jackdmp.xcodeproj/project.pbxproj b/macosx/Jackdmp.xcodeproj/project.pbxproj index 98eaa4fe..7df9abce 100644 --- a/macosx/Jackdmp.xcodeproj/project.pbxproj +++ b/macosx/Jackdmp.xcodeproj/project.pbxproj @@ -310,6 +310,10 @@ 4B363F760DEB0D7D001F72D9 /* impulse_grabber.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B363F750DEB0D7D001F72D9 /* impulse_grabber.c */; }; 4B3F49080AD8503300491C6E /* jack_cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B3F49070AD8503300491C6E /* jack_cpu.c */; }; 4B44FAE70C7598370033A72C /* JackServerLaunch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B44FAE50C7598370033A72C /* JackServerLaunch.cpp */; }; + 4B4CA9750E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B4CA9730E02CF9600F4BFDA /* JackRestartThreadedDriver.h */; }; + 4B4CA9760E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4CA9740E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp */; }; + 4B4CA9770E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B4CA9730E02CF9600F4BFDA /* JackRestartThreadedDriver.h */; }; + 4B4CA9780E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4CA9740E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp */; }; 4B4F9C8C0DC20C0400706CB0 /* JackMessageBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4F9C8A0DC20C0400706CB0 /* JackMessageBuffer.cpp */; }; 4B4F9C8D0DC20C0400706CB0 /* JackMessageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B4F9C8B0DC20C0400706CB0 /* JackMessageBuffer.h */; }; 4B4F9C8E0DC20C0400706CB0 /* JackMessageBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4F9C8A0DC20C0400706CB0 /* JackMessageBuffer.cpp */; }; @@ -1187,6 +1191,8 @@ 4B4259E5076B635E00C1ECE1 /* JackMacEngineRPC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMacEngineRPC.cpp; sourceTree = SOURCE_ROOT; }; 4B44FAE50C7598370033A72C /* JackServerLaunch.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackServerLaunch.cpp; path = ../common/JackServerLaunch.cpp; sourceTree = SOURCE_ROOT; }; 4B464301076CAC7700E5077C /* Jack-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = "Jack-Info.plist"; sourceTree = SOURCE_ROOT; }; + 4B4CA9730E02CF9600F4BFDA /* JackRestartThreadedDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackRestartThreadedDriver.h; path = ../common/JackRestartThreadedDriver.h; sourceTree = SOURCE_ROOT; }; + 4B4CA9740E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackRestartThreadedDriver.cpp; path = ../common/JackRestartThreadedDriver.cpp; sourceTree = SOURCE_ROOT; }; 4B4F9C8A0DC20C0400706CB0 /* JackMessageBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackMessageBuffer.cpp; path = ../common/JackMessageBuffer.cpp; sourceTree = SOURCE_ROOT; }; 4B4F9C8B0DC20C0400706CB0 /* JackMessageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackMessageBuffer.h; path = ../common/JackMessageBuffer.h; sourceTree = SOURCE_ROOT; }; 4B56880F08B5C8620022B32D /* JackFifo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackFifo.cpp; path = ../common/JackFifo.cpp; sourceTree = SOURCE_ROOT; }; @@ -2482,12 +2488,14 @@ 4BD56D8707968982006D44F9 /* Threaded */ = { isa = PBXGroup; children = ( - 4BBC93B90DF9736C002DF220 /* JackWaitThreadedDriver.h */, - 4BBC93B80DF9736C002DF220 /* JackWaitThreadedDriver.cpp */, 4BF8D1BD0834EEFC00C94B91 /* JackThreadedDriver.h */, 4BF8D1BE0834EEFC00C94B91 /* JackThreadedDriver.cpp */, 4BF8D1B90834EEF100C94B91 /* JackFreewheelDriver.h */, 4BF8D1BA0834EEF100C94B91 /* JackFreewheelDriver.cpp */, + 4B4CA9730E02CF9600F4BFDA /* JackRestartThreadedDriver.h */, + 4B4CA9740E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp */, + 4BBC93B90DF9736C002DF220 /* JackWaitThreadedDriver.h */, + 4BBC93B80DF9736C002DF220 /* JackWaitThreadedDriver.cpp */, ); name = Threaded; sourceTree = ""; @@ -2676,6 +2684,7 @@ BA222ADB0DC88269001A17F4 /* JackNetTool.h in Headers */, 4B9A26060DBF8584006E9FBC /* jslist.h in Headers */, 4B4F9C930DC20C0400706CB0 /* JackMessageBuffer.h in Headers */, + 4B4CA9770E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3024,6 +3033,7 @@ 4B4F9C8D0DC20C0400706CB0 /* JackMessageBuffer.h in Headers */, 4B5F253E0DEE9B8F0041E486 /* JackLockedEngine.h in Headers */, 4BBC93BB0DF9736C002DF220 /* JackWaitThreadedDriver.h in Headers */, + 4B4CA9750E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5250,6 +5260,7 @@ 4B9A26680DBF8B23006E9FBC /* JackControl.cpp in Sources */, 4B0206A10DC0BAB400319AF1 /* JackProcessSync.cpp in Sources */, 4B4F9C920DC20C0400706CB0 /* JackMessageBuffer.cpp in Sources */, + 4B4CA9780E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5619,6 +5630,7 @@ 4B02069E0DC0BAB400319AF1 /* JackProcessSync.cpp in Sources */, 4B4F9C8C0DC20C0400706CB0 /* JackMessageBuffer.cpp in Sources */, 4BBC93BA0DF9736C002DF220 /* JackWaitThreadedDriver.cpp in Sources */, + 4B4CA9760E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };