2013-04-26 78 views
1

这需要我的头。我从iPod库中读取音频以分析音频样本,我可以做我想做的事,缓冲区总是泄漏,我得到低内存警告,应用程序是杀害。 我尝试了所有建议,但没有成功。下面的代码被合并到一个静态库中,并且读取音频工作正常,只是缓冲区从未被释放。我使用ARC,也试过不打电话CFRelease,但同样的事情......感谢任何建议,我完全卡住了!CFRelease但仍然泄漏

- (NSInteger) getMP3Samples:(SInt16*)address{ 
    AudioBufferList audioBufferList; 

    if (_assetReader == nil) { 
     return 0; 
    } 

    _mp3Control.currentSampleBufferCount = 0; 
    CMSampleBufferRef nextBuffer =[_assetReaderOutput copyNextSampleBuffer]; 

    // Is the Song ended 
    if (nextBuffer == nil){ 
     if ([_assetReader status] == AVAssetReaderStatusCompleted) { 
      [_assetReader cancelReading]; 
     } 
     _assetReader = nil; 
     _assetReaderOutput = nil; 
     return _mp3Control.currentSampleBufferCount; 
    } 

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
     nextBuffer, 
     NULL, 
     &audioBufferList, 
     sizeof(audioBufferList), 
     NULL, 
     NULL, 
     kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, 
     &_mp3Control.blockBuffer); 

    if (nextBuffer) { 
     CMSampleBufferInvalidate(nextBuffer); 
     CFRelease(nextBuffer); 
     nextBuffer=NULL; 
    } 

    for (int b=0; b < audioBufferList.mNumberBuffers; b++) { 
     memcpy((void *)(address+_mp3Control.currentSampleBufferCount),(void *)audioBufferList.mBuffers[b].mData,audioBufferList.mBuffers[b].mDataByteSize); 
     _mp3Control.currentSampleBufferCount+=audioBufferList.mBuffers[b].mDataByteSize; 
    } 
    /// 
    /// Return samples and not bytes!! 
    /// 
    return _mp3Control.currentSampleBufferCount/2; 
} 

回答

1

是否使用&释放由CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer在(未公布)调用返回的代码块缓冲区?
如果在调用getMP3Samples:之后没有释放存储在&_mp3Control.blockBuffer中的对象,这可能是您的内存管理问题。 (核心基础风格的对象不参与ARC)

你也可以通过分配运行你的代码&泄漏仪器看到更多的细节(我只是在这里猜测:))。

+0

非常感谢,这就是原因!而且我甚至可以在函数本身内部完成它,因为我将样本存入另一个缓冲区。再次感谢,我必须说苹果文档在这里非常薄... – 2013-04-26 11:31:14

+0

不客气! 是的 - 文档有时会有点薄。但是你总是可以尝试标题(例如,通过cmd +点击Xcode中的方法名称)。在核心媒体的情况下,标题目前包含比实际文档更多的文本:) – 2013-04-26 12:17:25