6

我正在开发一个使用 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;      

提前致谢..

4

3 回答 3

3

缓冲区的长度(inNumberFrames)在设备和模拟器上可能不同。根据我的经验,它在设备上通常更大。当您使用自己的 AudioBufferList 时,您必须考虑到这一点。我建议为 AudioBufferList 中的缓冲区分配更多内存。

于 2012-04-26T11:40:24.073 回答
3

我知道这个线程很旧,但我刚刚找到了解决这个问题的方法。

设备的缓冲时长与模拟器上的不同。所以你必须改变缓冲持续时间:

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

AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferDuration), &bufferDuration);
于 2012-11-27T05:47:49.623 回答
0

尝试添加kAudioFormatFlagsNativeEndian到您的流描述格式标志列表中。不知道这是否会有所作为,但它不会受到伤害。

另外,我对THIS成员的使用持怀疑态度userData,默认情况下它肯定不会用任何有意义的数据填充该成员。尝试在调试器中运行代码并查看该实例是否被正确提取和转换。假设是这样,只是为了好玩尝试将 AudioUnit 对象放入全局变量(是的,我知道..)只是为了看看它是否有效。

最后,为什么使用THIS->bufferList而不是传递给渲染回调的那个?那可能不太好。

于 2011-05-06T07:02:30.303 回答