jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
5.2KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2004-2008 Grame
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include "JackSystemDeps.h"
  17. #include "JackThreadedDriver.h"
  18. #include "JackError.h"
  19. #include "JackGlobals.h"
  20. #include "JackEngineControl.h"
  21. namespace Jack
  22. {
  23. JackThreadedDriver::JackThreadedDriver(JackDriver* driver):fThread(this)
  24. {
  25. fDriver = driver;
  26. }
  27. JackThreadedDriver::~JackThreadedDriver()
  28. {
  29. delete fDriver;
  30. }
  31. int JackThreadedDriver::Open()
  32. {
  33. return fDriver->Open();
  34. }
  35. int JackThreadedDriver::Open(jack_nframes_t buffer_size,
  36. jack_nframes_t samplerate,
  37. bool capturing,
  38. bool playing,
  39. int inchannels,
  40. int outchannels,
  41. bool monitor,
  42. const char* capture_driver_name,
  43. const char* playback_driver_name,
  44. jack_nframes_t capture_latency,
  45. jack_nframes_t playback_latency)
  46. {
  47. return fDriver->Open(buffer_size, samplerate, capturing, playing, inchannels, outchannels, monitor, capture_driver_name, playback_driver_name, capture_latency, playback_latency);
  48. }
  49. int JackThreadedDriver::Close()
  50. {
  51. return fDriver->Close();
  52. }
  53. int JackThreadedDriver::Process()
  54. {
  55. return fDriver->Process();
  56. }
  57. int JackThreadedDriver::ProcessNull()
  58. {
  59. return fDriver->ProcessNull();
  60. }
  61. int JackThreadedDriver::Attach()
  62. {
  63. return fDriver->Attach();
  64. }
  65. int JackThreadedDriver::Detach()
  66. {
  67. return fDriver->Detach();
  68. }
  69. int JackThreadedDriver::Read()
  70. {
  71. return fDriver->Read();
  72. }
  73. int JackThreadedDriver::Write()
  74. {
  75. return fDriver->Write();
  76. }
  77. bool JackThreadedDriver::IsFixedBufferSize()
  78. {
  79. return fDriver->IsFixedBufferSize();
  80. }
  81. int JackThreadedDriver::SetBufferSize(jack_nframes_t buffer_size)
  82. {
  83. return fDriver->SetBufferSize(buffer_size);
  84. }
  85. int JackThreadedDriver::SetSampleRate(jack_nframes_t sample_rate)
  86. {
  87. return fDriver->SetSampleRate(sample_rate);
  88. }
  89. void JackThreadedDriver::SetMaster(bool onoff)
  90. {
  91. fDriver->SetMaster(onoff);
  92. }
  93. bool JackThreadedDriver::GetMaster()
  94. {
  95. return fDriver->GetMaster();
  96. }
  97. void JackThreadedDriver::AddSlave(JackDriverInterface* slave)
  98. {
  99. fDriver->AddSlave(slave);
  100. }
  101. void JackThreadedDriver::RemoveSlave(JackDriverInterface* slave)
  102. {
  103. fDriver->RemoveSlave(slave);
  104. }
  105. int JackThreadedDriver::ProcessSlaves()
  106. {
  107. return fDriver->ProcessSlaves();
  108. }
  109. int JackThreadedDriver::ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2)
  110. {
  111. return fDriver->ClientNotify(refnum, name, notify, sync, value1, value2);
  112. }
  113. JackClientControl* JackThreadedDriver::GetClientControl() const
  114. {
  115. return fDriver->GetClientControl();
  116. }
  117. bool JackThreadedDriver::IsRealTime() const
  118. {
  119. return fDriver->IsRealTime();
  120. }
  121. int JackThreadedDriver::Start()
  122. {
  123. jack_log("JackThreadedDriver::Start");
  124. if (fDriver->Start() < 0) {
  125. jack_error("Cannot start driver");
  126. return -1;
  127. }
  128. if (fThread.StartSync() < 0) {
  129. jack_error("Cannot start thread");
  130. return -1;
  131. }
  132. return 0;
  133. }
  134. int JackThreadedDriver::Stop()
  135. {
  136. jack_log("JackThreadedDriver::Stop");
  137. switch (fThread.GetStatus()) {
  138. // Kill the thread in Init phase
  139. case JackThread::kStarting:
  140. case JackThread::kIniting:
  141. if (fThread.Kill() < 0) {
  142. jack_error("Cannot kill thread");
  143. return -1;
  144. }
  145. break;
  146. // Stop when the thread cycle is finished
  147. case JackThread::kRunning:
  148. if (fThread.Stop() < 0) {
  149. jack_error("Cannot stop thread");
  150. return -1;
  151. }
  152. break;
  153. default:
  154. break;
  155. }
  156. if (fDriver->Stop() < 0) {
  157. jack_error("Cannot stop driver");
  158. return -1;
  159. }
  160. return 0;
  161. }
  162. bool JackThreadedDriver::Execute()
  163. {
  164. return (Process() == 0);
  165. }
  166. bool JackThreadedDriver::Init()
  167. {
  168. if (fDriver->Init()) {
  169. if (fDriver->IsRealTime()) {
  170. jack_log("JackThreadedDriver::Init IsRealTime");
  171. // Will do "something" on OSX only...
  172. GetEngineControl()->fPeriod = GetEngineControl()->fConstraint = GetEngineControl()->fPeriodUsecs * 1000;
  173. fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
  174. if (fThread.AcquireRealTime(GetEngineControl()->fServerPriority) < 0) {
  175. jack_error("AcquireRealTime error");
  176. } else {
  177. set_threaded_log_function();
  178. }
  179. }
  180. return true;
  181. } else {
  182. return false;
  183. }
  184. }
  185. } // end of namespace