如何在使用remoteIO生成iPhone音频时防止弹出声音?
所以,不久前,我正在开发一个波形发生器应用程序,遇到了一些问题,但肯尼·温克是一个真正的救星,他帮助我基本上把一切都搞定了。然而,我最终遇到的一个问题是,每当我改变我使用的频率值时(在较小程度上,当我改变音量值时),我最终会听到这些丑陋的爆裂声。这是一个问题,因为整个要点是能够用滑块平滑地改变波的频率和体积,而听起来像是弄皱的纸会破坏这种效果。这是我的OSStatus控制音量/频率的代码如何在使用remoteIO生成iPhone音频时防止弹出声音?,iphone,objective-c,audio,waveform,Iphone,Objective C,Audio,Waveform,所以,不久前,我正在开发一个波形发生器应用程序,遇到了一些问题,但肯尼·温克是一个真正的救星,他帮助我基本上把一切都搞定了。然而,我最终遇到的一个问题是,每当我改变我使用的频率值时(在较小程度上,当我改变音量值时),我最终会听到这些丑陋的爆裂声。这是一个问题,因为整个要点是能够用滑块平滑地改变波的频率和体积,而听起来像是弄皱的纸会破坏这种效果。这是我的OSStatus控制音量/频率的代码 OSStatus playbackCallback(void *inRefCon,
OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
SlidersViewController *me = (SlidersViewController *)inRefCon;
static int phase = 1;
for(UInt32 i = 0; i < ioData->mNumberBuffers; i++) {
int samples = ioData->mBuffers[i].mDataByteSize / sizeof(SInt16);
SInt16 values[samples];
float waves;
for(int j = 0; j < samples; j++) {
waves = 0;
waves += sin(kWaveform * me.fr1 * phase)*(me.vol1);
waves += sin(kWaveform * me.fr2 * phase)*(me.vol2);
waves += sin(kWaveform * me.fr3 * phase)*(me.vol3);
waves *= sin(kWaveform * (me.fr4/100) * phase)*(me.vol4);
waves *= 32500 / 4;
values[j] = (SInt16)waves;
values[j] += values[j]<<16;
phase++;
}
memcpy(ioData->mBuffers[i].mData, values, samples * sizeof(SInt16));
}
return noErr;}
或
被触发。有没有办法解决这个问题,让它听起来更流畅?
谢谢 我的猜测是,您只是更改了波形参数,而没有在这两个值之间平滑插值,因此您的波形会被破坏,听起来“静止”
更改波形生成函数,使其在旧值(帧开始处)和新值(帧结束处)之间插值。您将在内部循环中相乘以计算相位。频率倍增器的任何变化,都会在相位上产生一个潜在的大跳跃,从而产生“砰”的一声 在内部循环中添加增量相位,而不是相乘。由于δ相只会发生少量变化,因此相位也会发生变化,并且会有更小的不连续性
deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;
我想下面的帖子可以解决你的问题:
我对如何实现这一点有点困惑。我有一个类似的想法,那就是做一些类似于currentFrequency=oldFrequency+((newFrequency-oldFrequency)*(currentPhase/sampleRate))的事情,但我一直被卡住。你能告诉我如何实现你的deltaPhase方法吗?谢谢好吧,还是不走运。。。要么用我的技术,要么试着用你的deltaPhase方法。我被困在这里。@wyager:你从你的内环中移除了所有的相位倍增吗?你不需要任何,只需要添加,除了可能的音量缩放。我不知道你的意思。。。我不知道如何在不在sin()函数中乘法的情况下生成波形,而使用waves*=的倒数第二个操作只会调制波形,不会影响弹出的声音。我只是不确定这里如何使用加法…我敢打赌,如果你查一下乘法的定义,你一定能找到它。。。
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}
deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;