Я вызываю функцию 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» ??