2 Copyright (C) 2001 Paul Davis
3 Copyright (C) 2004-2008 Grame
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.
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.
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.
21 #include "JackSystemDeps.h"
22 #include "JackThreadedDriver.h"
23 #include "JackError.h"
24 #include "JackGlobals.h"
25 #include "JackEngineControl.h"
30 JackThreadedDriver::JackThreadedDriver(JackDriver
* driver
):fThread(this)
35 JackThreadedDriver::~JackThreadedDriver()
40 int JackThreadedDriver::Open()
42 return fDriver
->Open();
45 int JackThreadedDriver::Open(jack_nframes_t buffer_size
,
46 jack_nframes_t samplerate
,
52 const char* capture_driver_name
,
53 const char* playback_driver_name
,
54 jack_nframes_t capture_latency
,
55 jack_nframes_t playback_latency
)
57 return fDriver
->Open(buffer_size
, samplerate
, capturing
, playing
, inchannels
, outchannels
, monitor
, capture_driver_name
, playback_driver_name
, capture_latency
, playback_latency
);
60 int JackThreadedDriver::Close()
62 return fDriver
->Close();
65 int JackThreadedDriver::Process()
67 return fDriver
->Process();
70 int JackThreadedDriver::ProcessNull()
72 return fDriver
->ProcessNull();
75 int JackThreadedDriver::Attach()
77 return fDriver
->Attach();
80 int JackThreadedDriver::Detach()
82 return fDriver
->Detach();
85 int JackThreadedDriver::Read()
87 return fDriver
->Read();
90 int JackThreadedDriver::Write()
92 return fDriver
->Write();
95 bool JackThreadedDriver::IsFixedBufferSize()
97 return fDriver
->IsFixedBufferSize();
100 int JackThreadedDriver::SetBufferSize(jack_nframes_t buffer_size
)
102 return fDriver
->SetBufferSize(buffer_size
);
105 int JackThreadedDriver::SetSampleRate(jack_nframes_t sample_rate
)
107 return fDriver
->SetSampleRate(sample_rate
);
110 void JackThreadedDriver::SetMaster(bool onoff
)
112 fDriver
->SetMaster(onoff
);
115 bool JackThreadedDriver::GetMaster()
117 return fDriver
->GetMaster();
120 void JackThreadedDriver::AddSlave(JackDriverInterface
* slave
)
122 fDriver
->AddSlave(slave
);
125 void JackThreadedDriver::RemoveSlave(JackDriverInterface
* slave
)
127 fDriver
->RemoveSlave(slave
);
130 int JackThreadedDriver::ProcessReadSlaves()
132 return fDriver
->ProcessReadSlaves();
135 int JackThreadedDriver::ProcessWriteSlaves()
137 return fDriver
->ProcessWriteSlaves();
140 int JackThreadedDriver::ProcessRead()
142 return fDriver
->ProcessRead();
145 int JackThreadedDriver::ProcessWrite()
147 return fDriver
->ProcessWrite();
150 std::list
<JackDriverInterface
*> JackThreadedDriver::GetSlaves()
152 return fDriver
->GetSlaves();
155 int JackThreadedDriver::ClientNotify(int refnum
, const char* name
, int notify
, int sync
, const char* message
, int value1
, int value2
)
157 return fDriver
->ClientNotify(refnum
, name
, notify
, sync
, message
, value1
, value2
);
160 JackClientControl
* JackThreadedDriver::GetClientControl() const
162 return fDriver
->GetClientControl();
165 bool JackThreadedDriver::IsRealTime() const
167 return fDriver
->IsRealTime();
170 bool JackThreadedDriver::IsRunning() const
172 return fDriver
->IsRunning();
175 int JackThreadedDriver::Start()
177 jack_log("JackThreadedDriver::Start");
179 if (fDriver
->Start() < 0) {
180 jack_error("Cannot start driver");
183 if (fThread
.StartSync() < 0) {
184 jack_error("Cannot start thread");
191 int JackThreadedDriver::Stop()
193 jack_log("JackThreadedDriver::Stop");
195 switch (fThread
.GetStatus()) {
197 // Kill the thread in Init phase
198 case JackThread::kStarting
:
199 case JackThread::kIniting
:
200 if (fThread
.Kill() < 0) {
201 jack_error("Cannot kill thread");
206 // Stop when the thread cycle is finished
207 case JackThread::kRunning
:
208 if (fThread
.Stop() < 0) {
209 jack_error("Cannot stop thread");
218 if (fDriver
->Stop() < 0) {
219 jack_error("Cannot stop driver");
225 bool JackThreadedDriver::Execute()
227 return (Process() == 0);
230 bool JackThreadedDriver::Init()
232 if (fDriver
->Initialize()) {
233 if (fDriver
->IsRealTime()) {
234 jack_log("JackThreadedDriver::Init IsRealTime");
235 // Will do "something" on OSX only...
236 GetEngineControl()->fPeriod
= GetEngineControl()->fConstraint
= GetEngineControl()->fPeriodUsecs
* 1000;
237 fThread
.SetParams(GetEngineControl()->fPeriod
, GetEngineControl()->fComputation
, GetEngineControl()->fConstraint
);
238 if (fThread
.AcquireSelfRealTime(GetEngineControl()->fServerPriority
) < 0) {
239 jack_error("AcquireSelfRealTime error");
241 set_threaded_log_function();
250 } // end of namespace