2011-01-13 44 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左右,并且您在那里进行了修改,其效果与您所描述的完全是恰恰相同,其中包括其他通道上的噪声。