2011-03-07 49 views
1

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

回调函数是这样的:

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示例代码。

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

非常感谢。

干杯,

曼卡

+0

您正在初始化音频会话并将其配置为播放和录制吗? – hotpaw2 2011-03-07 12:43:06

+0

是的,AudioSessionSetActive()设置为true,就像示例代码一样。 – Manca 2011-03-07 13:07:20

回答

0

您必须初始化AudioSession并设置其模式播放&实录:

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!"); 

awakeFromNibSpeakHereController.mm距离著名的SpeakHere例子。

相关问题