Matt Gallagher 的 iOS 音调发生器

Matt Gallagher's iOS Tone Generator

谁能告诉我 Matt Gallagher 的 Tone Generator 的工作版本?

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

正如 Matt 所说,它没有更新,显然被较新的 APIs 破坏了。我更新了我认为需要更新的内容,现在它编译和运行时只有弃用警告,但它所做的只是在触摸 "Play" 和 "Stop" 按钮时发出咔哒声。我已经浏览了代码并查看了 Xcode 中的 API 文档,但这是一条陡峭的学习曲线。我很想有一个工作版本,这样我就可以修改它以了解更多信息。有人更新了吗?或者类似的音调发生器?

我尝试使用 hotpaw2 中的 ToneOutputUnit class,方法如下。

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',但也没有声音。我错过了什么?

Gene De Lisa 当然是对的。 "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更新你的版本。写得很好 class 会对其他人有所帮助。