AVAudioPlayer не думает, что он играет, когда он - PullRequest
0 голосов
/ 09 мая 2020

Я вызываю функцию superPlay, чтобы начать воспроизведение звука немного позже, я снова вызываю функцию superPlay, чтобы остановить воспроизведение. Это не работает, потому что player.isPlaying ложно, даже зная, что звук явно воспроизводится в бесконечном l oop. Я понятия не имею, почему, пожалуйста, помогите!

   func superPlay(timeInterval: TimeInterval, soundName: String) {
        do {
            alarmSound = soundName
            //set up audio session
            try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker, .duckOthers])
            try AVAudioSession.sharedInstance().setActive(true)

            let url = Bundle.main.url(forResource: alarmSound, withExtension: "mp3")

            player = try! AVAudioPlayer(contentsOf: url!)
            player.numberOfLoops = -1
            //Start AVAudioPlayer
            print(timeInterval)
            print(time)
            let playbackDelay = timeInterval  // must be ≥ 0

            if player.isPlaying {
                player.stop()
            } else {
                player.play(atTime: player.deviceCurrentTime + playbackDelay) //time is a TimeInterval after which the audio will start
            }
        }
        catch {
            print(error)
        }
    }

Я потратил еще пару дней на отладку этого. Что происходит, так это то, что исходное воспроизведение назначается определенному c идентификатору AudioPlayer, например, печать: "Optional(<AVAudioPlayer: 0x600002802280>)" Когда я снова вызываю функцию, чтобы остановить воспроизведение, AVAudioPlayer назначается другой идентификатор, поэтому он не обнаруживает, что старый проигрыватель все еще играет и движется вперед, воспроизводя новый звук поверх старого.

Я не уверен, как сохранить идентификатор AVAudioPlayer, а затем вызвать функцию, чтобы она проверила хранилище Player на предмет «.isPlaying» ??

1 Ответ

0 голосов
/ 09 мая 2020

Это происходит потому, что вы инициализируете его перед остановкой текущего звука. Попробуйте так: -

    func superPlay(timeInterval: TimeInterval, soundName: String) {

        //        If audio is playing already then stop it.
        if let audioPlayer = player {
            if player.isplaying {
                player.stop()
            }
        }
        //        Initilize audio player object with new sound
        do {
            alarmSound = soundName
            //set up audio session
            try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker, .duckOthers])
            try AVAudioSession.sharedInstance().setActive(true)

            let url = Bundle.main.url(forResource: alarmSound, withExtension: "mp3")

            player = try! AVAudioPlayer(contentsOf: url!)
            player.numberOfLoops = -1
            //Start AVAudioPlayer
            print(timeInterval)
            print(time)
            let playbackDelay = timeInterval  // must be ≥ 0

            player.play(atTime: player.deviceCurrentTime + playbackDelay) //time is a TimeInterval after which the audio will start
        }
        catch {
            print(error)
        }
    }
...