过了一段时间,用音频单元进行开发,我知道有一些错误是开发人员所熟知的低级音频缓冲区。
错误是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在那里。 chanels是24位,我尝试16位但没有好结果。在我的Mac上仍然是512位缓冲区大小。 我有一个mac retina display 2012。
答案 0 :(得分:2)
有几件事需要考虑: 1)使音频单元具有由主机设置的缓冲区大小 2)你可以通过覆盖AUBase :: SetMaxFramesPerSlice(nFrames)来设置最大缓冲区 3)没有设置最小缓冲区大小的功能。
话虽如此,您可以通过覆盖AUBase类中越来越多的函数来自定义代码。据我所知,没有办法设置最小缓冲区大小。你可以做的是将帧存储到缓冲区,直到你达到你想要的数字,然后发送帧。就像延迟效果的循环缓冲区一样。
你是否有理由想要一定数量的帧?