一段时间后,使用音频单元开发,我知道有一些错误对于使用低级音频缓冲区的开发人员来说是众所周知的。
错误是 mac 上的缓冲区大小错误并显示 512,而不是 1024 ,其中 iDevice 上的相同软件显示 1024 .
问题是,有一种方法可以解决这个问题,所以我也可以在 Mac 上获得 1024 位缓冲区? 像这样工作有点困难,因为模拟与设备不同。
这是我从麦克风输入检查缓冲区的回调函数:
static OSStatus recordingCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
AudioBuffer buffer;
buffer.mNumberChannels = 1;
buffer.mDataByteSize = inNumberFrames * 2;
buffer.mData = NULL;
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0] = buffer;
OSStatus status;
status = AudioUnitRender(audioUnit,
ioActionFlags,
inTimeStamp,
inBusNumber,
inNumberFrames,
&bufferList);
int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData;
// inNumberFrames, is 512 on a mac ,and 1024 on a device
(扬声器输出回调相同=512位)。
音频单元设置的一部分:
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.00;//44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
好吧,我在这里发现有人说您必须在 mac(视网膜是我的)上设置 midi 工具中的采样率,我检查了一下,但它在那里有 44100. 通道是 24 位,我尝试使用 16 位但没有好结果. 我的 Mac 上仍有 512 位缓冲区大小。我有一个 mac 视网膜显示器 2012。
有几件事需要考虑: 1) 音频单元具有由主机设置的缓冲区大小 2) 您可以通过覆盖 AUBase::SetMaxFramesPerSlice(nFrames) 来设置最大缓冲区端 3) 没有设置最小缓冲区大小的函数。
话虽如此,您可以通过重写 AUBase 类中越来越多的函数来自定义您认为合适的代码。据我所知,没有办法设置最小缓冲区大小。 您可以做的是将帧存储到缓冲区中,直到达到所需的数量,然后发送帧。 就像延迟效果上的循环缓冲区一样。
您是否有理由想要一定数量的帧?