Matt Gallagher 的 iOS 音频生成器

问题描述 投票:0回答:1

有人可以给我指点 Matt Gallagher 的音调生成器的工作版本吗?

http://www.cocoawithlove.com/assets/objc-era/ToneGenerator.zip

正如 Matt 所说,它还没有更新,并且显然被新的 API 破坏了。我更新了我能找出需要更新的内容,现在它编译并运行时仅出现弃用警告,但它所做的只是在触摸“播放”和“停止”按钮时发出点击声。我已经浏览了代码并查看了 Xcode 中 API 的文档,但这是一个陡峭的学习曲线。我希望有一个工作版本,这样我就可以修改它以了解更多信息。有人更新了吗?或者类似的音调发生器?

我尝试通过如下调用来使用 hotpaw2 中的 ToneOutputUnit 类。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let unit = ToneOutputUnit()
        unit.toneCount = 64000
        unit.setFrequency(1000.0)
        unit.setToneVolume(0.5)
        unit.startToneForDuration(2.0)
        unit.enableSpeaker()
        print("ok")
    }
}

我可以看到 ToneOutputUnit 代码正在被调用,并且正在逐步执行各种函数,但没有产生声音。我还尝试在“startToneForDuration”之前调用“enableSpeaker”,但也没有声音。我错过了什么?

swift audio core-audio
1个回答
3
投票

吉恩·德丽莎当然是对的。 “unit”变量需要在 viewDidLoad 之外声明,这样它就不会立即被释放。另外,“unit.enableSpeaker()”需要位于“unit.startToneForDuration(0.5)”之前。然而,即使进行了这两个更改,我也没有听到任何声音。经过更多的绞尽脑汁之后,我在 hotpaw2 的 ToneOutputUnit.swift(在 github 中)中发现了两个缩放错误。

1) 在函数 startToneForDuration 中,“toneCount = Int32(round( time / SampleRate ))”行应为“toneCount = Int32(time * SampleRate)”。

2) 在函数 setToneVolume 中,“v0 = vol / 32768.0”行应为“v0 = vol * 32768.0”。

通过这两项更改,它可以工作并产生音量和持续时间似乎合理的音调。

@Hotpaw2:我希望你能更新你在github上的版本。这是一个写得很好的课程,可以帮助其他人。

© www.soinside.com 2019 - 2024. All rights reserved.