[英]iOS Core Audio render callback works on simulator, not on device
我的回調如下所示:
static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
AudioSampleType *outBuffer = (AudioSampleType *)ioData->mBuffers[0].mData;
memset(outBuffer, 0, sizeof(AudioSampleType)*inNumberFrames*kNumChannels);
//copy a sine wave into outBuffer
double max_aust = pow(2.f, (float)(sizeof(AudioSampleType)*8.0 - 1.f)) - 1.0;
for(int i = 0; i < inNumberFrames; i++) {
SInt16 val = (SInt16) (gSine2_[(int)phase2_] * max_aust);
outBuffer[2*i] = outBuffer[2*i+1] = (AudioSampleType)val;
phase2_ += inc2_;
if(phase2_ > 1024) phase2_ -= 1024;
}
return noErr;
}
這是一個超級基本的渲染回調,應該只播放一個正弦波。 它在模擬器上執行,但不在設備上執行。 實際上,我無法從設備獲得音頻。 即使我添加了一個printf來檢查outBuffer,它也表明outBuffer充滿了正弦波的樣本。
我將會話類型設置為Ambiet,但我也嘗試了playAndRecord和MediaPlayback。 都不運氣。 我首選的framesPerBuffer是1024(這是我在模擬器和設備上得到的)。 我的采樣率為44100hz。 我也嘗試過48000,以防萬一。 我也嘗試過更改framesPerBuffer。
還有其他原因導致樣本無法到達設備上的硬件嗎?
更新:我剛剛發現,如果我將耳機插入設備,我會聽到聽起來像是正弦波的聲音,這確實令人震驚。 這使我認為設備可能期望浮點數而不是帶符號的int,但是當我將值更改為-1到1時,就沒有音頻(設備或模擬器如預期那樣,因為引擎設置為接受帶符號的int,而不是浮點)。
我不能肯定地告訴沒有看到您的更多的設置,但它聽起來很像你要通過的區別咬傷AudioSampleType
(SInt16樣本)和AudioUnitSampleType
(固定一個內部的8.24樣品SInt32
容器)。 幾乎可以肯定AudioUnitSampleType
是回調中期望的格式。 Core Audio郵件列表上的這篇帖子很好地解釋了兩者之間的區別以及它們為什么存在。
因為我不知道您的設置如何,所以建議您閱讀以下內容: http : //www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html
如果您也想立體聲填充第二個通道,則該示例代碼用於單聲道音頻發生器。
指向第二個通道緩沖區的指針是
const int secondChannel = 1;
Float32 *bufferSecondChannel = (Float32 *)ioData->mBuffers[secondChannel].mData;
希望這個幫助
您可能需要設置音頻會話(初始化,設置類別並激活它)
OSStatus activationResult = NULL;
result = AudioSessionSetActive (true);
有關更多信息,請訪問: http : //developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Cookbook/Cookbook.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.