00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JackTimedDriver.h"
00022 #include "JackEngineControl.h"
00023 #include "JackTime.h"
00024 #include "JackCompilerDeps.h"
00025 #include <iostream>
00026 #include <unistd.h>
00027 #include <math.h>
00028
00029 namespace Jack
00030 {
00031
00032 int JackTimedDriver::FirstCycle(jack_time_t cur_time_usec)
00033 {
00034 fAnchorTimeUsec = cur_time_usec;
00035 return int((double(fEngineControl->fBufferSize) * 1000000) / double(fEngineControl->fSampleRate));
00036 }
00037
00038 int JackTimedDriver::CurrentCycle(jack_time_t cur_time_usec)
00039 {
00040 return int(((double(fCycleCount) * double(fEngineControl->fBufferSize) * 1000000.) / double(fEngineControl->fSampleRate)) - (cur_time_usec - fAnchorTimeUsec));
00041 }
00042
00043 int JackTimedDriver::Start()
00044 {
00045 fCycleCount = 0;
00046 return JackAudioDriver::Start();
00047 }
00048
00049 void JackTimedDriver::ProcessWait()
00050 {
00051 jack_time_t cur_time_usec = GetMicroSeconds();
00052 int wait_time_usec;
00053
00054 if (fCycleCount++ == 0) {
00055 wait_time_usec = FirstCycle(cur_time_usec);
00056 } else {
00057 wait_time_usec = CurrentCycle(cur_time_usec);
00058 }
00059
00060 if (wait_time_usec < 0) {
00061 NotifyXRun(cur_time_usec, float(cur_time_usec - fBeginDateUst));
00062 fCycleCount = 0;
00063 wait_time_usec = 0;
00064 jack_error("JackTimedDriver::Process XRun = %ld usec", (cur_time_usec - fBeginDateUst));
00065 }
00066
00067
00068 JackSleep(wait_time_usec);
00069 }
00070
00071 int JackWaiterDriver::ProcessNull()
00072 {
00073 JackDriver::CycleTakeBeginTime();
00074
00075
00076 if (fEngineControl->fSyncMode) {
00077 ProcessGraphSync();
00078 } else {
00079 ProcessGraphAsync();
00080 }
00081
00082
00083 JackDriver::CycleTakeEndTime();
00084
00085 ProcessWait();
00086 return 0;
00087 }
00088
00089 }