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 { | |||