Ich versuche Apples AVMIDIPlayer
Objekt für das Abspielen einer MIDI-Datei zu verwenden. Es scheint einfach genug in Swift, mit dem folgenden Code:Wie hält man AVMIDIPlayer am Laufen?
let midiFile:NSURL = NSURL(fileURLWithPath:"/path/to/midifile.mid")
var midiPlayer: AVMIDIPlayer?
do {
try midiPlayer = AVMIDIPlayer(contentsOf: midiFile as URL, soundBankURL: nil)
midiPlayer?.prepareToPlay()
} catch {
print("could not create MIDI player")
}
midiPlayer?.play {
print("finished playing")
}
Und es spielt für etwa 0,05 Sekunden. Ich nehme an, ich muss es in irgendeiner Art von Schleife einrahmen. Ich habe eine einfache Lösung versucht:
while stillGoing {
midiPlayer?.play {
let stillGoing = false
}
}
was funktioniert, aber ramps die CPU massiv. Gibt es einen besseren Weg? Neben dem ersten Kommentar habe ich versucht, eine Klasse zu erstellen, und obwohl es keine Fehler anzeigt, funktioniert es auch nicht.
class midiPlayer {
var player: AVMIDIPlayer?
func play(file: String) {
let myURL = URL(string: file)
do {
try self.player = AVMIDIPlayer.init(contentsOf: myURL!, soundBankURL: nil)
self.player?.prepareToPlay()
} catch {
print("could not create MIDI player")
}
self.player?.play()
}
func stop() {
self.player?.stop()
}
}
// main
let myPlayer = midiPlayer()
let midiFile = "/path/to/midifile.mid"
myPlayer.play(file: midiFile)
Also muss ich eine Klasse mit diesem Code als Funktion/Methode erstellen, und dann eine Instanz der Klasse erstellen und die Methode aufrufen? Bisher ist dies nur ein CLI-Skript, also keine UI-Controller. – benwiggy
Ah ok, in diesem Fall ist die Verwendung der Schleife der einzige Weg zu gehen. Setzen Sie einen 'sleep (1)' Anruf in die While-Schleife, so dass nicht die ganze CPU-Zeit verbraucht wird. Außerdem bin ich mir ziemlich sicher, dass du den 'midiPlayer? .play' Aufruf aus der while-Schleife entfernen musst. –