【问题标题】:limit or extend the number of samples that are played限制或扩展播放的样本数量
【发布时间】:2012-03-11 21:08:20
【问题描述】:

我正在尝试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 方法被重复调用,我猜它每次都会从头开始播放样本。如何播放一长串样本?

【问题讨论】:

    标签: ios audio core-audio sampling trigonometry


    【解决方案1】:

    两种可能性。

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

    2. 低级:在RenderTone() 中,跟踪已经播放了多少样本。在对RenderTone() 的调用中,将该值保存在视图控制器中的ivar 中,与theta 完全相同。在样本生成循环中,如果样本数 >= 44100,则将 buffer[frame] 设置为 0。

    要了解的基本内容是:CoreAudio 会在需要播放更多音频数据时反复调用您的RenderTone() 函数。它会要求您提供一定数量的数据 (inSampleCount),而您需要提供的正是那么多,不多也不少。如果你想让它播放静音,那么你需要用零填充缓冲区。

    【讨论】:

    • 感谢澄清,我更新了我的问题,你能看看吗?
    • 您是提供样品的人。由你决定让它做你想做的事。如果您想播放较长的声音,则由您来跟踪您已经播放过哪些样本以及接下来播放哪些样本。如果您想要更简单的方法,您应该查看Audio Queue,这是一个更高级别的 API。
    • 例如。假设您有 100 个样本,并且您想从头开始播放它们。制作一个变量“i”,它是下一个要播放的样本的索引。最初它是 0。CoreAudio 要求你播放 5 个样本,所以你用样本 0-4(i 到 i+4)填充它的缓冲区,并将 i 设置为 5。然后 CoreAudio 要求你再提供 5 个样本,然后你填充它缓冲样本 5-9(i 到 i+4),并将 i 设置为 10。依此类推。
    • 我也去看看 AQ。感谢您的帮助
    猜你喜欢
    • 2015-12-02
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2012-09-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多