我正在尝试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方法,我猜它每次都会从头开始播放样本。我怎样才能播放一长串样本?
答案 0 :(得分:1)
两种可能性。
高级别:开始播放时,请创建一个NSTimer,调用方法在一秒钟后调用-stop
。或者使用-[NSObject performSelector:withObject:afterDelay:]
。
低级别:在RenderTone()
中,记录已播放的样本数量。在调用RenderTone()
时,将该值保存在视图控制器中的ivar中,与theta
的方式完全相同。在样本生成循环中,如果样本计数>> 44100,则将buffer[frame]
设置为0.
要理解的基本要点是:只要需要更多音频数据,CoreAudio就会重复调用RenderTone()
函数。它会要求您提供一定数量的数据(inSampleCount
),并且您需要提供更多,不多也不少的数据。如果你想让它播放静音,那么你需要用零填充缓冲区。