IOAudioEngineMixer.cpp [plain text]
#include <IOKit/audio/IOAudioDebug.h>
#include <IOKit/audio/IOAudioEngine.h>
#include <IOKit/audio/IOAudioStream.h>
#include <IOKit/audio/IOAudioTypes.h>
IOReturn IOAudioEngine::mixOutputSamples(const void *sourceBuf, void *mixBuf, UInt32 firstSampleFrame, UInt32 numSampleFrames, const IOAudioStreamFormat *streamFormat, IOAudioStream *audioStream)
{
IOReturn result = kIOReturnBadArgument;
if (sourceBuf && mixBuf) {
float *floatSourceBuf, *floatMixBuf;
UInt32 numSamplesLeft, numPartialSamples;
floatSourceBuf = (float *)sourceBuf;
floatMixBuf = &(((float *)mixBuf)[firstSampleFrame * streamFormat->fNumChannels]);
numSamplesLeft = numSampleFrames * streamFormat->fNumChannels;
numPartialSamples = numSamplesLeft % 4;
while (numSamplesLeft > numPartialSamples) {
register float mixFloat1 = *floatMixBuf;
register float sourceFloat1 = *floatSourceBuf;
register float mixFloat2 = *(floatMixBuf + 1);
register float sourceFloat2 = *(floatSourceBuf + 1);
register float mixFloat3 = *(floatMixBuf + 2);
register float sourceFloat3 = *(floatSourceBuf + 2);
register float mixFloat4 = *(floatMixBuf + 3);
register float sourceFloat4 = *(floatSourceBuf + 3);
floatSourceBuf += 4;
numSamplesLeft -= 4;
mixFloat1 += sourceFloat1;
mixFloat2 += sourceFloat2;
mixFloat3 += sourceFloat3;
mixFloat4 += sourceFloat4;
*floatMixBuf = mixFloat1;
*(floatMixBuf + 1) = mixFloat2;
*(floatMixBuf + 2) = mixFloat3;
*(floatMixBuf + 3) = mixFloat4;
floatMixBuf += 4;
}
while (numSamplesLeft > 0) {
register float mixFloat1 = *floatMixBuf;
register float sourceFloat1 = *floatSourceBuf;
++floatSourceBuf;
--numSamplesLeft;
mixFloat1 += sourceFloat1;
*floatMixBuf = mixFloat1;
++floatMixBuf;
}
result = kIOReturnSuccess;
}
return result;
}