Воспроизводить аудио, используя другой файл swift

Ниже приведен код, представляющий файл для аудиоплеера. Я пытаюсь использовать его для воспроизведения звуков в моей программе. Я не хочу помещать функцию AVPlayer в каждый контроллер представления для воспроизведения повторяющихся звуков, поэтому я ищу способ разместить все в одном месте и при необходимости вызывать определенную функцию (музыка, щелчок, вступление)

import UIKit
import AVFoundation

class player: UIViewController
{
var music:Bool = true
var sound:Bool = true
var intro:Bool = true

var soundPlayer: AVAudioPlayer?
var clickPlayer: AVAudioPlayer?
var musicPlayer : AVAudioPlayer?
{
    get
    {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        return appDelegate.musicPlayer
    }
    set
    {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.musicPlayer = newValue
    }
}

func playSound(title: String, format: String)
{
    if sound == true
    {
        guard let url = Bundle.main.url(forResource: title, withExtension: format)

            else { return }

        do
        {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            soundPlayer = try AVAudioPlayer(contentsOf: url)

            soundPlayer?.play()
        }
        catch let error
        {
            print(error.localizedDescription)
        }
    }
}

func playClick()
{
    if sound == true
    {
        guard let url = Bundle.main.url(forResource: "click", withExtension: "mp3")

            else { return }

        do
        {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            let clickPlayer = try AVAudioPlayer(contentsOf: url)

            clickPlayer.play()
        }
        catch let error
        {
            print(error.localizedDescription)
        }
    }
}

func playMusic()
{
    if music == true
    {
        guard let url = Bundle.main.url(forResource: "ambientMusic", withExtension: "mp3")

            else { return }

        do
        {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            musicPlayer = try AVAudioPlayer(contentsOf: url)

            musicPlayer?.play()
            musicPlayer?.numberOfLoops = -1
        }
        catch let error
        {
            print(error.localizedDescription)
        }
    }
}
}

Другой файл:

@IBAction func play(_ sender: Any)
{
    player().playClick()
    performSegue(withIdentifier: "menuToIntro", sender: self)
}

Но это ничего не играет. Просто печатает журнал AQDefaultDevice (173): пропуск входного потока 0 0 0x0

2 ответа

Из обсуждения здесь это ошибка симулятора Xcode, и вы должны попытаться перейти в Edit Scheme > Run > Arguments и добавить переменную окружения OS_ACTIVITY_MODE, значение disable.

Хорошо, нашел проблему. В моем случае необходимо хранить игрока как свойство или другую переменную, которая не будет уничтожена. Вот почему логи - звук воспроизводился, но сразу прекращался. Я исправил это, объявив AVAudioPlayers в AppDelegate

Другие вопросы по тегам