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 "JackTools.h"
25 #include "JackGlobals.h"
26 #include "JackEngineControl.h"
31 JackThreadedDriver::JackThreadedDriver(JackDriver
* driver
):fThread(this)
36 JackThreadedDriver::~JackThreadedDriver()
41 int JackThreadedDriver::Open()
43 return fDriver
->Open();
46 int JackThreadedDriver::Open(jack_nframes_t buffer_size
,
47 jack_nframes_t samplerate
,
53 const char* capture_driver_name
,
54 const char* playback_driver_name
,
55 jack_nframes_t capture_latency
,
56 jack_nframes_t playback_latency
)
58 return fDriver
->Open(buffer_size
,
59 samplerate
, capturing
,
62 capture_driver_name
, playback_driver_name
,
63 capture_latency
, playback_latency
);
66 int JackThreadedDriver::Close()
68 return fDriver
->Close();
71 int JackThreadedDriver::Process()
73 return fDriver
->Process();
76 int JackThreadedDriver::Attach()
78 return fDriver
->Attach();
81 int JackThreadedDriver::Detach()
83 return fDriver
->Detach();
86 int JackThreadedDriver::Read()
88 return fDriver
->Read();
91 int JackThreadedDriver::Write()
93 return fDriver
->Write();
96 bool JackThreadedDriver::IsFixedBufferSize()
98 return fDriver
->IsFixedBufferSize();
101 int JackThreadedDriver::SetBufferSize(jack_nframes_t buffer_size
)
103 return fDriver
->SetBufferSize(buffer_size
);
106 int JackThreadedDriver::SetSampleRate(jack_nframes_t sample_rate
)
108 return fDriver
->SetSampleRate(sample_rate
);
111 void JackThreadedDriver::SetMaster(bool onoff
)
113 fDriver
->SetMaster(onoff
);
116 bool JackThreadedDriver::GetMaster()
118 return fDriver
->GetMaster();
121 void JackThreadedDriver::AddSlave(JackDriverInterface
* slave
)
123 fDriver
->AddSlave(slave
);
126 void JackThreadedDriver::RemoveSlave(JackDriverInterface
* slave
)
128 fDriver
->RemoveSlave(slave
);
131 int JackThreadedDriver::ProcessReadSlaves()
133 return fDriver
->ProcessReadSlaves();
136 int JackThreadedDriver::ProcessWriteSlaves()
138 return fDriver
->ProcessWriteSlaves();
141 int JackThreadedDriver::ProcessRead()
143 return fDriver
->ProcessRead();
146 int JackThreadedDriver::ProcessWrite()
148 return fDriver
->ProcessWrite();
151 int JackThreadedDriver::ProcessReadSync()
153 return fDriver
->ProcessReadSync();
156 int JackThreadedDriver::ProcessWriteSync()
158 return fDriver
->ProcessWriteSync();
161 int JackThreadedDriver::ProcessReadAsync()
163 return fDriver
->ProcessReadAsync();
166 int JackThreadedDriver::ProcessWriteAsync()
168 return fDriver
->ProcessWriteAsync();
171 std::list
<JackDriverInterface
*> JackThreadedDriver::GetSlaves()
173 return fDriver
->GetSlaves();
176 int JackThreadedDriver::ClientNotify(int refnum
, const char* name
, int notify
, int sync
, const char* message
, int value1
, int value2
)
178 return fDriver
->ClientNotify(refnum
, name
, notify
, sync
, message
, value1
, value2
);
181 JackClientControl
* JackThreadedDriver::GetClientControl() const
183 return fDriver
->GetClientControl();
186 bool JackThreadedDriver::IsRealTime() const
188 return fDriver
->IsRealTime();
191 bool JackThreadedDriver::IsRunning() const
193 return fDriver
->IsRunning();
196 int JackThreadedDriver::Start()
198 jack_log("JackThreadedDriver::Start");
200 if (fDriver
->Start() < 0) {
201 jack_error("Cannot start driver");
204 if (fThread
.StartSync() < 0) {
205 jack_error("Cannot start thread");
212 int JackThreadedDriver::Stop()
214 jack_log("JackThreadedDriver::Stop");
216 switch (fThread
.GetStatus()) {
218 // Kill the thread in Init phase
219 case JackThread::kStarting
:
220 case JackThread::kIniting
:
221 if (fThread
.Kill() < 0) {
222 jack_error("Cannot kill thread");
226 // Stop when the thread cycle is finished
227 case JackThread::kRunning
:
228 if (fThread
.Stop() < 0) {
229 jack_error("Cannot stop thread");
237 if (fDriver
->Stop() < 0) {
238 jack_error("Cannot stop driver");
244 bool JackThreadedDriver::Execute()
246 return (Process() == 0);
249 bool JackThreadedDriver::Init()
251 if (fDriver
->Initialize()) {
259 void JackThreadedDriver::SetRealTime()
261 if (fDriver
->IsRealTime()) {
262 jack_log("JackThreadedDriver::Init real-time");
263 // Will do "something" on OSX only...
264 GetEngineControl()->fPeriod
= GetEngineControl()->fConstraint
= GetEngineControl()->fPeriodUsecs
* 1000;
265 GetEngineControl()->fComputation
= JackTools::ComputationMicroSec(GetEngineControl()->fBufferSize
) * 1000;
266 fThread
.SetParams(GetEngineControl()->fPeriod
, GetEngineControl()->fComputation
, GetEngineControl()->fConstraint
);
267 if (fThread
.AcquireSelfRealTime(GetEngineControl()->fServerPriority
) < 0) {
268 jack_error("AcquireSelfRealTime error");
270 set_threaded_log_function();
273 jack_log("JackThreadedDriver::Init non-realtime");
278 } // end of namespace