Hallo Forum,
ich bin neu in Swift und macOS Programmierung. Um Swift für macOS zu lernen habe ich mir ein Projekt ausgedacht. Ein Teil des Projektes erfordert es eine Audiodatei zu Laden, abzuspielen sowie Geschwindigkeit und Tonhöhe anzupassen.
Wenn ich alles richtig Verstanden habe, sollte alles, was ich möchte mit der AVAudioEngine möglich sein.
Ein Lauffähiges Setup des Audios habe ich durch diese zwei Tutorials hinbekommen.
Gilt eigentlich für iOS aber das Framework gibt es auch für macOS - hackingwithswift
Damit das Audio unter macOS auch funktioniert muss, nur ein MainMixer initialisiert werden, ohne diese war bzw. ist das Tutorial von iOS nicht auf macOS lauffähig bzw. es kommt ein Ton.
Dies habe ich mir hier medium.com aus dem Quellcode herausgelesen.
Play, geht bei mir ohne Probleme.
Möchte ich jedoch Geschwindigkeit und Tonhöhe verändert, passiert einfach nichts (zumindest nichts hörbares)!
Ich hoffe, ihr könnt mir hier helfen und sagen was ich falsch mache.
Alles anzeigen
Play, Pause habe ich über einen Button realisiert was auch funktioniert. Was nur ein player.play() und player.pause() aufruft.
Geschwindigkeit möchte ich über einen Slider realisieren, der dann diese Funktion aufruft.
Alles anzeigen
Egal was ich an speedControl.rate oder pitchControl.pitch übergebe, es ändert sich nichts.
Testweise habe auch mal Werte gesetzt, wo ich die Enging einrichte, aber es passiert einfach nichts.
Ich hoffe, ich konnte das Problem verständlich erklären.
Schon mal vielen Dank im Voraus!
ich bin neu in Swift und macOS Programmierung. Um Swift für macOS zu lernen habe ich mir ein Projekt ausgedacht. Ein Teil des Projektes erfordert es eine Audiodatei zu Laden, abzuspielen sowie Geschwindigkeit und Tonhöhe anzupassen.
Wenn ich alles richtig Verstanden habe, sollte alles, was ich möchte mit der AVAudioEngine möglich sein.
Ein Lauffähiges Setup des Audios habe ich durch diese zwei Tutorials hinbekommen.
Gilt eigentlich für iOS aber das Framework gibt es auch für macOS - hackingwithswift
Damit das Audio unter macOS auch funktioniert muss, nur ein MainMixer initialisiert werden, ohne diese war bzw. ist das Tutorial von iOS nicht auf macOS lauffähig bzw. es kommt ein Ton.
Dies habe ich mir hier medium.com aus dem Quellcode herausgelesen.
Play, geht bei mir ohne Probleme.
Möchte ich jedoch Geschwindigkeit und Tonhöhe verändert, passiert einfach nichts (zumindest nichts hörbares)!
Ich hoffe, ihr könnt mir hier helfen und sagen was ich falsch mache.
C-Quellcode
- class ViewController: NSViewController {
- @IBOutlet weak var playButton: NSButton!
- @IBOutlet weak var stopButton: NSButton!
- @IBOutlet weak var volumeSlider: NSSlider!
- @IBOutlet weak var speedSlider: NSSlider!
- @IBOutlet var showVolume: NSTextField!
- @IBOutlet var showSpeed: NSTextField!
- let player = AVAudioPlayerNode()
- let engine = AVAudioEngine()
- let speedControl = AVAudioUnitVarispeed()
- let pitchControl = AVAudioUnitTimePitch()
- var fileURL: URL!
- ...
- // fileURL wird durch ein File Dialog path in URL.
- ...
- fileURL = URL(fileURLWithPath: url!.path)
- _ = engine.mainMixerNode
- do {
- let audioFile = try AVAudioFile(forReading: fileURL)
- //let format = audioFile.processingFormat
- engine.attach(player)
- engine.attach(speedControl)
- engine.attach(pitchControl)
- engine.connect(player, to: speedControl, format: nil)
- engine.connect(player, to: engine.mainMixerNode, format: nil)
- engine.connect(speedControl, to: pitchControl, format: nil)
- engine.connect(pitchControl, to: engine.mainMixerNode, format: nil)
- player.scheduleFile(audioFile, at: nil, completionHandler: nil)
- } catch let error {
- print(error.localizedDescription)
- }
- engine.prepare()
- do {
- try engine.start()
- } catch let error {
- print("Error: \(error.localizedDescription)")
- }
- } else {
- // Cancel Clicked
- return
- }
- }
Play, Pause habe ich über einen Button realisiert was auch funktioniert. Was nur ein player.play() und player.pause() aufruft.
Geschwindigkeit möchte ich über einen Slider realisieren, der dann diese Funktion aufruft.
C-Quellcode
- @IBAction func setSpeed(_ sender: Any) {
- let number = speedSlider.floatValue / 100.0
- let formatted = String(format: "%.1f", number)
- let speed = (formatted as NSString).floatValue
- print("pitch: \(speed/2)")
- pitchControl.pitch = speed/2
- print("rate: \(speed)")
- speedControl.rate = speed
- showSpeed.floatValue = speed
- print("speed: \(speed)")
- }
Testweise habe auch mal Werte gesetzt, wo ich die Enging einrichte, aber es passiert einfach nichts.
Ich hoffe, ich konnte das Problem verständlich erklären.
Schon mal vielen Dank im Voraus!