30 mInBuf(1, blockSize * 2),
31 mTmpBuf(1, blockSize * 2 + 8),
32 mOutBuf(2, blockSize * 2),
34 unsigned hrtfLength, winSize;
78 unsigned numFrames = outputBuffer.mNumFrames;
79 unsigned tmpBufPtr, tmpHRTFPtr = 0;
80 unsigned hrtfLength = hrtfDatabase->
hrtfLength();
81 unsigned hrtf2Use = hrtfLength /
LEN_DOWNS;
84 logMsg(
"BinauralPanner::nextBuffer");
86 if (outputBuffer.mNumChannels != 2) {
90 if (numFrames != mFramesPerBlock) {
92 "BinauralPanner::nextBuffer # frames %d wrong for HRTF size %d (use a block resizer).",
93 numFrames, mFramesPerBlock);
96 outputBuffer.zeroBuffers();
98 for (
unsigned i = 0; i < mSources.size(); i++) {
103 mInBuf.mNumFrames = winSize;
104 mInBuf.zeroBuffers();
105 mInBuf.mNumFrames = numFrames;
118 mInBuf.mNumFrames = winSize;
120 mInFFT.nextBuffer(mInBuf, mTmpBuf);
124 tcache->
mHRTF[mBlockInd] = tcache->
mHRTF[mBlockInd - 1];
126 tcache->
mHRTF[mBlockInd] = tcache->
mHRTF[mNumBlocks - 1];
130 tcache->
mHRTF[mBlockInd] = hrtfIndex;
141 tmpBufPtr = mBlockInd;
144 for (
unsigned j = 0; j < hrtf2Use; j++) {
150 cmac(in1j, inLj, outLj);
151 cmac(in1j, inRj, outRj);
156 if (++tmpBufPtr >= mNumBlocksToSum)
158 if (++tmpHRTFPtr >= mNumBlocksToSum)
160 }
while (tmpBufPtr != mBlockInd);
166 mTmpBuf.mNumFrames = winSize;
168 mOutBuf.setBuffer(0, mIFFTOutL);
170 mOutFFT.nextBuffer(mTmpBuf, mOutBuf);
173 mOutBuf.setBuffer(0, mIFFTOutR);
175 mOutFFT.nextBuffer(mTmpBuf, mOutBuf);
184 sample scale = 1.0f / (float) numFrames;
189 for (
unsigned j = 0; j < numFrames; j++) {
190 *outL++ += ((*ifftL++ + *cacheL++) * scale);
191 *outR++ += ((*ifftR++ + *cacheR++) * scale);
200 mBlockInd = mNumBlocksToSum;