У меня есть два звука (пинг и сигнал тревоги), которые должны воспроизводиться при выполнении соответствующих условий. Оба звука воспроизводятся повторно.
Возможно, что оба звука перекрываются друг с другом, поэтому я объявил отдельный AVAudioPlayer для воспроизведения каждого звука (pingPlayer и alarmPlayer).
Тип заморозки:
Пинг и будильник воспроизводятся самостоятельно, но когда оба активированы, в начале все приложение зависает.
Тип заморозки:
Когда активируется только сигнал тревоги с дополнительными операторами паузы или остановки в коде, приложение также останавливается.
import AVFoundation
private var pingPlayer: AVAudioPlayer?
private var alarmPlayer: AVAudioPlayer?
func playPing() {
guard let url = Bundle.main.url(forResource: "ping", withExtension: "mp3") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
pingPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
guard let player = pingPlayer else { return }
player.play()
} catch let error {
print(error.localizedDescription)
}
}
alarmPlayer инициализируется в viewDidLoad ()
Потому что, когда alarmPlayer инициализируется в отдельной функции (например, playPing ()), приложение все равно зависает.
override viewDidLoad() {
//...
guard let url = Bundle.main.url(forResource: "alarm", withExtension: "mp3") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
alarmPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
} catch let error {
print(error.localizedDescription)
}
}
//alarmPlayer is then called after the condition like this:
alarmPlayer?.prepareToPlay()
alarmPlayer?.play()
- Тип заморозки:
вызывается после выполнения определенного условия
alarmPlayer?.stop() //or alarmPlayer?.pause()