diff options
author | sletz <sletz@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2009-07-18 07:54:18 +0000 |
---|---|---|
committer | sletz <sletz@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2009-07-18 07:54:18 +0000 |
commit | c970e7e0fe57d6879afaec55220c24b04bef33d7 (patch) | |
tree | fb00e689994dbe8ce9ce4ad2fb9926ceda0f4826 /common/JackLoopbackDriver.cpp | |
parent | bfecb007bdc0e79bf68ca88d5d6d8141eeb34803 (diff) | |
download | jack2-c970e7e0fe57d6879afaec55220c24b04bef33d7.tar.gz |
JackLoopbackDriver reborn as a dynamicalled loadable separated backend.
git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3605 0c269be4-1314-0410-8aa9-9f06e86f4224
Diffstat (limited to 'common/JackLoopbackDriver.cpp')
-rw-r--r-- | common/JackLoopbackDriver.cpp | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/common/JackLoopbackDriver.cpp b/common/JackLoopbackDriver.cpp index 3c9df5b0..38cba8ea 100644 --- a/common/JackLoopbackDriver.cpp +++ b/common/JackLoopbackDriver.cpp @@ -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 |