2011-01-13 63 views
1

我目前正在開發音頻DSP應用程序。該項目需要直接訪問和修改音頻數據。現在我可以使用AudioQueue成功訪問和修改原始音頻數據,但在播放過程中遇到錯誤。任何修改後的輸出音頻都是噪音。AudioQueue在修改後擰出輸出

總之,碼是這樣的:

(。從Speakhere示例代碼修改的其餘部分保持不變)

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;  

//My modification starts from here 
//Modifying audio data 

SInt16 *testBuffer = (SInt16*)inCompleteAQBuffer->mAudioData; 
for (int i = 0; i < (inCompleteAQBuffer->mAudioDataByteSize)/sizeof(SInt16); i++) 
    {   
     //printf("before modification %d", (int)*testBuffer); 
     *testBuffer = (SInt16) *testBuffer/2; //Say some simple modification 
     //printf("after modification %d", (int)*testBuffer);  

     testBuffer++; 
     } 

AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL); 

} 

在調試過程中,如預期的那樣顯示在緩衝器中的數據,但實際產出不過是噪音。

下面是使得無論是整支球隊的瘋狂代碼的其他一些奇怪的行爲:

  1. 如果有數據(由0加/減,1乘)或整個無變化緩衝區被分配給一個常量(比如0,然後音頻將被靜音),播放的行爲正常(當然!)但是如果我執行的任何事情比它更多,它仍然是噪音。

  2. 如果我硬編碼單音作爲測試音頻,輸出噪聲也會擴展到另一個通道。

那麼這段代碼中的錯誤在哪裏呢?或者如果我在錯誤的軌道上,修改音頻數據並正確回放的正確方法是什麼?任何見解都將受到真誠的讚賞。

非常感謝你:-)

乾杯,

曼卡

回答

0

你確定樣本格式是SInt16?那裏有多少個頻道?您似乎將音頻視爲單聲道短流,但假設格式實際上是雙通道Float32左右,並且您在那裏進行了修改,其效果與您所描述的完全是恰恰相同,其中包括其他通道上的噪聲。