所以我正在使用 Apple 的MixerHost 示例代码来为立体声合成做一个基本的听力图设置。我在弄清楚如何填充缓冲区切片时遇到了一些麻烦。具体来说,我只在左声道输出音频,右声道是静音的:
AudioUnitSampleType *buffer = (AudioUnitSampleType *)ioData->mBuffers[0].mData;
SInt16 sampleValue;
for(UInt32 i = 0; i < inNumberFrames; i++)
{
sampleValue = sinf(inc) * 32767.0f; // generate sine signal
inc += .08;
buffer[i] = sampleValue;
}
if(inc > 2e10) inc -= 2e10;
这会在左声道播放一个正弦波......音高每 10 秒左右就会改变一次,这是我做错的另一个指标:]
我已经尝试过其他遍历数组的方法。这产生了远离正弦信号的有趣声音。有一次,我在两个通道上都有故障/断断续续的输出,这有点像成功。
如果我检查 AudioBuffer 结构,它确认有 2 个通道,每帧的字节大小为 4。所以每帧有两个 SInt16,对吗?一个用于左声道,一个用于右声道..它们应该是交错的?
请注意,我使用的流格式与 Apple 的示例不同,因为我不知道定点数学。
流格式设置如下:
size_t bytesPerSample = sizeof (AudioUnitSampleType);
stereoStreamFormat.mFormatID = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
stereoStreamFormat.mBytesPerPacket = bytesPerSample;
stereoStreamFormat.mFramesPerPacket = 1;
stereoStreamFormat.mBytesPerFrame = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame = 2;
stereoStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate = graphSampleRate;
所以我的问题是,我如何用数据填充像上面设置的立体声缓冲区,以便它正常工作?
谢谢!