限制或延长播放的样本数量

时间:2012-03-11 21:08:21

标签: ios audio core-audio sampling sine

我正在尝试this example中的代码,基本上我想限制播放的样本数量。

现在,一旦你点击播放按钮,应用程序会以设定的频率播放音调,但在你停止播放之前它不会停止。我想只播放一声声音。

知道怎么做吗?我已经尝试将inNumberFrames更改为44100,但所有这一切都会让我的语气不稳定。

// Generate the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++) 
{
    buffer[frame] = sin(theta) * amplitude;

    theta += theta_increment;
    if (theta > 2.0 * M_PI)
    {
        theta -= 2.0 * M_PI;
    }
}

修改

Kurt Revis说CoreAudio重复调用你的RenderTone()函数。我没有想到这一点,但我想这是有道理的。它确实引出了另一个问题:如果我想像4分钟的歌曲一样发送到缓冲区会发生什么? (44100 * 60 * 4个样本)

如果重复调用RenderTone方法,我猜它每次都会从头开始播放样本。我怎样才能播放一长串样本?

1 个答案:

答案 0 :(得分:1)

两种可能性。

  1. 高级别:开始播放时,请创建一个NSTimer,调用方法在一秒钟后调用-stop。或者使用-[NSObject performSelector:withObject:afterDelay:]

  2. 低级别:在RenderTone()中,记录已播放的样本数量。在调用RenderTone()时,将该值保存在视图控制器中的ivar中,与theta的方式完全相同。在样本生成循环中,如果样本计数>> 44100,则将buffer[frame]设置为0.

  3. 要理解的基本要点是:只要需要更多音频数据,CoreAudio就会重复调用RenderTone()函数。它会要求您提供一定数量的数据(inSampleCount),并且您需要提供更多,不多也不少的数据。如果你想让它播放静音,那么你需要用零填充缓冲区。

相关问题