AudioQueuecallback模拟器,但不是在设备上

我目前正在开发iPhone上的audio处理应用程序。 它基于Apple的SpeakHere示例代码,旨在实时进行audio处理和回放。 代码在模拟器中运行良好,但在设备上testing时不会callback。

callback函数是这样的:

void AQPlayer::AQBufferCallback(void * inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inCompleteAQBuffer) { AQPlayer *THIS = (AQPlayer *)inUserData; if (THIS->mIsDone) return; UInt32 numBytes; UInt32 nPackets = THIS->GetNumPacketsToRead(); OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes, inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets, inCompleteAQBuffer->mAudioData); if (result) printf("AudioFileReadPackets failed: %d", (int)result); if (nPackets > 0) { inCompleteAQBuffer->mAudioDataByteSize = numBytes; inCompleteAQBuffer->mPacketDescriptionCount = nPackets; //Buffer Modification SInt16 *testBuffer = (SInt16*)inCompleteAQBuffer->mAudioData; for (int i = inCompleteAQBuffer->mAudioDataByteSize/sizeof(SInt16); i > 0; i --) { //printf("before modification %d", (int)*testBuffer); *testBuffer = *testBuffer/2; //Simplest processing //printf("after modification %d", (int)*testBuffer); testBuffer++; } //Enqueue Buffer AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL); THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets); } 

其他部分与SpeakHere示例代码相同。

那么这个奇怪的行为有什么问题呢? 任何见解将不胜感激。 如果需要更多信息,请让我知道。

非常感谢你。

干杯,

曼卡

您必须初始化AudioSession并将其模式设置为Play&Record:

 AudioSessionInitialize(NULL, NULL, NULL, NULL); UInt32 category = kAudioSessionCategory_PlayAndRecord; int error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category); if (error) printf("Couldn't set audio category!"); 

请参见SpeakHereController.mm中SpekeHereController.mm中的 awakeFromNib