Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用remoteIO生成iPhone音频时防止弹出声音?_Iphone_Objective C_Audio_Waveform - Fatal编程技术网

如何在使用remoteIO生成iPhone音频时防止弹出声音?

如何在使用remoteIO生成iPhone音频时防止弹出声音?,iphone,objective-c,audio,waveform,Iphone,Objective C,Audio,Waveform,所以,不久前,我正在开发一个波形发生器应用程序,遇到了一些问题,但肯尼·温克是一个真正的救星,他帮助我基本上把一切都搞定了。然而,我最终遇到的一个问题是,每当我改变我使用的频率值时(在较小程度上,当我改变音量值时),我最终会听到这些丑陋的爆裂声。这是一个问题,因为整个要点是能够用滑块平滑地改变波的频率和体积,而听起来像是弄皱的纸会破坏这种效果。这是我的OSStatus控制音量/频率的代码 OSStatus playbackCallback(void *inRefCon,

所以,不久前,我正在开发一个波形发生器应用程序,遇到了一些问题,但肯尼·温克是一个真正的救星,他帮助我基本上把一切都搞定了。然而,我最终遇到的一个问题是,每当我改变我使用的频率值时(在较小程度上,当我改变音量值时),我最终会听到这些丑陋的爆裂声。这是一个问题,因为整个要点是能够用滑块平滑地改变波的频率和体积,而听起来像是弄皱的纸会破坏这种效果。这是我的OSStatus控制音量/频率的代码

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 ;