操纵AudioQueueBuffer音频数据会产生噪音

时间:2010-01-17 14:18:33

标签: iphone audioqueueservices

我尝试使用SpeakHere示例应用程序作为起点来实现iPhone声音处理应用程序。该应用程序涉及在播放期间操纵缓冲的音频样本。当我将样本乘以一个小数(例如0.9)时,我得到噪声。最奇怪的是,当将样本乘以整数(如1.0,2.0)或加上或减去它们时,播放会按预期发出声音。

我在AudioPlayer.m的playbackCallback函数中使用以下代码片段进行此操作:

  //------------------
  //If buffer samples are multiplied by 0.9 we get noise. If we multiply it by 1.0 or add to it everything's fine.
  short *buffer = (short *)calloc(1, numPackets * 2);
  memmove(buffer, bufferReference->mAudioData, numPackets * 2);
  for (int i = 0; i < numPackets; i++)
  {
   buffer[i] *= 0.9;
   //buffer[i] *= 1.0;
   //buffer[i] += 10.0;
  }
  memmove(bufferReference->mAudioData, buffer, numPackets * 2);
  free(buffer);
  buffer = NULL;
  //-------------------

可以在此处下载完整的项目:http://depositfiles.com/files/lmnkq68n8

有人能指出我做错了什么吗?我已经挣扎了好几天了,我完全迷失了。

谢谢!

2 个答案:

答案 0 :(得分:0)

我无法下载你的项目(文件托管商总是告诉我所有的插槽已满),但是通过阅读你发布的代码片段,似乎你将带符号的16位整数(短)值乘以0.9(a浮点值)。这导致了隐性转换。所以你放弃小数点后面的所有内容,这反过来导致信号中的aliasing effects

<强>更新
我检查了你的代码,但无法弄清楚噪音的来源。
为什么使用memmove来操作缓冲区?
您可以使用以下命令直接访问缓冲区:

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;

我很想知道导致这种噪音的原因。因此,如果您发现了这一点,请在此处发布您的解决方案。(也许Core Audio mailing list上的某人可以提供帮助 - 他们真的很有帮助)

如果你只需要改变增益,你可以简单地使用AudioQueueSetParameter 另一种选择是use the RemoteIO audio unit而不是AudioQueueServices。

答案 1 :(得分:0)

这可能只是将缓冲区big-endian格式转换为系统little-endian格式进行乘法并将其作为big-endian再次存储在缓冲区中。

&#13;
&#13;
SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;
for (int i=0; i<44100; i++) {
        sample = CFSwapInt16BigToHost(pBuffer[i]);
        newSample = sample * 0.1;
        pBuffer[i]=CFSwapInt16HostToBig (newSample);
    }
&#13;
&#13;
&#13;