我正在开发一个项目,其中我使用了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;
提前感谢..
答案 0 :(得分:3)
设备和模拟器上缓冲区的长度(inNumberFrames)可以不同。根据我的经验,它在设备上通常更大。当您使用自己的AudioBufferList时,您必须考虑这一点。我建议为AudioBufferList中的缓冲区分配更多内存。
答案 1 :(得分:3)
我知道这个帖子已经老了,但我刚刚找到了解决这个问题的方法。
设备的缓冲持续时间与模拟器上的缓冲持续时间不同。所以你必须改变缓冲持续时间:
Float32 bufferDuration = ((Float32) <INSERT YOUR BUFFER DURATION HERE>) / sampleRate; // buffer duration in seconds
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferDuration), &bufferDuration);
答案 2 :(得分:0)
尝试将kAudioFormatFlagsNativeEndian
添加到流描述格式标记列表中。不确定这是否有所作为,但它不会受到伤害。
另外,我对THIS
成员使用userData
表示怀疑,默认情况下,该成员肯定不会使用任何有意义的数据填充该成员。尝试在调试器中运行代码,看看是否正确提取和转换了该实例。假设它是,只是为了好玩,尝试将AudioUnit对象放入一个全局变量(是的,我知道..),看它是否有效。
最后,为什么要使用THIS->bufferList
而不是传递给渲染回调的那个?那可能不太好。