Objective c remoteIO回调函数提供了不稳定的缓冲区列表

Objective c remoteIO回调函数提供了不稳定的缓冲区列表,objective-c,xcode,core-audio,Objective C,Xcode,Core Audio,每次调用音频单元的回调函数时,我都会得到另一些奇怪的样本,因为NSLog(@“%ld”,inNumberFrames)总是给我512 当我这样做时: NSLog(@"%li",strlen((const char *)(&bufferList)->mBuffers[0].mData)); 我得到的数字是:50 20 19 160 200 1 这很奇怪。 每次回电话,我都要得到完整的缓冲区512个样本没有 我知道我没有得到所有需要的样本,因为如果我输入一个sin2kHz,我会得到大

每次调用音频单元的回调函数时,我都会得到另一些奇怪的样本,因为
NSLog(@“%ld”,inNumberFrames)总是给我512

当我这样做时:

NSLog(@"%li",strlen((const char *)(&bufferList)->mBuffers[0].mData));
我得到的数字是:50 20 19 160 200 1

这很奇怪。 每次回电话,我都要得到完整的缓冲区512个样本没有

我知道我没有得到所有需要的样本,因为如果我输入一个sin2kHz,我会得到大约600的零交叉,如果我什么都不输入,我得到的是相同的

要检索数据,我需要执行以下操作:

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;
    //NSLog(@"%ld",inNumberFrames);
    buffer.mData = malloc( inNumberFrames * 2 );

    // Put buffer in a AudioBufferList
    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0] = buffer;



    OSStatus status;
    status = AudioUnitRender(audioUnit, 
                             ioActionFlags, 
                             inTimeStamp, 
                             inBusNumber, 
                             inNumberFrames, 
                             &bufferList);  
    //checkStatus(status);
    NSLog(@"%li",strlen((const char *)(&bufferList)->mBuffers[0].mData));
    int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData;
    for(int i=0; i < strlen((const char *)(&bufferList)->mBuffers[0].mData); i++)
    {
         ....
静态OSStatus记录回调(在refcon中为void*,
AudioUnitRenderActionFlags*ioActionFlags,
常量音频时间戳*inTimeStamp,
UInt32 InBunsNumber,
UInt32数字帧,
音频缓冲列表*ioData)
{
音频缓冲区;
buffer.mNumberChannels=1;
buffer.mDataByteSize=inNumberFrames*2;
//NSLog(@“%ld”,在数字帧中);
buffer.mData=malloc(inNumberFrames*2);
//将缓冲区放入AudioBufferList中
音频缓冲列表;
bufferList.mNumberBuffers=1;
bufferList.mBuffers[0]=缓冲区;
骨状态;
状态=AudioUnitRender(audioUnit,
ioActionFlags,
起义坦普,
在美国,
无数帧,
&缓冲区列表);
//检查状态(状态);
NSLog(@“%li”,strlen((常量字符*)(&bufferList)->mBuffers[0].mData));
int16_t*q=(int16_t*)(&bufferList)->mbuffer[0].mData;
对于(int i=0;imBuffers[0].mData);i++)
{
....
这方面的任何帮助都能帮我省下几天的时间!
谢谢。

A strlen()音频样本缓冲区的大小与样本数无关。相反,请查看作为回调函数参数给出的帧数。

为什么要将
strlen
与缓冲区一起使用???那么我应该使用什么?您能帮我检索此行中的数据吗?您的缓冲区大小是固定的(inNumberFrames),所以只需进行相应的迭代。根据apple,它们不是,因此我应该对它们进行malloc..是的,您对它们进行malloc,但它们的大小随后不会改变。