我目前正在開發音頻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);
}
在調試過程中,如預期的那樣顯示在緩衝器中的數據,但實際產出不過是噪音。
下面是使得無論是整支球隊的瘋狂代碼的其他一些奇怪的行爲:
如果有數據(由0加/減,1乘)或整個無變化緩衝區被分配給一個常量(比如0,然後音頻將被靜音),播放的行爲正常(當然!)但是如果我執行的任何事情比它更多,它仍然是噪音。
如果我硬編碼單音作爲測試音頻,輸出噪聲也會擴展到另一個通道。
那麼這段代碼中的錯誤在哪裏呢?或者如果我在錯誤的軌道上,修改音頻數據並正確回放的正確方法是什麼?任何見解都將受到真誠的讚賞。
非常感謝你:-)
乾杯,
曼卡