Je souhaite autoriser l'audio d'arrière-plan lorsque l'application n'est pas active. J'ai actuellement ce code, qui devrait permettre que:Autorisation de l'audio d'arrière-plan lorsque Swift ne fonctionne pas
do {
try AKSettings.setSession(category: .playback, with: .mixWithOthers)
} catch {
print("error")
}
AKSettings.playbackWhileMuted = true
J'ai aussi le réglage « Audio, Airplay et image dans l'image » activée dans les paramètres des capacités. Cependant, lorsque j'appuie sur le bouton d'accueil de mon appareil, l'audio ne continue pas à jouer. Qu'est-ce que je fais mal? J'utilise AudioKit pour produire des sons si cela compte. J'utilise un singleton pour héberger tous les composants AudioKit que j'ai nommés AudioPlayer.swift. Voici ce que j'ai dans mon AudioPlayer.swift fichier singleton:
class AudioPlayer: NSObject {
var currentFrequency = String()
var soundIsPlaying = false
var leftOscillator = AKOscillator()
var rightOscillator = AKOscillator()
var rain = try! AKAudioFile()
var rainPlayer: AKAudioPlayer!
var envelope = AKAmplitudeEnvelope()
override init() {
super.init()
do {
try AKSettings.setSession(category: .playback, with: .mixWithOthers)
} catch {
print("error")
}
AKSettings.playbackWhileMuted = true
AudioKit.output = envelope
AudioKit.start()
}
func setupFrequency(left: AKOscillator, right: AKOscillator, frequency: String) {
currentFrequency = frequency
leftOscillator = left
rightOscillator = right
let leftPanner = AKPanner(leftOscillator)
leftPanner.pan = -1
let rightPanner = AKPanner(rightOscillator)
rightPanner.pan = 1
//Set up rain and rainPlayer
do {
rain = try AKAudioFile(readFileName: "rain.wav")
rainPlayer = try AKAudioPlayer(file: rain, looping: true, deferBuffering: false, completionHandler: nil)
} catch { print(error) }
let mixer = AKMixer(leftPanner, rightPanner, rainPlayer)
//Put mixer in sound envelope
envelope = AKAmplitudeEnvelope(mixer)
envelope.attackDuration = 2.0
envelope.decayDuration = 0
envelope.sustainLevel = 1
envelope.releaseDuration = 0.2
//Start AudioKit stuff
AudioKit.output = envelope
AudioKit.start()
leftOscillator.start()
rightOscillator.start()
rainPlayer.start()
envelope.start()
soundIsPlaying = true
}
}
Et voici un exemple d'un de mes contrôleurs sonores de vue de l'effet, qui font référence à la singleton AudioKit pour envoyer une certaine fréquence (je sur une douzaine de ces contrôleurs vue, chacun avec ses propres réglages de fréquence):
class CalmView: UIViewController {
let leftOscillator = AKOscillator()
let rightOscillator = AKOscillator()
override func viewDidLoad() {
super.viewDidLoad()
leftOscillator.amplitude = 0.3
leftOscillator.frequency = 220
rightOscillator.amplitude = 0.3
rightOscillator.frequency = 230
}
@IBAction func playSound(_ sender: Any) {
if shared.soundIsPlaying == false {
AudioKit.stop()
shared.setupFrequency(left: leftOscillator, right: rightOscillator, frequency: "Calm")
} else if shared.soundIsPlaying == true && shared.currentFrequency != "Calm" {
AudioKit.stop()
shared.leftOscillator.stop()
shared.rightOscillator.stop()
shared.rainPlayer.stop()
shared.envelope.stop()
shared.setupFrequency(left: leftOscillator, right: rightOscillator, frequency: "Calm")
} else {
shared.soundIsPlaying = false
shared.envelope.stop()
}
}
}
J'instancié singleton AudioPlayer dans mon fichier ViewController.swift.
Il y a une ligne fine entre avoir assez de code et avoir trop. La question que vous avez posée a été répondue ci-dessous. Vous semblez avoir des choses correctement configurées. Testez l'exemple AudioKit SongProcessor pour voir s'il se comporte comme il le devrait et ensuite comparez votre code à celui-ci. Il n'y a pas de raccourcis et de solutions faciles parfois. –