void SC_JackDriver::Reset(double sampleRate, int bufferSize) { mSampleRate = mSmoothSampleRate = sampleRate; mNumSamplesPerCallback = bufferSize; World_SetSampleRate(mWorld, mSampleRate); mBuffersPerSecond = mSampleRate / mNumSamplesPerCallback; mMaxPeakCounter = (int)mBuffersPerSecond; mOSCincrement = (int64)(mOSCincrementNumerator / mSampleRate); #ifdef SC_JACK_USE_DLL mDLL.Reset( mSampleRate, mNumSamplesPerCallback, SC_TIME_DLL_BW, secondsSinceEpoch(getTime())); #endif }
QcepImageDataBase::QcepImageDataBase(QcepSettingsSaverWPtr saver, int width, int height, int size) : QcepDataObject(saver, tr("image"), size), m_Width(saver, this, "width", width, "Image Width"), m_Height(saver, this, "height", height, "Image Height"), m_DataType(saver, this, "dataType", UndefinedData, "Data Type of Image"), m_FileBase(saver, this, "fileBase", "", "File Base of Image"), m_Title(saver, this, "title", "", "Title of Image"), m_ReadoutMode(saver, this, "readoutMode", 0, "Image Readout Mode"), m_ExposureTime(saver, this, "exposureTime", 0, "Image Exposure Time"), m_SummedExposures(saver, this, "summedExposures", 0, "Summed Exposures in Image"), m_ImageSequenceNumber(saver, this, "imageSequenceNumber", -1, "Image Sequence Number"), m_ImageNumber(saver, this, "imageNumber", 0, "Image Number"), m_PhaseNumber(saver, this, "phaseNumber", -1, "Image Phase Number"), m_NPhases(saver, this, "nPhases", -1, "Number of Image Phases"), m_DateTime(saver, this, "dateTime", QDateTime::currentDateTime(), "Image Creation Date and Time"), m_TimeStamp(saver, this, "timeStamp", secondsSinceEpoch(), "Image creation time (secs after UNIX epoch)"), m_HBinning(saver, this, "hBinning", 1, "Image Horizontal Binning Factor"), m_VBinning(saver, this, "vBinning", 1, "Image Vertical Binning Factor"), m_CameraGain(saver, this, "cameraGain", 0, "Image Detector Gain"), m_Triggered(saver, this, "triggered", 0, "Triggered Flag"), m_UserComment1(saver, this,"userComment1","", "User Comment 1"), m_UserComment2(saver, this,"userComment2","", "User Comment 2"), m_UserComment3(saver, this,"userComment3","", "User Comment 3"), m_UserComment4(saver, this,"userComment4","", "User Comment 4"), m_Normalization(saver, this, "normalization", QcepDoubleList(), "Normalization Values"), m_ExtraInputs(saver, this, "extraInputs", QcepDoubleList(), "Extra Input Values"), m_Used(saver, this, "used", true, "Image Used?"), m_ImageCounter(allocCount.fetchAndAddOrdered(1)), m_Mutex(QMutex::Recursive), m_Saver(saver) { set_Type("Image"); if (qcepDebug(DEBUG_IMAGE_CONSTRUCTORS)) { printf("QcepImageDataBase::QcepImageDataBase(%p)\n", this); } QcepAllocator::allocate(size); }
void SC_JackDriver::Run() { jack_client_t* client = mClient; World* world = mWorld; #ifdef SC_JACK_USE_DLL mDLL.Update(secondsSinceEpoch(getTime())); #if SC_JACK_DEBUG_DLL static int tick = 0; if (++tick >= 10) { tick = 0; scprintf("DLL: t %.6f p %.9f sr %.6f e %.9f avg(e) %.9f inc %.9f\n", mDLL.PeriodTime(), mDLL.Period(), mDLL.SampleRate(), mDLL.Error(), mDLL.AvgError(), mOSCincrement * kOSCtoSecs); } #endif #else HostTime hostTime = getTime(); double hostSecs = secondsSinceEpoch(hostTime); double sampleTime = (double)(jack_frame_time(client) + jack_frames_since_cycle_start(client)); if (mStartHostSecs == 0) { mStartHostSecs = hostSecs; mStartSampleTime = sampleTime; } else { double instSampleRate = (sampleTime - mPrevSampleTime) / (hostSecs - mPrevHostSecs); double smoothSampleRate = mSmoothSampleRate; smoothSampleRate = smoothSampleRate + 0.002 * (instSampleRate - smoothSampleRate); if (fabs(smoothSampleRate - mSampleRate) > 10.) { smoothSampleRate = mSampleRate; } mOSCincrement = (int64)(mOSCincrementNumerator / smoothSampleRate); mSmoothSampleRate = smoothSampleRate; #if 0 double avgSampleRate = (sampleTime - mStartSampleTime)/(hostSecs - mStartHostSecs); double jitter = (smoothSampleRate * (hostSecs - mPrevHostSecs)) - (sampleTime - mPrevSampleTime); double drift = (smoothSampleRate - mSampleRate) * (hostSecs - mStartHostSecs); #endif } mPrevHostSecs = hostSecs; mPrevSampleTime = sampleTime; #endif try { mFromEngine.Free(); mToEngine.Perform(); mOscPacketsToEngine.Perform(); int numInputs = mInputList->mSize; int numOutputs = mOutputList->mSize; jack_port_t **inPorts = mInputList->mPorts; jack_port_t **outPorts = mOutputList->mPorts; sc_jack_sample_t **inBuffers = mInputList->mBuffers; sc_jack_sample_t **outBuffers = mOutputList->mBuffers; int numSamples = NumSamplesPerCallback(); int bufFrames = mWorld->mBufLength; int numBufs = numSamples / bufFrames; float *inBuses = mWorld->mAudioBus + mWorld->mNumOutputs * bufFrames; float *outBuses = mWorld->mAudioBus; int32 *inTouched = mWorld->mAudioBusTouched + mWorld->mNumOutputs; int32 *outTouched = mWorld->mAudioBusTouched; int minInputs = sc_min(numInputs, (int)mWorld->mNumInputs); int minOutputs = sc_min(numOutputs, (int)mWorld->mNumOutputs); int bufFramePos = 0; // cache I/O buffers for (int i = 0; i < minInputs; ++i) { inBuffers[i] = (sc_jack_sample_t*)jack_port_get_buffer(inPorts[i], numSamples); } for (int i = 0; i < minOutputs; ++i) { outBuffers[i] = (sc_jack_sample_t*)jack_port_get_buffer(outPorts[i], numSamples); } // main loop #ifdef SC_JACK_USE_DLL int64 oscTime = mOSCbuftime = (int64)((mDLL.PeriodTime() - mMaxOutputLatency) * kSecondsToOSCunits + .5); // int64 oscInc = mOSCincrement = (int64)(mOSCincrementNumerator / mDLL.SampleRate()); int64 oscInc = mOSCincrement = (int64)((mDLL.Period() / numBufs) * kSecondsToOSCunits + .5); mSmoothSampleRate = mDLL.SampleRate(); double oscToSamples = mOSCtoSamples = mSmoothSampleRate * kOSCtoSecs /* 1/pow(2,32) */; #else int64 oscTime = mOSCbuftime = OSCTime(hostTime) - (int64)(mMaxOutputLatency * kSecondsToOSCunits + .5); int64 oscInc = mOSCincrement; double oscToSamples = mOSCtoSamples; #endif for (int i = 0; i < numBufs; ++i, mWorld->mBufCounter++, bufFramePos += bufFrames) { int32 bufCounter = mWorld->mBufCounter; int32 *tch; // copy+touch inputs tch = inTouched; for (int k = 0; k < minInputs; ++k) { sc_jack_sample_t *src = inBuffers[k] + bufFramePos; float *dst = inBuses + k * bufFrames; for (int n = 0; n < bufFrames; ++n) { *dst++ = *src++; } *tch++ = bufCounter; } // run engine int64 schedTime; int64 nextTime = oscTime + oscInc; while ((schedTime = mScheduler.NextTime()) <= nextTime) { float diffTime = (float)(schedTime - oscTime) * oscToSamples + 0.5; float diffTimeFloor = floor(diffTime); world->mSampleOffset = (int)diffTimeFloor; world->mSubsampleOffset = diffTime - diffTimeFloor; if (world->mSampleOffset < 0) world->mSampleOffset = 0; else if (world->mSampleOffset >= world->mBufLength) world->mSampleOffset = world->mBufLength-1; SC_ScheduledEvent event = mScheduler.Remove(); event.Perform(); } world->mSampleOffset = 0; world->mSubsampleOffset = 0.f; World_Run(world); // copy touched outputs tch = outTouched; for (int k = 0; k < minOutputs; ++k) { sc_jack_sample_t *dst = outBuffers[k] + bufFramePos; if (*tch++ == bufCounter) { float *src = outBuses + k * bufFrames; for (int n = 0; n < bufFrames; ++n) { *dst++ = *src++; } } else { for (int n = 0; n < bufFrames; ++n) { *dst++ = 0.0f; } } } // advance OSC time mOSCbuftime = oscTime = nextTime; } } catch (std::exception& exc) { scprintf("%s: exception in real time: %s\n", kJackDriverIdent, exc.what()); } catch (...) { scprintf("%s: unknown exception in real time\n", kJackDriverIdent); } double cpuUsage = (double)jack_cpu_load(mClient); mAvgCPU = mAvgCPU + 0.1 * (cpuUsage - mAvgCPU); if (cpuUsage > mPeakCPU || --mPeakCounter <= 0) { mPeakCPU = cpuUsage; mPeakCounter = mMaxPeakCounter; } mAudioSync.Signal(); }