Ошибка iPhone AudioUnitRender -50 в устройстве - PullRequest
6 голосов
/ 05 мая 2011

Я работаю над одним проектом, в котором я использовал 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 ]

3 голосов
/ 26 апреля 2012

Длина буфера (inNumberFrames) может быть разной на устройстве и на симуляторе. Судя по моему опыту, он часто больше на устройстве. Когда вы используете свой собственный AudioBufferList, это то, что вы должны учитывать. Я бы предложил выделить больше памяти для буфера в AudioBufferList.

3 голосов
/ 27 ноября 2012

Я знаю, что эта ветка старая, но я только что нашел решение этой проблемы.

Длительность буфера для устройства отличается от длительности на симуляторе. Таким образом, вы должны изменить продолжительность буфера:

Float32 bufferDuration = ((Float32) <INSERT YOUR BUFFER DURATION HERE>) / sampleRate; // buffer duration in seconds

AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferDuration), &bufferDuration);
0 голосов
/ 06 мая 2011

Попробуйте добавить kAudioFormatFlagsNativeEndian в свой список флагов формата описания потока.Не уверен, что это будет иметь значение, но это не повредит.

Кроме того, я подозреваю, что THIS используется для члена userData, который определенно не заполняет этот членлюбые значимые данные по умолчанию.Попробуйте запустить код в отладчике и посмотрите, правильно ли извлечен и приведен этот экземпляр.Предполагая, что это так, просто для удовольствия попробуйте поместить объект AudioUnit в глобальную переменную (да, я знаю ...), просто чтобы посмотреть, работает ли он.

Наконец, зачем использовать THIS->bufferList вместо того, который переданваш обратный вызов рендеринга?Это, вероятно, не хорошо.

...