00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JackDummyDriver.h"
00022 #include "JackEngineControl.h"
00023 #include "JackGraphManager.h"
00024 #include "driver_interface.h"
00025 #include "JackDriverLoader.h"
00026 #include "JackThreadedDriver.h"
00027 #include <iostream>
00028 #include <unistd.h>
00029
00030 namespace Jack
00031 {
00032
00033 int JackDummyDriver::Open(jack_nframes_t nframes,
00034 jack_nframes_t samplerate,
00035 bool capturing,
00036 bool playing,
00037 int inchannels,
00038 int outchannels,
00039 bool monitor,
00040 const char* capture_driver_name,
00041 const char* playback_driver_name,
00042 jack_nframes_t capture_latency,
00043 jack_nframes_t playback_latency)
00044 {
00045 int res = JackAudioDriver::Open(nframes,
00046 samplerate,
00047 capturing,
00048 playing,
00049 inchannels,
00050 outchannels,
00051 monitor,
00052 capture_driver_name,
00053 playback_driver_name,
00054 capture_latency,
00055 playback_latency);
00056 fEngineControl->fPeriod = 0;
00057 fEngineControl->fComputation = 500 * 1000;
00058 fEngineControl->fConstraint = 500 * 1000;
00059 return res;
00060 }
00061
00062 int JackDummyDriver::Process()
00063 {
00064 fLastWaitUst = GetMicroSeconds();
00065 JackAudioDriver::Process();
00066 usleep(std::max(0L, long(fWaitTime - (GetMicroSeconds() - fLastWaitUst))));
00067 return 0;
00068 }
00069
00070 }
00071
00072 #ifdef __cplusplus
00073 extern "C"
00074 {
00075 #endif
00076
00077 jack_driver_desc_t * driver_get_descriptor () {
00078 jack_driver_desc_t * desc;
00079 unsigned int i;
00080
00081 desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t));
00082 strcpy(desc->name, "dummy");
00083 desc->nparams = 6;
00084 desc->params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
00085
00086 i = 0;
00087 strcpy(desc->params[i].name, "capture");
00088 desc->params[i].character = 'C';
00089 desc->params[i].type = JackDriverParamUInt;
00090 desc->params[i].value.ui = 2U;
00091 strcpy(desc->params[i].short_desc, "Number of capture ports");
00092 strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00093
00094 i++;
00095 strcpy(desc->params[i].name, "playback");
00096 desc->params[i].character = 'P';
00097 desc->params[i].type = JackDriverParamUInt;
00098 desc->params[1].value.ui = 2U;
00099 strcpy(desc->params[i].short_desc, "Number of playback ports");
00100 strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00101
00102 i++;
00103 strcpy(desc->params[i].name, "rate");
00104 desc->params[i].character = 'r';
00105 desc->params[i].type = JackDriverParamUInt;
00106 desc->params[i].value.ui = 48000U;
00107 strcpy(desc->params[i].short_desc, "Sample rate");
00108 strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00109
00110 i++;
00111 strcpy(desc->params[i].name, "monitor");
00112 desc->params[i].character = 'm';
00113 desc->params[i].type = JackDriverParamBool;
00114 desc->params[i].value.i = 0;
00115 strcpy(desc->params[i].short_desc, "Provide monitor ports for the output");
00116 strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00117
00118 i++;
00119 strcpy(desc->params[i].name, "period");
00120 desc->params[i].character = 'p';
00121 desc->params[i].type = JackDriverParamUInt;
00122 desc->params[i].value.ui = 1024U;
00123 strcpy(desc->params[i].short_desc, "Frames per period");
00124 strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00125
00126 i++;
00127 strcpy(desc->params[i].name, "wait");
00128 desc->params[i].character = 'w';
00129 desc->params[i].type = JackDriverParamUInt;
00130 desc->params[i].value.ui = 21333U;
00131 strcpy(desc->params[i].short_desc,
00132 "Number of usecs to wait between engine processes");
00133 strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00134
00135 return desc;
00136 }
00137
00138 Jack::JackDriverClientInterface* driver_initialize(Jack::JackEngine* engine, Jack::JackSynchro** table, const JSList* params) {
00139 jack_nframes_t sample_rate = 48000;
00140 jack_nframes_t period_size = 1024;
00141 unsigned int capture_ports = 2;
00142 unsigned int playback_ports = 2;
00143 unsigned long wait_time = 0;
00144 const JSList * node;
00145 const jack_driver_param_t * param;
00146 bool monitor = false;
00147
00148 for (node = params; node; node = jack_slist_next (node)) {
00149 param = (const jack_driver_param_t *) node->data;
00150
00151 switch (param->character) {
00152
00153 case 'C':
00154 capture_ports = param->value.ui;
00155 break;
00156
00157 case 'P':
00158 playback_ports = param->value.ui;
00159 break;
00160
00161 case 'r':
00162 sample_rate = param->value.ui;
00163 break;
00164
00165 case 'p':
00166 period_size = param->value.ui;
00167 break;
00168
00169 case 'w':
00170 wait_time = param->value.ui;
00171 break;
00172
00173 case 'm':
00174 monitor = param->value.i;
00175 break;
00176 }
00177 }
00178
00179 if (wait_time == 0)
00180 wait_time = (unsigned long)((((float)period_size) / ((float)sample_rate)) * 1000000.0f);
00181
00182 Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackDummyDriver("dummy_pcm", engine, table, wait_time));
00183 if (driver->Open(period_size, sample_rate, 1, 1, capture_ports, playback_ports, monitor, "dummy", "dummy", 0, 0) == 0) {
00184 return driver;
00185 } else {
00186 delete driver;
00187 return NULL;
00188 }
00189 }
00190
00191 #ifdef __cplusplus
00192 }
00193 #endif