2011-05-05 79 views
6

我正在一個項目中,我已經使用AudioUnitRender它在模擬器中運行良好,但在設備中給出-50錯誤。iPhone 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中的緩衝區分配更多的內存。

0

嘗試增加kAudioFormatFlagsNativeEndian到您的流描述格式標誌列表。不知道這是否會有所作爲,但它不會傷害。

另外,我對userData成員使用THIS表示懷疑,默認情況下,該成員絕對不會向該成員填充任何有意義的數據。嘗試在調試器中運行代碼並查看該實例是否被正確提取並轉換。假設它,只是爲了好玩,試着把AudioUnit對象放入一個全局變量(是的,我知道..),看看它是否有效。

最後,爲什麼要用THIS->bufferList而不是傳入你的render回調函數?這可能不好。

3

我知道這個線程是舊的,但我只是找到了解決這個問題的方法。

設備的緩衝持續時間與模擬器上的不同。所以你必須改變緩衝時間:

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

AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferDuration), &bufferDuration);