Ios 用ExtAudioFileRead循环AAC文件-bug?

Ios 用ExtAudioFileRead循环AAC文件-bug?,ios,objective-c,audio,extaudiofileread,Ios,Objective C,Audio,Extaudiofileread,使用ExtAudioFileRead在iOS上读取音频文件,似乎达到eof会完全冻结读取器…例如,假设已分配并正确配置了_ablAudioBufferList和_eafExtendedAudioFileRef: - ( void )testRead { UInt32 requestedFrames = 1024; UInt32 numFrames = requestedFrames; OSStatus error = 0; error = ExtAudioFil

使用ExtAudioFileRead在iOS上读取音频文件,似乎达到eof会完全冻结读取器…例如,假设已分配并正确配置了_ablAudioBufferList和_eafExtendedAudioFileRef:

- ( void )testRead
{
    UInt32 requestedFrames = 1024;
    UInt32 numFrames = requestedFrames;
    OSStatus error = 0;

    error = ExtAudioFileRead( _eaf, &numFrames, _abl );

    if( numFrames < requestedFrames ) //eof, want to read enough frames from the beginning of the file to reach requestedFrames and loop gaplessly
    {
         requestedFrames = requestedFrames - numFrames;
         numFrames = requestedFrames;
         // move some pointers in _abl's buffers to write at the correct offset
         error = ExtAudioFileSeek( _eaf, 0 );
         error = ExtAudioFileRead( _eaf, &numFrames, _abl );
         if( numFrames != requestedFrames ) //Now this call always sets numFrames to the same value as the previous read call...
         {
             NSLog( @"Oh no!" );
         }
    }
}
-(void)testRead
{
UInt32 requestedFrames=1024;
UInt32 numFrames=请求的帧;
OSStatus错误=0;
错误=ExtAudioFileRead(_eaf,&numFrames,_abl);
如果(numFrames
没有错误,始终是相同的行为,就像读卡器卡在文件末尾一样。ExtAudioFileTell确认请求的seek,顺便说一句。还尝试跟踪文件中的位置,以仅请求eof中可用的帧数,结果相同:一旦读取最后一个数据包,seek似乎没有效果

在其他情况下愉快地寻找

臭虫?特征?掌心?我非常感谢任何帮助解决这个问题

我正在iPad3(iOS7.1)上测试这个

干杯

格雷佐

明白了,邪恶的修补匠

因此,除了通知客户端实际读取的帧数外,ExtAudioFileRead还将AudioBufferList的AudioBuffers mDataByteSize设置为读取的字节数。当它将读取钳制到该值时,在eof时不重置它会导致永远获得比请求更少的帧

因此,一旦达到eof,只需重置abl的缓冲区大小

-( void )resetABLBuffersSize: ( AudioBufferList * )alb size: ( UInt32 )size
{
     AudioBuffer * buffer;
     UInt32 i;

     for( i = 0; i < abl->mNumberBuffers; i++ )
     {
         buffer = &( abl->mBuffers[ i ] );
         buffer->mDataByteSize = size;
     }
}
-(void)resetabbufferssize:(AudioBufferList*)alb大小:(UInt32)大小
{
音频缓冲器*缓冲器;
UInt32Ⅰ;
对于(i=0;imNumberBuffers;i++)
{
缓冲区=&(abl->mBuffers[i]);
缓冲区->mDataByteSize=大小;
}
}
这不应该被记录下来吗?官方文档仅描述AudioBufferList参数:一个或多个用于读取音频数据的缓冲区

干杯

格雷佐