|
|
@@ -19,7 +19,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "JackSystemDeps.h" |
|
|
|
#include "JackServerGlobals.h" |
|
|
|
#include "JackLoopbackDriver.h" |
|
|
|
#include "JackDriverLoader.h" |
|
|
|
#include "JackEngineControl.h" |
|
|
|
#include "JackGraphManager.h" |
|
|
|
#include "JackError.h" |
|
|
@@ -31,8 +33,6 @@ namespace Jack |
|
|
|
|
|
|
|
int JackLoopbackDriver::Process() |
|
|
|
{ |
|
|
|
assert(fCaptureChannels == fPlaybackChannels); |
|
|
|
|
|
|
|
// Loopback copy |
|
|
|
for (int i = 0; i < fCaptureChannels; i++) { |
|
|
|
memcpy(GetInputBuffer(i), GetOutputBuffer(i), sizeof(float) * fEngineControl->fBufferSize); |
|
|
@@ -40,7 +40,7 @@ int JackLoopbackDriver::Process() |
|
|
|
|
|
|
|
fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); // Signal all clients |
|
|
|
if (fEngineControl->fSyncMode) { |
|
|
|
if (fGraphManager->SuspendRefNum(&fClientControl, fSynchroTable, fEngineControl->fTimeOutUsecs) < 0) { |
|
|
|
if (fGraphManager->SuspendRefNum(&fClientControl, fSynchroTable, DRIVER_TIMEOUT_FACTOR * fEngineControl->fTimeOutUsecs) < 0) { |
|
|
|
jack_error("JackLoopbackDriver::ProcessSync SuspendRefNum error"); |
|
|
|
return -1; |
|
|
|
} |
|
|
@@ -49,3 +49,66 @@ int JackLoopbackDriver::Process() |
|
|
|
} |
|
|
|
|
|
|
|
} // end of namespace |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
extern "C" |
|
|
|
{ |
|
|
|
#endif |
|
|
|
|
|
|
|
SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() |
|
|
|
{ |
|
|
|
jack_driver_desc_t * desc; |
|
|
|
unsigned int i; |
|
|
|
|
|
|
|
desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); |
|
|
|
strcpy(desc->name, "loopback"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 |
|
|
|
strcpy(desc->desc, "Loppback backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 |
|
|
|
|
|
|
|
desc->nparams = 1; |
|
|
|
desc->params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); |
|
|
|
|
|
|
|
i = 0; |
|
|
|
strcpy(desc->params[i].name, "channels"); |
|
|
|
desc->params[i].character = 'c'; |
|
|
|
desc->params[i].type = JackDriverParamInt; |
|
|
|
desc->params[i].value.ui = 0; |
|
|
|
strcpy(desc->params[i].short_desc, "Loopback ports"); |
|
|
|
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); |
|
|
|
|
|
|
|
return desc; |
|
|
|
} |
|
|
|
|
|
|
|
SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) |
|
|
|
{ |
|
|
|
const JSList * node; |
|
|
|
const jack_driver_param_t * param; |
|
|
|
int channels = 2; |
|
|
|
|
|
|
|
for (node = params; node; node = jack_slist_next (node)) { |
|
|
|
param = (const jack_driver_param_t *) node->data; |
|
|
|
|
|
|
|
switch (param->character) { |
|
|
|
|
|
|
|
case 'c': |
|
|
|
channels = param->value.ui; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Jack::JackDriverClientInterface* driver = new Jack::JackLoopbackDriver(engine, table); |
|
|
|
if (driver->Open(Jack::JackServerGlobals::fInstance->GetEngineControl()->fBufferSize, |
|
|
|
Jack::JackServerGlobals::fInstance->GetEngineControl()->fSampleRate, |
|
|
|
1, 1, |
|
|
|
channels, channels, |
|
|
|
false, |
|
|
|
"loopback", "loopback", 0, 0) == 0) { |
|
|
|
return driver; |
|
|
|
} else { |
|
|
|
delete driver; |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
} |
|
|
|
#endif |