mac上的音频缓冲区大小不正确

时间:2013-09-23 12:20:38

标签: objective-c

过了一段时间,用音频单元进行开发,我知道有一些错误是开发人员所熟知的低级音频缓冲区。

错误是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。

1 个答案:

答案 0 :(得分:2)

有几件事需要考虑:  1)使音频单元具有由主机设置的缓冲区大小  2)你可以通过覆盖AUBase :: SetMaxFramesPerSlice(nFrames)来设置最大缓冲区  3)没有设置最小缓冲区大小的功能。

话虽如此,您可以通过覆盖AUBase类中越来越多的函数来自定义代码。据我所知,没有办法设置最小缓冲区大小。你可以做的是将帧存储到缓冲区,直到你达到你想要的数字,然后发送帧。就像延迟效果的循环缓冲区一样。

你是否有理由想要一定数量的帧?