git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1324 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.61
| @@ -50,6 +50,11 @@ struct JackEngineControl : public JackShmMem | |||
| bool fSyncMode; | |||
| bool fVerbose; | |||
| void InitFrameTime() | |||
| { | |||
| fFrameTimer.InitFrameTime(); | |||
| } | |||
| void IncFrameTime(jack_time_t callback_usecs) | |||
| { | |||
| fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs); | |||
| @@ -36,7 +36,7 @@ JackTimer::JackTimer() | |||
| fSecondOrderIntegrator = 0.0f; | |||
| } | |||
| void JackFrameTimer::Init() | |||
| void JackFrameTimer::InitFrameTime() | |||
| { | |||
| fFirstWakeUp = true; | |||
| } | |||
| @@ -44,23 +44,13 @@ void JackFrameTimer::Init() | |||
| void JackFrameTimer::IncFrameTime(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs) | |||
| { | |||
| if (fFirstWakeUp) { | |||
| InitFrameTime(callback_usecs, period_usecs); | |||
| InitFrameTimeAux(callback_usecs, period_usecs); | |||
| fFirstWakeUp = false; | |||
| } else { | |||
| IncFrameTimeAux(nframes, callback_usecs, period_usecs); | |||
| } | |||
| } | |||
| void JackFrameTimer::InitFrameTime(jack_time_t callback_usecs, jack_time_t period_usecs) | |||
| { | |||
| JackTimer* timer = WriteNextStateStart(); | |||
| timer->fSecondOrderIntegrator = 0.0f; | |||
| timer->fCurrentCallback = callback_usecs; | |||
| timer->fNextWakeUp = callback_usecs + period_usecs; | |||
| WriteNextStateStop(); | |||
| TrySwitchState(); | |||
| } | |||
| void JackFrameTimer::ResetFrameTime(jack_nframes_t frames_rate, jack_time_t callback_usecs, jack_time_t period_usecs) | |||
| { | |||
| if (!fFirstWakeUp) { // ResetFrameTime may be called by a xrun/delayed wakeup on the first cycle | |||
| @@ -75,20 +65,6 @@ void JackFrameTimer::ResetFrameTime(jack_nframes_t frames_rate, jack_time_t call | |||
| } | |||
| } | |||
| void JackFrameTimer::IncFrameTimeAux(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs) | |||
| { | |||
| JackTimer* timer = WriteNextStateStart(); | |||
| float delta = (int64_t)callback_usecs - (int64_t)timer->fNextWakeUp; | |||
| timer->fCurrentWakeup = timer->fNextWakeUp; | |||
| timer->fCurrentCallback = callback_usecs; | |||
| timer->fFrames += nframes; | |||
| timer->fSecondOrderIntegrator += 0.5f * timer->fFilterCoefficient * delta; | |||
| timer->fNextWakeUp = timer->fCurrentWakeup + period_usecs + (int64_t) floorf((timer->fFilterCoefficient * (delta + timer->fSecondOrderIntegrator))); | |||
| timer->fInitialized = true; | |||
| WriteNextStateStop(); | |||
| TrySwitchState(); | |||
| } | |||
| /* | |||
| Use the state returned by ReadCurrentState and check that the state was not changed during the read operation. | |||
| The operation is lock-free since there is no intermediate state in the write operation that could cause the | |||
| @@ -105,5 +81,31 @@ void JackFrameTimer::ReadFrameTime(JackTimer* timer) | |||
| } while (cur_index != next_index); // Until a coherent state has been read | |||
| } | |||
| // Internal | |||
| void JackFrameTimer::InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs) | |||
| { | |||
| JackTimer* timer = WriteNextStateStart(); | |||
| timer->fSecondOrderIntegrator = 0.0f; | |||
| timer->fCurrentCallback = callback_usecs; | |||
| timer->fNextWakeUp = callback_usecs + period_usecs; | |||
| WriteNextStateStop(); | |||
| TrySwitchState(); | |||
| } | |||
| void JackFrameTimer::IncFrameTimeAux(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs) | |||
| { | |||
| JackTimer* timer = WriteNextStateStart(); | |||
| float delta = (int64_t)callback_usecs - (int64_t)timer->fNextWakeUp; | |||
| timer->fCurrentWakeup = timer->fNextWakeUp; | |||
| timer->fCurrentCallback = callback_usecs; | |||
| timer->fFrames += nframes; | |||
| timer->fSecondOrderIntegrator += 0.5f * timer->fFilterCoefficient * delta; | |||
| timer->fNextWakeUp = timer->fCurrentWakeup + period_usecs + (int64_t) floorf((timer->fFilterCoefficient * (delta + timer->fSecondOrderIntegrator))); | |||
| timer->fInitialized = true; | |||
| WriteNextStateStop(); | |||
| TrySwitchState(); | |||
| } | |||
| } // end of namespace | |||
| @@ -60,6 +60,7 @@ class JackFrameTimer : public JackAtomicState<JackTimer> | |||
| bool fFirstWakeUp; | |||
| void IncFrameTimeAux(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs); | |||
| void InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs); | |||
| public: | |||
| @@ -68,8 +69,7 @@ class JackFrameTimer : public JackAtomicState<JackTimer> | |||
| ~JackFrameTimer() | |||
| {} | |||
| void Init(); | |||
| void InitFrameTime(jack_time_t callback_usecs, jack_time_t period_usecs); | |||
| void InitFrameTime(); | |||
| void ResetFrameTime(jack_nframes_t frames_rate, jack_time_t callback_usecs, jack_time_t period_usecs); | |||
| void IncFrameTime(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs); | |||
| void ReadFrameTime(JackTimer* timer); | |||
| @@ -17,10 +17,10 @@ along with this program; if not, write to the Free Software | |||
| Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
| */ | |||
| #ifdef WIN32 | |||
| #pragma warning (disable : 4786) | |||
| #endif | |||
| #ifdef WIN32 | |||
| #pragma warning (disable : 4786) | |||
| #endif | |||
| #include "JackServer.h" | |||
| #include "JackTime.h" | |||
| @@ -178,7 +178,7 @@ int JackServer::Close() | |||
| int JackServer::Start() | |||
| { | |||
| JackLog("JackServer::Start\n"); | |||
| fEngineControl->fFrameTimer.Init(); | |||
| fEngineControl->InitFrameTime(); | |||
| return fAudioDriver->Start(); | |||
| } | |||
| @@ -189,7 +189,7 @@ int JackServer::Stop() | |||
| } | |||
| int JackServer::Activate(int refnum) | |||
| { | |||
| { | |||
| int fw_refnum = fFreewheelDriver->GetClientControl()->fRefNum; | |||
| fGraphManager->DirectConnect(fw_refnum, refnum); | |||
| fGraphManager->DirectConnect(refnum, fw_refnum); | |||
| @@ -197,27 +197,27 @@ int JackServer::Activate(int refnum) | |||
| } | |||
| // Disconnection from the FW must be done in last otherwise an intermediate "unconnected" | |||
| // (thus unactivated) state may happen where the client is still checked for its end. | |||
| int JackServer::Deactivate(int refnum) | |||
| { | |||
| int res = fEngine->ClientDeactivate(refnum); | |||
| int fw_refnum = fFreewheelDriver->GetClientControl()->fRefNum; | |||
| // Disconnect only when needed | |||
| if (fGraphManager->IsDirectConnection(refnum, fw_refnum)) { | |||
| fGraphManager->DirectDisconnect(refnum, fw_refnum); | |||
| } else { | |||
| JackLog("JackServer::Deactivate: client = %ld was not activated \n", refnum); | |||
| } | |||
| // Disconnect only when needed | |||
| if (fGraphManager->IsDirectConnection(fw_refnum, refnum)) { | |||
| fGraphManager->DirectDisconnect(fw_refnum, refnum); | |||
| } else { | |||
| JackLog("JackServer::Deactivate: client = %ld was not activated \n", refnum); | |||
| } | |||
| return res; | |||
| // (thus unactivated) state may happen where the client is still checked for its end. | |||
| int JackServer::Deactivate(int refnum) | |||
| { | |||
| int res = fEngine->ClientDeactivate(refnum); | |||
| int fw_refnum = fFreewheelDriver->GetClientControl()->fRefNum; | |||
| // Disconnect only when needed | |||
| if (fGraphManager->IsDirectConnection(refnum, fw_refnum)) { | |||
| fGraphManager->DirectDisconnect(refnum, fw_refnum); | |||
| } else { | |||
| JackLog("JackServer::Deactivate: client = %ld was not activated \n", refnum); | |||
| } | |||
| // Disconnect only when needed | |||
| if (fGraphManager->IsDirectConnection(fw_refnum, refnum)) { | |||
| fGraphManager->DirectDisconnect(fw_refnum, refnum); | |||
| } else { | |||
| JackLog("JackServer::Deactivate: client = %ld was not activated \n", refnum); | |||
| } | |||
| return res; | |||
| } | |||
| int JackServer::SetBufferSize(jack_nframes_t buffer_size) | |||
| @@ -233,12 +233,12 @@ int JackServer::SetBufferSize(jack_nframes_t buffer_size) | |||
| if (fAudioDriver->SetBufferSize(buffer_size) == 0) { | |||
| fFreewheelDriver->SetBufferSize(buffer_size); | |||
| fEngine->NotifyBufferSize(buffer_size); | |||
| fEngineControl->fFrameTimer.Init(); | |||
| fEngineControl->InitFrameTime(); | |||
| return fAudioDriver->Start(); | |||
| } else { // Failure: restore current value | |||
| jack_error("Cannot SetBufferSize for audio driver, restore current value %ld", current_buffer_size); | |||
| fFreewheelDriver->SetBufferSize(current_buffer_size); | |||
| fEngineControl->fFrameTimer.Init(); | |||
| fEngineControl->InitFrameTime(); | |||
| return fAudioDriver->Start(); | |||
| } | |||
| } | |||
| @@ -268,7 +268,7 @@ int JackServer::SetFreewheel(bool onoff) | |||
| fGraphManager->Restore(fState); // Restore previous connection state | |||
| fEngine->NotifyFreewheel(onoff); | |||
| fFreewheelDriver->SetMaster(false); | |||
| fEngineControl->fFrameTimer.Init(); | |||
| fEngineControl->InitFrameTime(); | |||
| return fAudioDriver->Start(); | |||
| } | |||
| } else { | |||