我尝试使用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
有人能指出我做错了什么吗?我已经挣扎了好几天了,我完全迷失了。
谢谢!
答案 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再次存储在缓冲区中。
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;