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.

231 lines
5.4KB

  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. std::list<JackDriverInterface*> JackThreadedDriver::GetSlaves()
  110. {
  111. return fDriver->GetSlaves();
  112. }
  113. int JackThreadedDriver::ClientNotify(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2)
  114. {
  115. return fDriver->ClientNotify(refnum, name, notify, sync, message, value1, value2);
  116. }
  117. JackClientControl* JackThreadedDriver::GetClientControl() const
  118. {
  119. return fDriver->GetClientControl();
  120. }
  121. bool JackThreadedDriver::IsRealTime() const
  122. {
  123. return fDriver->IsRealTime();
  124. }
  125. int JackThreadedDriver::Start()
  126. {
  127. jack_log("JackThreadedDriver::Start");
  128. if (fDriver->Start() < 0) {
  129. jack_error("Cannot start driver");
  130. return -1;
  131. }
  132. if (fThread.StartSync() < 0) {
  133. jack_error("Cannot start thread");
  134. return -1;
  135. }
  136. return 0;
  137. }
  138. int JackThreadedDriver::Stop()
  139. {
  140. jack_log("JackThreadedDriver::Stop");
  141. switch (fThread.GetStatus()) {
  142. // Kill the thread in Init phase
  143. case JackThread::kStarting:
  144. case JackThread::kIniting:
  145. if (fThread.Kill() < 0) {
  146. jack_error("Cannot kill thread");
  147. return -1;
  148. }
  149. break;
  150. // Stop when the thread cycle is finished
  151. case JackThread::kRunning:
  152. if (fThread.Stop() < 0) {
  153. jack_error("Cannot stop thread");
  154. return -1;
  155. }
  156. break;
  157. default:
  158. break;
  159. }
  160. if (fDriver->Stop() < 0) {
  161. jack_error("Cannot stop driver");
  162. return -1;
  163. }
  164. return 0;
  165. }
  166. bool JackThreadedDriver::Execute()
  167. {
  168. return (Process() == 0);
  169. }
  170. bool JackThreadedDriver::Init()
  171. {
  172. if (fDriver->Initialize()) {
  173. if (fDriver->IsRealTime()) {
  174. jack_log("JackThreadedDriver::Init IsRealTime");
  175. // Will do "something" on OSX only...
  176. GetEngineControl()->fPeriod = GetEngineControl()->fConstraint = GetEngineControl()->fPeriodUsecs * 1000;
  177. fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
  178. if (fThread.AcquireSelfRealTime(GetEngineControl()->fServerPriority) < 0) {
  179. jack_error("AcquireSelfRealTime error");
  180. } else {
  181. set_threaded_log_function();
  182. }
  183. }
  184. return true;
  185. } else {
  186. return false;
  187. }
  188. }
  189. } // end of namespace