|
- /*
- Copyright (C) 2003 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 Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
-
- #ifndef __JackEngineControl__
- #define __JackEngineControl__
-
- #include "JackShmMem.h"
- #include "JackFrameTimer.h"
- #include "JackTransportEngine.h"
- #include "types.h"
- #include <stdio.h>
-
- namespace Jack
- {
-
- class JackClientInterface;
- class JackGraphManager;
-
- #define TIME_POINTS 1000
- #define JACK_ENGINE_ROLLING_COUNT 32
- #define JACK_ENGINE_ROLLING_INTERVAL 1024
-
- /*!
- \brief Timing stucture for a client.
- */
-
- struct JackTimingMeasureClient
- {
- int fRefNum;
- jack_time_t fSignaledAt;
- jack_time_t fAwakeAt;
- jack_time_t fFinishedAt;
- jack_client_state_t fStatus;
- };
-
- /*!
- \brief Timing stucture for a table of clients.
- */
-
- struct JackTimingMeasure
- {
- unsigned int fAudioCycle;
- jack_time_t fEngineTime;
- JackTimingMeasureClient fClientTable[CLIENT_NUM];
- };
-
- /*!
- \brief Engine control in shared memory.
- */
-
- struct JackEngineControl : public JackShmMem
- {
- // Shared state
- jack_nframes_t fBufferSize;
- jack_nframes_t fSampleRate;
- bool fSyncMode;
- bool fTemporary;
- jack_time_t fPeriodUsecs;
- jack_time_t fTimeOutUsecs;
- float fMaxDelayedUsecs;
- float fXrunDelayedUsecs;
- bool fTimeOut;
- bool fRealTime;
- int fPriority;
- char fServerName[64];
- JackTransportEngine fTransport;
- bool fVerbose;
-
- // Timing
- JackTimingMeasure fMeasure[TIME_POINTS];
- jack_time_t fLastTime;
- jack_time_t fCurTime;
- jack_time_t fProcessTime;
- jack_time_t fLastProcessTime;
- jack_time_t fSpareUsecs;
- jack_time_t fMaxUsecs;
- unsigned int fAudioCycle;
- jack_time_t fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT];
- int fRollingClientUsecsCnt;
- int fRollingClientUsecsIndex;
- int fRollingInterval;
- float fCPULoad;
-
- // For OSX thread
- UInt64 fPeriod;
- UInt64 fComputation;
- UInt64 fConstraint;
-
- // Timer
- JackFrameTimer fFrameTimer;
-
- JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name)
- {
- fBufferSize = 512;
- fSampleRate = 48000;
- fPeriodUsecs = jack_time_t(1000000.f / fSampleRate * fBufferSize);
- fSyncMode = sync;
- fTemporary = temporary;
- fTimeOut = (timeout > 0);
- fTimeOutUsecs = timeout * 1000;
- fRealTime = rt;
- fPriority = priority;
- fVerbose = verbose;
- fLastTime = 0;
- fCurTime = 0;
- fProcessTime = 0;
- fLastProcessTime = 0;
- fSpareUsecs = 0;
- fMaxUsecs = 0;
- fAudioCycle = 0;
- ClearTimeMeasures();
- ResetRollingUsecs();
- snprintf(fServerName, sizeof(fServerName), server_name);
- fPeriod = 0;
- fComputation = 0;
- fConstraint = 0;
- fMaxDelayedUsecs = 0.f;
- fXrunDelayedUsecs = 0.f;
- }
- ~JackEngineControl()
- {}
-
- // Cycle
- void CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs);
- void CycleEnd(JackClientInterface** table);
-
- // Timer
- void InitFrameTime();
- void ResetFrameTime(jack_time_t callback_usecs);
- void ReadFrameTime(JackTimer* timer);
-
- // XRun
- void NotifyXRun(float delayed_usecs);
- void ResetXRun();
-
- // Private
- void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager);
- void GetTimeMeasure(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs);
- void ClearTimeMeasures();
- void ResetRollingUsecs();
-
- };
-
- } // end of namespace
-
- #endif
|