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 "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(); // Take callback date here
00065     JackAudioDriver::Process();
00066     usleep(std::max(0L, long(fWaitTime - (GetMicroSeconds() - fLastWaitUst))));
00067     return 0;
00068 }
00069 
00070 } // end of namespace
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) // Not set
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

Generated on Thu Feb 14 11:16:01 2008 for Jackdmp by  doxygen 1.5.1