13 #include <samplerate.h>
19 #define rint(x) ((int)(x + 0.5f))
33 mMonoBufferByteSize(0),
35 mAreBuffersAllocated(
false),
36 mDidIAllocateBuffers(
false),
38 mAreBuffersZero(
true),
41 setSize(numChannels, numFrames);
96 #ifdef FVERBOSE_MALLOC
119 #ifdef FVERBOSE_MALLOC
129 }
catch (std::exception ex) {
173 float * bbuffer = NULL;
174 unsigned outBufNum, i;
177 for (outBufNum = 0; outBufNum < numChans; outBufNum++) {
179 for (i = 0; i < numFrames; i++)
188 if ((source.mNumChannels > mNumChannels) || (source.mNumFrames > mNumAlloc)) {
189 logMsg(
"Buffer::copyHeaderFrom(ch %d %d, fr %d %d)",
190 mNumChannels, source.mNumChannels, mNumAlloc, source.mNumFrames);
191 throw RunTimeError(
"Can't reallocate buffers at run-time");
193 mNumChannels = source.mNumChannels;
194 mNumFrames = source.mNumFrames;
195 mMonoBufferByteSize = mNumFrames *
sizeof(
sample);
196 mSequence = source.mSequence;
197 mType = source.mType;
205 mNumChannels = source.mNumChannels;
206 mNumFrames = source.mNumFrames;
207 mNumAlloc = source.mNumAlloc;
208 mMonoBufferByteSize = mNumFrames *
sizeof(
sample);
209 mSequence = source.mSequence;
212 for (
unsigned outBufNum = 0; outBufNum < mNumChannels; outBufNum++) {
213 mBuffers[outBufNum] = source.monoBuffer(outBufNum);
215 mAreBuffersZero =
false;
216 mAreBuffersAllocated =
true;
217 mDidIAllocateBuffers =
false;
223 if ((source.mNumChannels > mNumChannels) || (source.mNumFrames > mNumAlloc)) {
225 mNumChannels, source.mNumChannels, mNumAlloc, source.mNumFrames);
226 throw RunTimeError(
"Can't reallocate buffers at run-time");
228 mNumChannels = source.mNumChannels;
229 mNumFrames = source.mNumFrames;
230 mMonoBufferByteSize = mNumFrames *
sizeof(
sample);
231 for (
unsigned outBufNum = 0; outBufNum < mNumChannels; outBufNum++) {
232 unsigned sBufNum =
csl_min(outBufNum, (source.mNumChannels - 1));
233 memcpy(mBuffers[outBufNum], source.monoBuffer(sBufNum), mMonoBufferByteSize);
235 mAreBuffersZero =
false;
239 if ((source.mNumChannels > mNumChannels) || (source.mNumFrames > mNumAlloc)) {
241 mNumChannels, source.mNumChannels, mNumFrames, source.mNumFrames);
242 throw RunTimeError(
"Can't reallocate buffers at run-time");
244 for (
unsigned outBufNum = 0; outBufNum < mNumChannels; outBufNum++) {
245 unsigned sBufNum =
csl_min(outBufNum, (source.mNumChannels - 1));
246 memcpy(mBuffers[outBufNum], source.monoBuffer(sBufNum), mMonoBufferByteSize);
253 if ((source.mNumChannels > mNumChannels) || ((offset + source.mNumFrames) > mNumAlloc)) {
255 mNumChannels, source.mNumChannels, mNumFrames, source.mNumFrames);
256 throw RunTimeError(
"Can't reallocate buffers at run-time");
258 for (
unsigned outBufNum = 0; outBufNum < mNumChannels; outBufNum++) {
259 unsigned sBufNum =
csl_min(outBufNum, (source.mNumChannels - 1));
260 memcpy(mBuffers[outBufNum] + offset, source.monoBuffer(sBufNum),
261 (source.mNumFrames *
sizeof(
sample)));
270 double src_ratio = (double) toRate / (
double) fromRate;
273 unsigned newLen = (unsigned) (rint(((
double)
mNumFrames) * src_ratio));
274 SRC_STATE * src_state;
282 src_ratio = (double) toRate / (
double) fromRate;
283 if (src_is_valid_ratio (src_ratio) == 0) {
288 if ((src_state = src_new (SRC_SINC_FASTEST , 1, &error)) == NULL) {
289 logMsg (
"Error : src_new() failed : %s.", src_strerror (error));
292 src_data.src_ratio = src_ratio;
294 src_data.output_frames = newLen;
295 src_data.end_of_input = 1;
299 src_data.data_out = newBuf->
buffer(i);
301 error = src_process(src_state, &src_data);
303 logMsg(
"SRC Error : %s", src_strerror(error));
307 src_state = src_delete (src_state);
319 #ifdef CSL_DSP_BUFFER
325 sample Buffer::rms(
unsigned chan) {
330 for (
unsigned i = 0; i < numFrames; i++) {
334 return sum / numFrames;
339 sample Buffer::avg(
unsigned chan) {
344 for (
unsigned i = 0; i < numFrames; i++)
346 return sum / numFrames;
356 for (
unsigned i = 0; i < numFrames; i++) {
358 if (fabs(val) > tmax) tmax - fabs(val);
370 for (
unsigned i = 0; i < numFrames; i++) {
372 if (fabs(val) > tmax) tmax - fabs(val);
379 unsigned int Buffer::zeroX(
unsigned chan) {
381 unsigned numFrames =
mNumFrames, count = 0, sign = 0;
384 for (
unsigned i = 0; i < numFrames; i++) {
386 if (((val > 0) && sign) || ((val < 0) && ! sign)) {
396 unsigned int Buffer::indexOfPeak(
unsigned chan) {
399 sample val, tmax = -1000000.0;
401 for (
unsigned i = 0; i < numFrames; i++) {
413 unsigned int Buffer::indexOfPeak(
unsigned chan,
unsigned lo,
unsigned hi) {
415 sample val, tmax = -100000.0;
417 for (
unsigned i = lo; i < hi; i++) {
429 unsigned int Buffer::indexOfMin(
unsigned chan) {
432 sample val, tmin = 1000000.0;
434 for (
unsigned i = 0; i < numFrames; i++) {
446 unsigned int Buffer::indexOfMin(
unsigned chan,
unsigned lo,
unsigned hi) {
448 sample val, tmin = 1000000.0;
450 for (
unsigned i = lo; i < hi; i++) {
462 void Buffer::autocorrelation(
unsigned chan,
SampleBuffer result) {
468 SPautoc (buffer, numFrames, result, numFrames);
471 #endif // CSL_DSP_BUFFER
480 Buffer(numChannels, numFrames),
481 mRealNumChannels(numChannels) { }
484 Buffer(numChannels, numFrames),
485 mRealNumChannels(realNumChannels) { }
514 float * buffer = outputBuffer.
monoBuffer(outBufNum);
531 UGenVector::iterator pos;
550 if (mNumOutputs > 1) {
551 if (outputBuffer.mSequence <= mSequence) {
553 outputBuffer.copyOnlySamplesFrom(*mOutputCache);
565 mOutputCache->copySamplesFrom(outputBuffer);
566 mSequence =
csl_max(mSequence, outputBuffer.mSequence);
577 unsigned numOutputChannels = outputBuffer.mNumChannels;
578 unsigned bufferByteSize = outputBuffer.mMonoBufferByteSize;
581 logMsg(
"UnitGenerator::nextBuffer");
583 if (checkFanOut(outputBuffer))
return;
585 switch (mCopyPolicy) {
588 this->nextBuffer(outputBuffer, 0);
589 for (
unsigned i = 1; i < numOutputChannels; i += mNumChannels)
590 memcpy (outputBuffer.monoBuffer(i), buffer0, bufferByteSize);
593 for (
unsigned i = 0; i < numOutputChannels; i += mNumChannels)
594 nextBuffer(outputBuffer, i);
597 this->nextBuffer(outputBuffer, 0);
600 handleFanOut(outputBuffer);
606 for (
unsigned i = 0; i < mNumChannels; i++)
607 zeroBuffer(outputBuffer, i);
649 throw LogicError(
"Checking an unassigned buffer");
678 fprintf(stderr,
"\t");
690 for (PortMap::iterator pos =
mInputs.begin(); pos !=
mInputs.end(); pos++)
691 delete (pos->second);
697 logMsg(
"Controllable::pullInput");
699 if (thePort == NULL) {
700 logMsg(
"Controllable::pullInput port == null!");
708 Buffer * theBuffer = thePort->mBuffer;
709 if (theBuffer == NULL) {
710 logMsg(
"Controllable::pullInput Buffer == null!");
713 thePort->checkBuffer();
721 thePort->mValuePtr = (thePort->mBuffer->monoBuffer(0)) - 1;
722 thePort->mValueIndex = 0;
735 theBuffer.mIsPopulated =
true;
736 thePort->mValuePtr = (theBuffer.monoBuffer(0)) - 1;
737 thePort->mValueIndex = 0;
744 logMsg(
"Controllable::set input \"%d\" UGen", key);
749 thePort =
new Port(&uGen);
756 logMsg(
"Controllable::set input \"%d\" to %g", key, value);
760 thePort =
new Port(value);
775 logMsg(
"a Controllable with the map:");
776 for (PortMap::iterator pos =
mInputs.begin(); pos !=
mInputs.end(); ++pos) {
777 switch (pos->first) {
779 logMsg(
" key: Frequency = UG: ");
782 logMsg(
" key: Scale = UG: ");
785 logMsg(
" key: Offset = UG: ");
790 logMsg(
" key: Input = UG: ");
793 logMsg(
" key: Other = UG: ");
807 logMsg(
"Phased::add freq input");
814 logMsg(
"Phased::add freq input");
821 logMsg(
"Phased::add freq input");
843 logMsg(
"Scalable::add null inputs");
851 logMsg(
"Scalable::add scale input");
859 logMsg(
"Scalable::add scale/offset input values");
867 logMsg(
"Scalable::add scale/offset input values");
875 logMsg(
"Scalable::add scale/offset input values");
890 logMsg(
"Scalable::set scale input UG");
897 logMsg(
"Scalable::set scale input value");
904 logMsg(
"Scalable::set offset input UG");
911 logMsg(
"Scalable::set offset input value");
938 logMsg(
"Effect::add null input");
947 logMsg(
"Effect::add input UG");
962 logMsg(
"Effect::add input");
970 logMsg(
"Effect::pullInput");
973 mInputPtr = outputBuffer.buffer(0);
979 mInputPtr = outputBuffer.buffer(0);
985 logMsg(
"Effect::pullInput");
1002 :
Effect(in), mNumFanOuts(taps), mCurrent(taps) {
1009 throw LogicError(
"Asking for mono nextBuffer of a FanOut");
1015 if (outputBuffer.mNumChannels != mNumChannels)
1016 throw LogicError(
"Asking for wrong output ch # of a FanOut");
1017 if (mCurrent >= mNumFanOuts) {
1018 pullInput(outputBuffer.mNumFrames);
1031 :
FanOut(in, in.numChannels()) { }
1034 throw LogicError(
"Asking for mono nextBuffer of a Splitter");
1041 if (outputBuffer.mNumChannels != 1)
1042 throw LogicError(
"Asking for a stereo output of a channel splitter");
1044 if (mCurrent >= mNumFanOuts) {
1045 pullInput(outputBuffer.mNumFrames);
1050 throw LogicError(
"Missing buffer in channel splitter");
1051 unsigned bufferByteSize = outputBuffer.mMonoBufferByteSize;
1054 memcpy(dest, src, bufferByteSize);
1073 if (
mInputs[i]->mUGen->isActive())
1081 throw LogicError(
"Asking for mono nextBuffer of a Joiner");
1087 if (outputBuffer.mNumChannels != mNumChannels) {
1088 throw LogicError(
"Wrong number of channels in a joiner");
1091 Buffer tempBuffer(1, outputBuffer.mNumFrames);
1094 for (
unsigned i = 0; i < mNumChannels; i++) {
1096 tempBuffer.
setBuffer(0, outputBuffer.monoBuffer(i));
1098 mInputs[i]->mUGen->nextBuffer(tempBuffer);
1116 unsigned numBufs = inputBuffer.mNumChannels;
1117 for (
unsigned i = 0; i < numBufs; i++)
1118 writeBuffer(inputBuffer, i);
1126 throw IOError(
"Error seeking");
1132 unsigned numFrames,
unsigned numChannels)
throw (
CException) {
1134 unsigned numOutputChannels = output.mNumChannels;
1135 unsigned numChannelsToInterleave =
csl_min(numOutputChannels, numChannels);
1136 unsigned numChannelsBeyond = numChannels - numChannelsToInterleave;
1138 for (
unsigned frame = 0; frame < numFrames; frame++) {
1139 for (
unsigned channel = 0; channel < numChannelsToInterleave; channel++)
1140 *samples++ = output.monoBuffer(channel)[frame];
1141 for (
unsigned j = 0; j < numChannelsBeyond; j++)
1151 unsigned numOutputChannels = output.mNumChannels;
1152 unsigned numChannelsToInterleave =
csl_min(numOutputChannels, numChannels);
1153 unsigned numChannelsBeyond = numChannels - numChannelsToInterleave;
1155 for (
unsigned frame = 0; frame < numFrames; frame++) {
1156 for (
unsigned channel = 0; channel < numChannelsToInterleave; channel++)
1157 *samples++ = (
short) ((output.monoBuffer(channel)[frame]) * 32767.0);
1158 for (
unsigned j = 0; j < numChannelsBeyond; j++)
1166 unsigned numChannels,
unsigned *channelMap)
throw (
CException) {
1168 unsigned numOutputChannels = output.mNumChannels;
1169 unsigned numChannelsToInterleave =
csl_min(numOutputChannels, numChannels);
1170 unsigned numChannelsBeyond = numChannels - numChannelsToInterleave;
1171 unsigned *map = channelMap;
1173 for (
unsigned frame = 0; frame < numFrames; frame++) {
1174 for (
unsigned channel = 0; channel < numChannelsToInterleave; channel++)
1175 *samples++ = output.monoBuffer(map[channel])[frame];
1176 for (
unsigned j = 0; j < numChannelsBeyond; j++)
1186 unsigned numOutputChannels = output.mNumChannels;
1187 unsigned numChannelsToDeinterleave =
csl_min(numOutputChannels, numChannels);
1192 for (i = 0; i < numChannelsToDeinterleave; i++) {
1193 currentOutputBuffer = output.monoBuffer(i);
1194 inputBuffer = samples + i;
1195 for (
unsigned j = 0; j < numFrames; j++, inputBuffer += numChannels) {
1196 *currentOutputBuffer++ = *inputBuffer;
1199 if (numOutputChannels > numChannelsToDeinterleave) {
1200 for (i = numChannelsToDeinterleave; i < numOutputChannels; i++)
1201 memset(output.monoBuffer(i), 0, output.mMonoBufferByteSize);
1210 unsigned numOutputChannels = output.mNumChannels;
1211 unsigned numChannelsToDeinterleave =
csl_min(numOutputChannels, numChannels);
1213 short * inputBuffer;
1216 for (i = 0; i < numChannelsToDeinterleave; i++) {
1217 currentOutputBuffer = output.monoBuffer(i);
1218 inputBuffer = samples + i;
1219 for (
unsigned j = 0; j < numFrames; j++, inputBuffer += numChannels) {
1220 *currentOutputBuffer++ = ((float )*inputBuffer) / 32767.0f;
1223 if (numOutputChannels > numChannelsToDeinterleave) {
1224 for (i = numChannelsToDeinterleave; i < numOutputChannels; i++)
1225 memset(output.monoBuffer(i), 0, output.mMonoBufferByteSize);
1237 IO::IO(
unsigned s_rate,
unsigned b_size,
int in_device,
int out_device,
1238 unsigned in_chans,
unsigned out_chans)
1239 : mGraph(NULL), mNumFramesPlayed(0), mSequence(0),
1242 mNumRealInChannels(in_chans), mNumRealOutChannels(out_chans),
1244 logMsg(
"Create IO: %d s @ %d Hz; %d i %d o", b_size, s_rate, in_chans, out_chans);
1272 static struct timeval * mte = & mThen;
1273 static struct timeval * mno = & mNow;
1275 float maxSampEver = 0.0f;
1282 outBuffer.mSequence = this->getAndIncrementSequence();
1284 mGraph->nextBuffer(outBuffer);
1288 logMsg(
kLogError,
"An error occured in the CSL nextBuffer method: %s\n",
1295 printTimeStatistics(mno, mte, & mThisSec, & mTimeSum, & mTimeVals);
1301 #ifdef DO_TIMING // DO_TIMING
1303 int (timeval *val,
void * e) {
1304 LARGE_INTEGER ticksPerSecond;
1307 QueryPerformanceFrequency(&ticksPerSecond);
1308 float ticksPerUSecond = ticksPerSecond.QuadPart / 1000000;
1310 QueryPerformanceCounter(&tick);
1311 val->tv_sec = tick.QuadPart/ticksPerSecond.QuadPart;
1312 val->tv_usec = tick.QuadPart/ticksPerUSecond;
1327 void IO::printTimeStatistics(
struct timeval * now,
struct timeval * then,
long * thisSec,
1328 long * timeSum,
long * timeVals) {
1331 *thisSec = now->tv_sec;
1332 if (*timeSum != 0.0) {
1335 mUsage = (float) *timeSum / *timeVals * 100.0f / cycleTime;
1338 logMsg(
"\tCPU usage: %.2f percent (%5.3f).", mUsage, maxSampEver);
1366 throw IOError(
"Can't get unopened input");
1369 interleaver.
deinterleave(mInputBuffer, mInputPointer, numFrames, numChannels);
1370 mInputBuffer.mIsPopulated =
true;
1372 return(mInputBuffer);
1378 : mIndex(index), mMaxInputChannels(maxIn), mMaxOutputChannels(maxOut),
1379 mIsDefaultIn(isIn), mIsDefaultOut(isOut) {
1380 strcpy(
mName, name);
1384 : mIndex(index), mMaxInputChannels(maxIn), mMaxOutputChannels(maxOut),
1385 mIsDefaultIn(isIn), mIsDefaultOut(isOut) {
1386 strcpy(
mName, name.c_str());
1392 logMsg(
" IO: %d = %s - %d i %d o %g Hz%s%s",