From 6cd7989f7ffef8494397eaad0ac6dfd81b3900c0 Mon Sep 17 00:00:00 2001 From: mahal raskin Date: Wed, 15 May 2024 19:49:39 +0200 Subject: [PATCH 1/4] no need for exclamation marks !-) --- .../Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift index 23f4a53..6d95ccc 100644 --- a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift +++ b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift @@ -68,8 +68,8 @@ struct AudioPlayerCompletionHandler: View { var body: some View { Text("AudioPlayer Completion Handler") .padding() - Text("This will play one file. Once it completes, it will play another!") - Text("That's one thing a completion handler can do!") + Text("This will play one file. Once it completes, it will play another.") + Text("That's one thing a completion handler can do.") VStack { ProgressView(playLabel, value: currentPlayTime, total: playDuration) } From 9ed9df050e593e932493273d8cd14f551b53a182 Mon Sep 17 00:00:00 2001 From: mahal raskin Date: Wed, 15 May 2024 19:51:37 +0200 Subject: [PATCH 2/4] no need for a timer to update the UI and poll for duration every 10 msec. Using a ProgressView with a Date Interval. --- .../AudioPlayerCompletionHandler.swift | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift index 6d95ccc..fc1a1b5 100644 --- a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift +++ b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift @@ -6,7 +6,7 @@ class CompletionHandlerConductor: ObservableObject, HasAudioEngine { let engine = AudioEngine() var player = AudioPlayer() var fileURL = [URL]() - var currentTime = 0.0 + @Published var playDuration = 0.0 var currentFileIndex = 0 // Load the files to play @@ -22,22 +22,17 @@ class CompletionHandlerConductor: ObservableObject, HasAudioEngine { } fileURL.append(url) } - try? player.load(url: fileURL[0]) } /* Completion handler function: a function returning void */ func playNextFile() { - currentTime = 0.0 if currentFileIndex < 4 { currentFileIndex += 1 - try? player.load(url: fileURL[currentFileIndex]) - player.play() } else { currentFileIndex = 0 - try? player.load(url: fileURL[currentFileIndex]) - player.play() } + startPlaying() } init() { @@ -49,6 +44,14 @@ class CompletionHandlerConductor: ObservableObject, HasAudioEngine { player.completionHandler = playNextFile } + func startPlaying() { + try? player.load(url: fileURL[currentFileIndex]) + player.play() + if let duration = player.file?.duration { + playDuration = duration + } + } + // Player functions func loadFile(url: URL) { do { @@ -60,39 +63,27 @@ class CompletionHandlerConductor: ObservableObject, HasAudioEngine { } struct AudioPlayerCompletionHandler: View { - let timer = Timer.publish(every: 0.01, on: .main, in: .common).autoconnect() - @State var currentPlayTime = 0.0 - @State var playDuration = 0.0 - @State var playLabel = "" @StateObject var conductor = CompletionHandlerConductor() + var body: some View { Text("AudioPlayer Completion Handler") .padding() Text("This will play one file. Once it completes, it will play another.") Text("That's one thing a completion handler can do.") VStack { - ProgressView(playLabel, value: currentPlayTime, total: playDuration) + let playLabel = "Playing: " + conductor.fileURL[conductor.currentFileIndex] + .deletingPathExtension().lastPathComponent + let playTimeRange = Date()...Date().addingTimeInterval(conductor.playDuration) + ProgressView(timerInterval: playTimeRange, countsDown: false) { + Text(playLabel) + } } .onAppear { conductor.start() - conductor.player.play() + conductor.startPlaying() } .onDisappear { conductor.stop() } - .onReceive(timer) { _ in - currentPlayTime = conductor.currentTime - if let duration = conductor.player.file?.duration { - playDuration = duration - } - if currentPlayTime < playDuration { - conductor.currentTime += 0.01 - } else { - currentPlayTime = 0.0 - conductor.currentTime = 0.0 - } - playLabel = "Playing: " + conductor.fileURL[conductor.currentFileIndex] - .deletingPathExtension().lastPathComponent - } } } From 031f702cf320b258a294614afd2da2553bd9c637 Mon Sep 17 00:00:00 2001 From: mahal raskin Date: Wed, 15 May 2024 19:56:17 +0200 Subject: [PATCH 3/4] unused func, wasn't used before neither --- .../AudioPlayer/AudioPlayerCompletionHandler.swift | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift index fc1a1b5..cfe107a 100644 --- a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift +++ b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift @@ -52,14 +52,6 @@ class CompletionHandlerConductor: ObservableObject, HasAudioEngine { } } - // Player functions - func loadFile(url: URL) { - do { - try player.load(url: url) - } catch { - Log(error.localizedDescription, type: .error) - } - } } struct AudioPlayerCompletionHandler: View { From a77abbd9f40d3ef50ed5884dc648ad6c666ef0e4 Mon Sep 17 00:00:00 2001 From: mahal raskin Date: Wed, 15 May 2024 19:57:09 +0200 Subject: [PATCH 4/4] linter, just syntax no semantics --- .../Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift index cfe107a..b04d05c 100644 --- a/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift +++ b/Cookbook/CookbookCommon/Sources/CookbookCommon/Recipes/AudioPlayer/AudioPlayerCompletionHandler.swift @@ -51,7 +51,7 @@ class CompletionHandlerConductor: ObservableObject, HasAudioEngine { playDuration = duration } } - + } struct AudioPlayerCompletionHandler: View {