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.

183 lines
4.9KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2004-2006 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 "JackLoopbackDriver.h"
  17. #include "JackEngineControl.h"
  18. #include "JackGraphManager.h"
  19. #include <iostream>
  20. #include <assert.h>
  21. namespace Jack
  22. {
  23. int JackLoopbackDriver::Process()
  24. {
  25. assert(fCaptureChannels == fPlaybackChannels);
  26. // Loopback copy
  27. for (int i = 0; i < fCaptureChannels; i++) {
  28. memcpy(GetInputBuffer(i), GetOutputBuffer(i), sizeof(float) * fEngineControl->fBufferSize);
  29. }
  30. fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); // Signal all clients
  31. if (fEngineControl->fSyncMode) {
  32. if (fGraphManager->SuspendRefNum(fClientControl, fSynchroTable, fEngineControl->fTimeOutUsecs) < 0)
  33. jack_error("JackLoopbackDriver::ProcessSync SuspendRefNum error");
  34. }
  35. return 0;
  36. }
  37. void JackLoopbackDriver::PrintState()
  38. {
  39. int i;
  40. jack_port_id_t port_index;
  41. std::cout << "JackLoopbackDriver state" << std::endl;
  42. std::cout << "Input ports" << std::endl;
  43. for (i = 0; i < fPlaybackChannels; i++) {
  44. port_index = fCapturePortList[i];
  45. JackPort* port = fGraphManager->GetPort(port_index);
  46. std::cout << port->GetName() << std::endl;
  47. if (fGraphManager->GetConnectionsNum(port_index)) {}
  48. }
  49. std::cout << "Output ports" << std::endl;
  50. for (i = 0; i < fCaptureChannels; i++) {
  51. port_index = fPlaybackPortList[i];
  52. JackPort* port = fGraphManager->GetPort(port_index);
  53. std::cout << port->GetName() << std::endl;
  54. if (fGraphManager->GetConnectionsNum(port_index)) {}
  55. }
  56. }
  57. } // end of namespace
  58. /*
  59. #ifdef __cplusplus
  60. extern "C" {
  61. #endif
  62. jack_driver_desc_t * driver_get_descriptor ()
  63. {
  64. jack_driver_desc_t * desc;
  65. jack_driver_param_desc_t * params;
  66. unsigned int i;
  67. desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t));
  68. strcpy (desc->name, "dummy");
  69. desc->nparams = 5;
  70. params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  71. i = 0;
  72. strcpy (params[i].name, "capture");
  73. params[i].character = 'C';
  74. params[i].type = JackDriverParamUInt;
  75. params[i].value.ui = 2U;
  76. strcpy (params[i].short_desc, "Number of capture ports");
  77. strcpy (params[i].long_desc, params[i].short_desc);
  78. i++;
  79. strcpy (params[i].name, "playback");
  80. params[i].character = 'P';
  81. params[i].type = JackDriverParamUInt;
  82. params[1].value.ui = 2U;
  83. strcpy (params[i].short_desc, "Number of playback ports");
  84. strcpy (params[i].long_desc, params[i].short_desc);
  85. i++;
  86. strcpy (params[i].name, "rate");
  87. params[i].character = 'r';
  88. params[i].type = JackDriverParamUInt;
  89. params[i].value.ui = 48000U;
  90. strcpy (params[i].short_desc, "Sample rate");
  91. strcpy (params[i].long_desc, params[i].short_desc);
  92. i++;
  93. strcpy (params[i].name, "period");
  94. params[i].character = 'p';
  95. params[i].type = JackDriverParamUInt;
  96. params[i].value.ui = 1024U;
  97. strcpy (params[i].short_desc, "Frames per period");
  98. strcpy (params[i].long_desc, params[i].short_desc);
  99. i++;
  100. strcpy (params[i].name, "wait");
  101. params[i].character = 'w';
  102. params[i].type = JackDriverParamUInt;
  103. params[i].value.ui = 21333U;
  104. strcpy (params[i].short_desc,
  105. "Number of usecs to wait between engine processes");
  106. strcpy (params[i].long_desc, params[i].short_desc);
  107. desc->params = params;
  108. return desc;
  109. }
  110. Jack::JackDriverClientInterface* driver_initialize(Jack::JackEngine* engine, Jack::JackSynchro** table, const JSList* params)
  111. {
  112. jack_nframes_t sample_rate = 48000;
  113. jack_nframes_t period_size = 1024;
  114. unsigned int capture_ports = 2;
  115. unsigned int playback_ports = 2;
  116. const JSList * node;
  117. const jack_driver_param_t * param;
  118. for (node = params; node; node = jack_slist_next (node)) {
  119. param = (const jack_driver_param_t *) node->data;
  120. switch (param->character) {
  121. case 'C':
  122. capture_ports = param->value.ui;
  123. break;
  124. case 'P':
  125. playback_ports = param->value.ui;
  126. break;
  127. case 'r':
  128. sample_rate = param->value.ui;
  129. break;
  130. case 'p':
  131. period_size = param->value.ui;
  132. break;
  133. }
  134. }
  135. Jack::JackDriverClientInterface* driver = new Jack::JackLoopbackDriver("loopback", engine, table);
  136. if (driver->Open(period_size, sample_rate, 1, 1, capture_ports, playback_ports, "loopback") == 0) {
  137. return driver;
  138. } else {
  139. delete driver;
  140. return NULL;
  141. }
  142. }
  143. #ifdef __cplusplus
  144. }
  145. #endif
  146. */