I am using AVAssetReader to read audio data from a file, on a secondary thread. Every code example I have seen has at the heart of it a loop like this:
while (assetReader.status == AVAssetReaderStatusReading)
{
// ...
buffer = [theAssetReaderTrackOutput copyNextSampleBuffer];
// ...
}
(or the Swift equivalent). My question is, does copyNextSampleBuffer block while waiting for data from the AVAsset, or does it return NULL if the data is not yet available? If the latter, then we have a polling loop, which is poor practice, burning CPU cycles while repeatedly checking status. The documentation for copyNextSampleBuffer doesn't say whether or not it blocks the thread while waiting. I also can't tell if it attempts to return immediately with whatever data it has available, or fails/blocks unless it has enough data for a buffer of a certain minimum size.
This case is actually documented (always a pleasant surprise). The header file for
copyNextSampleBuffersaysAnd
copyNextSampleBufferis documented to returnNULLwhen no more samples can be read onEOFstatuswill be set toAVAssetReaderStatusCompletedhttps://developer.apple.com/documentation/avfoundation/avassetreaderoutput/1385732-copynextsamplebufferhttps://developer.apple.com/documentation/avfoundation/avassetreaderstatus?language=objc