summaryrefslogtreecommitdiff
path: root/common/JackLoopbackDriver.cpp
diff options
context:
space:
mode:
authorsletz <sletz@0c269be4-1314-0410-8aa9-9f06e86f4224>2009-07-18 07:54:18 +0000
committersletz <sletz@0c269be4-1314-0410-8aa9-9f06e86f4224>2009-07-18 07:54:18 +0000
commitc970e7e0fe57d6879afaec55220c24b04bef33d7 (patch)
treefb00e689994dbe8ce9ce4ad2fb9926ceda0f4826 /common/JackLoopbackDriver.cpp
parentbfecb007bdc0e79bf68ca88d5d6d8141eeb34803 (diff)
downloadjack2-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.cpp69
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