00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JackSystemDeps.h"
00022 #include "JackLoopbackDriver.h"
00023 #include "JackDriverLoader.h"
00024 #include "JackEngineControl.h"
00025 #include "JackGraphManager.h"
00026 #include "JackError.h"
00027 #include <iostream>
00028 #include <assert.h>
00029
00030 namespace Jack
00031 {
00032
00033
00034
00035 int JackLoopbackDriver::ProcessReadSync()
00036 {
00037 int res = 0;
00038
00039
00040 for (int i = 0; i < fCaptureChannels; i++) {
00041 memcpy(GetInputBuffer(i), GetOutputBuffer(i), sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize);
00042 }
00043
00044 if (ResumeRefNum() < 0) {
00045 jack_error("JackLoopbackDriver::ProcessReadSync - ResumeRefNum error");
00046 res = -1;
00047 }
00048
00049 return res;
00050 }
00051
00052 int JackLoopbackDriver::ProcessWriteSync()
00053 {
00054 if (SuspendRefNum() < 0) {
00055 jack_error("JackLoopbackDriver::ProcessWriteSync SuspendRefNum error");
00056 return -1;
00057 }
00058 return 0;
00059 }
00060
00061 int JackLoopbackDriver::ProcessReadAsync()
00062 {
00063 int res = 0;
00064
00065
00066 for (int i = 0; i < fCaptureChannels; i++) {
00067 memcpy(GetInputBuffer(i), GetOutputBuffer(i), sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize);
00068 }
00069
00070 if (ResumeRefNum() < 0) {
00071 jack_error("JackLoopbackDriver::ProcessReadAsync - ResumeRefNum error");
00072 res = -1;
00073 }
00074
00075 return res;
00076 }
00077
00078 int JackLoopbackDriver::ProcessWriteAsync()
00079 {
00080 return 0;
00081 }
00082
00083 }
00084
00085 #ifdef __cplusplus
00086 extern "C"
00087 {
00088 #endif
00089
00090 SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor()
00091 {
00092 jack_driver_desc_t * desc;
00093 jack_driver_desc_filler_t filler;
00094 jack_driver_param_value_t value;
00095
00096 desc = jack_driver_descriptor_construct("loopback", JackDriverSlave, "Loopback backend", &filler);
00097
00098 value.i = 0;
00099 jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of loopback ports", NULL);
00100
00101 return desc;
00102 }
00103
00104 SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params)
00105 {
00106 const JSList * node;
00107 const jack_driver_param_t * param;
00108 int channels = 2;
00109
00110 for (node = params; node; node = jack_slist_next (node)) {
00111 param = (const jack_driver_param_t *) node->data;
00112
00113 switch (param->character) {
00114
00115 case 'c':
00116 channels = param->value.ui;
00117 break;
00118 }
00119 }
00120
00121 Jack::JackDriverClientInterface* driver = new Jack::JackLoopbackDriver(engine, table);
00122 if (driver->Open(1, 1, channels, channels, false, "loopback", "loopback", 0, 0) == 0) {
00123 return driver;
00124 } else {
00125 delete driver;
00126 return NULL;
00127 }
00128 }
00129
00130 #ifdef __cplusplus
00131 }
00132 #endif