Jack2 1.9.6

JackDummyDriver.cpp

00001 /*
00002 Copyright (C) 2001 Paul Davis
00003 Copyright (C) 2004-2008 Grame
00004 
00005 This program is free software; you can redistribute it and/or modify
00006 it under the terms of the GNU General Public License as published by
00007 the Free Software Foundation; either version 2 of the License, or
00008 (at your option) any later version.
00009 
00010 This program is distributed in the hope that it will be useful,
00011 but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 GNU General Public License for more details.
00014 
00015 You should have received a copy of the GNU General Public License
00016 along with this program; if not, write to the Free Software
00017 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 
00019 */
00020 
00021 #include "JackDummyDriver.h"
00022 #include "JackEngineControl.h"
00023 #include "JackGraphManager.h"
00024 #include "JackDriverLoader.h"
00025 #include "JackThreadedDriver.h"
00026 #include "JackCompilerDeps.h"
00027 #include <iostream>
00028 #include <unistd.h>
00029 
00030 namespace Jack
00031 {
00032 
00033 int JackDummyDriver::Open(jack_nframes_t buffer_size,
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     if (JackAudioDriver::Open(buffer_size,
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) == 0) {
00056         fEngineControl->fPeriod = 0;
00057         fEngineControl->fComputation = 500 * 1000;
00058         fEngineControl->fConstraint = 500 * 1000;
00059         return 0;
00060     } else {
00061         return -1;
00062     }
00063 }
00064 
00065 int JackDummyDriver::Process()
00066 {
00067     JackDriver::CycleTakeBeginTime();
00068     JackAudioDriver::Process();
00069     JackSleep(std::max(0L, long(fWaitTime - (GetMicroSeconds() - fBeginDateUst))));
00070     return 0;
00071 }
00072 
00073 int JackDummyDriver::SetBufferSize(jack_nframes_t buffer_size)
00074 {
00075     JackAudioDriver::SetBufferSize(buffer_size);
00076     fWaitTime = (unsigned long)((((float)buffer_size) / ((float)fEngineControl->fSampleRate)) * 1000000.0f);
00077     return 0;
00078 }
00079 
00080 } // end of namespace
00081 
00082 #ifdef __cplusplus
00083 extern "C"
00084 {
00085 #endif
00086 
00087     SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor () {
00088         jack_driver_desc_t * desc;
00089         unsigned int i;
00090 
00091         desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t));
00092         strcpy(desc->name, "dummy");                  // size MUST be less then JACK_DRIVER_NAME_MAX + 1
00093         strcpy(desc->desc, "Timer based backend");    // size MUST be less then JACK_DRIVER_PARAM_DESC + 1
00094 
00095         desc->nparams = 6;
00096         desc->params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
00097 
00098         i = 0;
00099         strcpy(desc->params[i].name, "capture");
00100         desc->params[i].character = 'C';
00101         desc->params[i].type = JackDriverParamUInt;
00102         desc->params[i].value.ui = 2U;
00103         strcpy(desc->params[i].short_desc, "Number of capture ports");
00104         strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00105 
00106         i++;
00107         strcpy(desc->params[i].name, "playback");
00108         desc->params[i].character = 'P';
00109         desc->params[i].type = JackDriverParamUInt;
00110         desc->params[1].value.ui = 2U;
00111         strcpy(desc->params[i].short_desc, "Number of playback ports");
00112         strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00113 
00114         i++;
00115         strcpy(desc->params[i].name, "rate");
00116         desc->params[i].character = 'r';
00117         desc->params[i].type = JackDriverParamUInt;
00118         desc->params[i].value.ui = 48000U;
00119         strcpy(desc->params[i].short_desc, "Sample rate");
00120         strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00121 
00122         i++;
00123         strcpy(desc->params[i].name, "monitor");
00124         desc->params[i].character = 'm';
00125         desc->params[i].type = JackDriverParamBool;
00126         desc->params[i].value.i = 0;
00127         strcpy(desc->params[i].short_desc, "Provide monitor ports for the output");
00128         strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00129 
00130         i++;
00131         strcpy(desc->params[i].name, "period");
00132         desc->params[i].character = 'p';
00133         desc->params[i].type = JackDriverParamUInt;
00134         desc->params[i].value.ui = 1024U;
00135         strcpy(desc->params[i].short_desc, "Frames per period");
00136         strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00137 
00138         i++;
00139         strcpy(desc->params[i].name, "wait");
00140         desc->params[i].character = 'w';
00141         desc->params[i].type = JackDriverParamUInt;
00142         desc->params[i].value.ui = 21333U;
00143         strcpy(desc->params[i].short_desc,
00144                "Number of usecs to wait between engine processes");
00145         strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
00146 
00147         return desc;
00148     }
00149 
00150     SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) {
00151         jack_nframes_t sample_rate = 48000;
00152         jack_nframes_t period_size = 1024;
00153         unsigned int capture_ports = 2;
00154         unsigned int playback_ports = 2;
00155         unsigned long wait_time = 0;
00156         const JSList * node;
00157         const jack_driver_param_t * param;
00158         bool monitor = false;
00159 
00160         for (node = params; node; node = jack_slist_next (node)) {
00161             param = (const jack_driver_param_t *) node->data;
00162 
00163             switch (param->character) {
00164 
00165                 case 'C':
00166                     capture_ports = param->value.ui;
00167                     break;
00168 
00169                 case 'P':
00170                     playback_ports = param->value.ui;
00171                     break;
00172 
00173                 case 'r':
00174                     sample_rate = param->value.ui;
00175                     break;
00176 
00177                 case 'p':
00178                     period_size = param->value.ui;
00179                     break;
00180 
00181                 case 'w':
00182                     wait_time = param->value.ui;
00183                     break;
00184 
00185                 case 'm':
00186                     monitor = param->value.i;
00187                     break;
00188             }
00189         }
00190 
00191         if (wait_time == 0) // Not set
00192             wait_time = (unsigned long)((((float)period_size) / ((float)sample_rate)) * 1000000.0f);
00193 
00194         Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackDummyDriver("system", "dummy_pcm", engine, table, wait_time));
00195         if (driver->Open(period_size, sample_rate, 1, 1, capture_ports, playback_ports, monitor, "dummy", "dummy", 0, 0) == 0) {
00196             return driver;
00197         } else {
00198             delete driver;
00199             return NULL;
00200         }
00201     }
00202 
00203 #ifdef __cplusplus
00204 }
00205 #endif