Revert "#4094 - Reintroduced serial attachment loading processing queue and fixed completionCallback storage so they take the requestedNumberOfSamples into account."

This reverts commit 9a2b60239c671322b99abc786b251e970aebebe8.
This commit is contained in:
Stefan Ceriu
2021-07-16 13:31:38 +03:00
parent 80930c354f
commit ce336e7491
@@ -38,11 +38,6 @@ private class CompletionWrapper {
}
}
private struct CompletionCallbackKey: Hashable {
let eventIdentifier: String
let requiredNumberOfSamples: Int
}
struct VoiceMessageAttachmentCacheManagerLoadResult {
let eventIdentifier: String
let url: URL
@@ -54,15 +49,13 @@ class VoiceMessageAttachmentCacheManager {
static let sharedManager = VoiceMessageAttachmentCacheManager()
private var completionCallbacks = [CompletionCallbackKey: [CompletionWrapper]]()
private var completionCallbacks = [String: [CompletionWrapper]]()
private var samples = [String: [Int: [Float]]]()
private var durations = [String: TimeInterval]()
private var finalURLs = [String: URL]()
private let workQueue: DispatchQueue
private init() {
workQueue = DispatchQueue(label: "io.element.VoiceMessageAttachmentCacheManager.queue", qos: .userInitiated)
}
func loadAttachment(_ attachment: MXKAttachment, numberOfSamples: Int, completion: @escaping (Result<VoiceMessageAttachmentCacheManagerLoadResult, Error>) -> Void) {
@@ -81,36 +74,30 @@ class VoiceMessageAttachmentCacheManager {
return
}
workQueue.async {
// Run this in the work queue to preserve order
if let finalURL = self.finalURLs[identifier], let duration = self.durations[identifier], let samples = self.samples[identifier]?[numberOfSamples] {
let result = VoiceMessageAttachmentCacheManagerLoadResult(eventIdentifier: identifier, url: finalURL, duration: duration, samples: samples)
DispatchQueue.main.async {
completion(Result.success(result))
}
return
}
self.enqueueLoadAttachment(attachment, identifier: identifier, numberOfSamples: numberOfSamples, completion: completion)
if let finalURL = finalURLs[identifier], let duration = durations[identifier], let samples = samples[identifier]?[numberOfSamples] {
let result = VoiceMessageAttachmentCacheManagerLoadResult(eventIdentifier: identifier, url: finalURL, duration: duration, samples: samples)
completion(Result.success(result))
return
}
self.enqueueLoadAttachment(attachment, identifier: identifier, numberOfSamples: numberOfSamples, completion: completion)
}
private func enqueueLoadAttachment(_ attachment: MXKAttachment, identifier: String, numberOfSamples: Int, completion: @escaping (Result<VoiceMessageAttachmentCacheManagerLoadResult, Error>) -> Void) {
let callbackKey = CompletionCallbackKey(eventIdentifier: identifier, requiredNumberOfSamples: numberOfSamples)
if var callbacks = completionCallbacks[callbackKey] {
if var callbacks = completionCallbacks[identifier] {
callbacks.append(CompletionWrapper(completion))
completionCallbacks[callbackKey] = callbacks
completionCallbacks[identifier] = callbacks
return
} else {
completionCallbacks[callbackKey] = [CompletionWrapper(completion)]
completionCallbacks[identifier] = [CompletionWrapper(completion)]
}
func sampleFileAtURL(_ url: URL, duration: TimeInterval) {
let analyser = WaveformAnalyzer(audioAssetURL: url)
analyser?.samples(count: numberOfSamples, completionHandler: { samples in
// Dispatch back from the WaveformAnalyzer's internal queue
self.workQueue.async {
DispatchQueue.main.async {
guard let samples = samples else {
self.invokeFailureCallbacksForIdentifier(identifier, error: VoiceMessageAttachmentCacheManagerError.samplingError)
return
@@ -189,9 +176,7 @@ class VoiceMessageAttachmentCacheManager {
}
private func invokeSuccessCallbacksForIdentifier(_ identifier: String, url: URL, duration: TimeInterval, samples: [Float]) {
let callbackKey = CompletionCallbackKey(eventIdentifier: identifier, requiredNumberOfSamples: samples.count)
guard let callbacks = completionCallbacks[callbackKey] else {
guard let callbacks = completionCallbacks[identifier] else {
return
}
@@ -204,13 +189,11 @@ class VoiceMessageAttachmentCacheManager {
}
}
self.completionCallbacks[callbackKey] = nil
self.completionCallbacks[identifier] = nil
}
private func invokeFailureCallbacksForIdentifier(_ identifier: String, error: Error) {
let callbackKey = CompletionCallbackKey(eventIdentifier: identifier, requiredNumberOfSamples: samples.count)
guard let callbacks = completionCallbacks[callbackKey] else {
guard let callbacks = completionCallbacks[identifier] else {
return
}
@@ -221,6 +204,6 @@ class VoiceMessageAttachmentCacheManager {
}
}
self.completionCallbacks[callbackKey] = nil
self.completionCallbacks[identifier] = nil
}
}