2011-03-07 33 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例子。

相關問題