/* Copyright (C) 2001 Paul Davis Copyright (C) 2004-2008 Grame This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "JackTimedDriver.h" #include "JackEngineControl.h" #include "JackTime.h" #include "JackCompilerDeps.h" #include #include #include namespace Jack { int JackTimedDriver::FirstCycle(jack_time_t cur_time_usec) { fAnchorTimeUsec = cur_time_usec; return int((double(fEngineControl->fBufferSize) * 1000000) / double(fEngineControl->fSampleRate)); } int JackTimedDriver::CurrentCycle(jack_time_t cur_time_usec) { return int(((double(fCycleCount) * double(fEngineControl->fBufferSize) * 1000000.) / double(fEngineControl->fSampleRate)) - (cur_time_usec - fAnchorTimeUsec)); } int JackTimedDriver::Start() { fCycleCount = 0; return JackAudioDriver::Start(); } void JackTimedDriver::ProcessWait() { jack_time_t cur_time_usec = GetMicroSeconds(); int wait_time_usec; if (fCycleCount++ == 0) { wait_time_usec = FirstCycle(cur_time_usec); } else { wait_time_usec = CurrentCycle(cur_time_usec); } if (wait_time_usec < 0) { NotifyXRun(cur_time_usec, float(cur_time_usec - fBeginDateUst)); fCycleCount = 0; wait_time_usec = 0; jack_error("JackTimedDriver::Process XRun = %ld usec", (cur_time_usec - fBeginDateUst)); } //jack_log("JackTimedDriver::Process wait_time = %d", wait_time_usec); JackSleep(wait_time_usec); } int JackWaiterDriver::ProcessNull() { JackDriver::CycleTakeBeginTime(); // Graph processing without Read/Write if (fEngineControl->fSyncMode) { ProcessGraphSync(); } else { ProcessGraphAsync(); } // Keep end cycle time JackDriver::CycleTakeEndTime(); ProcessWait(); return 0; } void JackRestarterDriver::SetRestartDriver(JackDriver* driver) { fRestartDriver = driver; } int JackRestarterDriver::RestartWait() { if (!fRestartDriver) { jack_error("JackRestartedDriver::RestartWait driver not set"); return -1; } return fRestartDriver->Start(); } } // end of namespace