Swift: невозможно воспроизвести каждую звуковую последовательность на основе массива - PullRequest
0 голосов
/ 29 апреля 2018

Я пытался выяснить, как воспроизвести последовательность звуков на основе значений в массиве с помощью оператора switch case. Пока он воспроизводит только последний целочисленный звук.

То, чего я хочу добиться, - это когда я нажимаю кнопку «Воспроизвести», она проходит по всем значениям массива soundSeq и воспроизводит соответствующий звук до остановки. Но в этом случае он воспроизводит звук только для tagid 5.

import UIKit
import AVFoundation

class UIController: UIViewController {
    var audioPlayer : AVAudioPlayer!

    let soundSeq = [2,4,5]

    func playSoundSeq() {
        for tag in soundSeq {
            switch tag {
            case 1 : loopSoundSeq(tagid: tag)
            case 2 : loopSoundSeq(tagid: tag)
            case 3 : loopSoundSeq(tagid: tag)
            case 4 : loopSoundSeq(tagid: tag)
            case 5 : loopSoundSeq(tagid: tag)
            case 6 : loopSoundSeq(tagid: tag)
            case 7 : loopSoundSeq(tagid: tag)
            default : print("no sound played")
            }
        }
    }

    @IBAction func playButton(_ sender: UIButton) {
        playSoundSeq()
    }

    func loopSoundSeq(tagid: Int) {
        var soundURl = Bundle.main.url(forResource: "minisound\(tagid)", withExtension: "wav")

        //machinePlay.append(sender.tag)

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: soundURl!)
        }
        catch {
            print(soundURl)
        }

        audioPlayer.play()
    }
}

1 Ответ

0 голосов
/ 29 апреля 2018

Вам нужно дождаться окончания воспроизведения каждого звука, прежде чем начинать следующий. Пусть ваш класс примет AVAudioPlayerDelegate и реализует метод AVAudioPlayerDelegate audioPlayerDidFinishPlaying(_:successfully:) и запустит следующий звук в последовательности:

import UIKit
import AVFoundation

class UIController: UIViewController, AVAudioPlayerDelegate {
    var audioPlayer: AVAudioPlayer!

    let soundSeq = [2, 4, 5]
    var index = 0

    func playSoundSeq() {
        if index < soundSeq.count {
            loopSoundSeq(tagid: soundSeq[index])
            index += 1
        }
    }

    @IBAction func playButton(_ sender: UIButton) {
        index = 0
        playSoundSeq()
    }

    func loopSoundSeq(tagid: Int) {
        let soundURL = Bundle.main.url(forResource: "minisound\(tagid)", withExtension: "wav")!

        //machinePlay.append(sender.tag)

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
            audioPlayer.delegate = self
        }
        catch {
            print(soundURL)
        }

        audioPlayer.play()
    }

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        if flag {
            playSoundSeq()
        }
    }
}
...