使用 Swift 2.1 在 iOS 中播放两种声音



我有一个应用程序,包括一个选择轮和一个播放按钮。 当用户选择所需的声音并单击播放按钮时,声音将播放。 除此之外,我还有一个"随机"按钮,它将生成一个随机数,将选取器轮移动到适当的数组索引,然后播放声音。 所有这些都工作正常。

问题是我正在尝试添加一个"组合"按钮,该按钮基本上与"随机"按钮相同,但我希望它播放 2 或 3 个声音,而不是只播放 1 个声音。

这是我现有的代码(playComboSound函数的问题(:

// Play Audio
var audioPlayer = AVAudioPlayer()
func playAudio() {
    do {
        if let bundle = NSBundle.mainBundle().pathForResource(Sounds[selection], ofType: "mp3") {
            let alertSound = NSURL(fileURLWithPath: bundle)
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        }
    } catch {
        print(error)
    }
}
@IBAction func playRandomSound(sender: AnyObject) {
    // Generate Random Number Based on SoundNames Array Count and assign to Selection
    let randomNumber = Int(arc4random_uniform(UInt32(SoundNames.count)))
    selection = randomNumber
    // Move Picker Wheel to Match Random Number and Play Sound
    self.picker.selectRow(selection, inComponent: 0, animated: true)
    playAudio()
}
@IBAction func playComboSound(sender: AnyObject) {
    // Generate Random Number Based on SoundNames Array Count and assign to Selection
    let randomNumber1 = Int(arc4random_uniform(UInt32(SoundNames.count)))
    selection = randomNumber1
    // Move Picker Wheel to Match Random Number and Play Sound
    self.picker.selectRow(selection, inComponent: 0, animated: true)
    playAudio()
    // Generate Random Number Based on SoundNames Array Count and assign to Selection
    let randomNumber2 = Int(arc4random_uniform(UInt32(SoundNames.count)))
    selection = randomNumber2
    // Move Picker Wheel to Match Random Number and Play Sound
    self.picker.selectRow(selection, inComponent: 0, animated: true)
    playAudio()
}

当我单击playComboSound按钮时,它基本上与playRandomSound按钮相同。 移动选取器轮并播放声音,但它只执行一次而不是两次。 如果我在两者之间睡觉,我会在演奏两种声音时获得一定程度的成功,但它似乎只移动过一次选择轮(对于第二个声音(。 任何帮助将不胜感激! 谢谢。

移动选取器轮并播放声音,但它只执行一次而不是两次。

它播放一次声音,因为对 playAudio 的第二次调用会用一个新的 AVAudioPlayer 实例覆盖共享的 audioPlayer 变量,该实例会解除分配第一个变量。您应该保留对所有活动音频播放器的引用数组/集,以防止它们被解除分配,并且仅在它们完成后才从此集中删除它们(使用AVAudioPlayerDelegate回调来检测播放器何时完成(。

如果我在两者之间睡觉,我会在演奏两种声音时获得一定程度的成功,但它似乎只移动过一次选择轮(对于第二个声音(。

睡眠会有所帮助,因为当主线程处于休眠状态时,AVFoundation 的线程有机会运行,它们可以在第一个AVAudioPlayer开始播放,然后再对 playAudio 的第二次调用覆盖它并解除分配。不过,您在这里依赖于未定义的行为。

它似乎只移动过一次拾取器轮(第二次声音(

这是预期的行为。在选取器轮上只能选择单个项目。对 selectRow 的第二个调用将覆盖第一个调用。

最新更新