iPhone AudioUnitRender ошибка -50 в устройстве
Я работаю над одним проектом, в котором я использовал AudioUnitRender, он отлично работает в симуляторе, но дает ошибку -50 в устройстве.
Если кто сталкивался с подобной проблемой, пожалуйста, дайте мне какое-то решение.
RIOInterface* THIS = (RIOInterface *)inRefCon;
COMPLEX_SPLIT A = THIS->A;
void *dataBuffer = THIS->dataBuffer;
float *outputBuffer = THIS->outputBuffer;
FFTSetup fftSetup = THIS->fftSetup;
uint32_t log2n = THIS->log2n;
uint32_t n = THIS->n;
uint32_t nOver2 = THIS->nOver2;
uint32_t stride = 1;
int bufferCapacity = THIS->bufferCapacity;
SInt16 index = THIS->index;
AudioUnit rioUnit = THIS->ioUnit;
OSStatus renderErr;
UInt32 bus1 = 1;
renderErr = AudioUnitRender(rioUnit, ioActionFlags,
inTimeStamp, bus1, inNumberFrames, THIS->bufferList);
NSLog(@"%d",renderErr);
if (renderErr < 0) {
return renderErr;
}
данные относительно размера выборки и кадра...
bytesPerSample = sizeof(SInt16);
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
asbd.mBitsPerChannel = 8 * bytesPerSample;
asbd.mFramesPerPacket = 1;
asbd.mChannelsPerFrame = 1;
//asbd.mBytesPerPacket = asbd.mBytesPerFrame * asbd.mFramesPerPacket;
asbd.mBytesPerPacket = bytesPerSample * asbd.mFramesPerPacket;
//asbd.mBytesPerFrame = bytesPerSample * asbd.mChannelsPerFrame;
asbd.mBytesPerFrame = bytesPerSample * asbd.mChannelsPerFrame;
asbd.mSampleRate = sampleRate;
спасибо заранее..
3 ответов
длина буфера (inNumberFrames) может отличаться на устройстве и симуляторе. По моему опыту, он часто больше на устройстве. Когда вы используете свой собственный AudioBufferList это то, что вы должны принять во внимание. Я бы предложил выделить больше памяти для буфера в AudioBufferList.
Я знаю, что этот поток старая, но я только что нашел решение этой проблемы.
длительность буфера для устройства отличается от длительности буфера на симуляторе. Таким образом, вы должны изменить продолжительность буфера:
Float32 bufferDuration = ((Float32) <INSERT YOUR BUFFER DURATION HERE>) / sampleRate; // buffer duration in seconds
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferDuration), &bufferDuration);
попробуйте добавить kAudioFormatFlagsNativeEndian
в список флагов формата описания потока. Не уверен, что это что-то изменит, но это не повредит.
кроме того, я подозреваю об использовании THIS
на userData
член, который определенно не заполняет этот член значимыми данными по умолчанию. Попробуйте запустить код в отладчике и посмотрите, правильно ли извлечен и приведен этот экземпляр. Предполагая, что это так, просто для удовольствия попробуйте поместить объект AudioUnit в глобальную переменную (да, я знать.. просто посмотреть, работает ли он.
наконец, зачем использовать THIS->bufferList
вместо того, чтобы один прошел в ваш обратный вызов рендеринга? Это, наверное, плохо.