ExtAudioFileRead on iOS with error code -50

I use the ExtAudioFileRead function to load an audio file into memory. But I found that there is always an error with the -50 code. This means that I am passing the wrong parameters to the function. But I do not know which one is the wrong parameter.

The audio file data format is alac, sampleRate 44100k, has 2 channels.

My code is shown below:

ExtAudioFileRef recordFile; OSStatus error = noErr; error = ExtAudioFileOpenURL((CFURLRef)file, &recordFile); checkError(error, "open file"); SInt64 frameCount; UInt32 size = sizeof(frameCount); error = ExtAudioFileGetProperty(recordFile, kExtAudioFileProperty_FileLengthFrames, &size, &frameCount); checkError(error, "get frameTotlal"); soundStruct *sound = &_sound; sound->frameCount = frameCount; sound->isStereo = true; sound->audioDataLeft = (SInt16 *)calloc(frameCount, sizeof(SInt16)); sound->audioDataRight = (SInt16 *)calloc(frameCount, sizeof(SInt16)); AudioStreamBasicDescription desc; UInt32 descSize = sizeof(desc); error = ExtAudioFileGetProperty(recordFile, kExtAudioFileProperty_FileDataFormat, &descSize, &desc); [self printASBD:desc]; UInt32 channels = desc.mChannelsPerFrame; error = ExtAudioFileSetProperty(recordFile, kExtAudioFileProperty_ClientDataFormat, sizeof(inFormat), &inFormat); AudioBufferList *bufferList; bufferList = (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer) * (channels - 1)); AudioBuffer emptyBuff = {0}; size_t arrayIndex; for (arrayIndex = 0; arrayIndex < channels; arrayIndex ++) { bufferList->mBuffers[arrayIndex] = emptyBuff; } bufferList->mBuffers[0].mData = sound->audioDataLeft; bufferList->mBuffers[0].mNumberChannels = 1; bufferList->mBuffers[0].mDataByteSize = frameCount * sizeof(SInt16); if (channels == 2) { bufferList->mBuffers[1].mData = sound->audioDataRight; bufferList->mBuffers[1].mNumberChannels = 1; bufferList->mBuffers[1].mDataByteSize = frameCount * sizeof(SInt16); bufferList->mNumberBuffers = 2; } UInt32 count = (UInt32)frameCount; error = ExtAudioFileRead(recordFile, &count, bufferList); checkError(error, "reading"); // Get a -50 error free(bufferList); ExtAudioFileDispose(recordFile); 
+6
source share
1 answer

Good question.

This error occurred to me when I ExtAudioFileRead MONO file using the STEREO client data format when calling ExtAudioFileSetProperty .

I do not think ExtAudioFileRead will automatically convert monaural files to stereo files, if there is a discrepancy, I think that with the -50 error it does not work.

Either make a monophonic file, or set inFormat.mChannelsPerFrame=1 for monofiles.

Remember that if you are not boosting the conversion, you must consider the monaural files in your audiorender function by recording L / R channels from one data mono channel.

+2
source

Source: https://habr.com/ru/post/952025/


All Articles