diff --git a/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastAggregator.swift b/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastAggregator.swift index d00914bca..20884c9cf 100644 --- a/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastAggregator.swift +++ b/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastAggregator.swift @@ -25,6 +25,7 @@ public protocol VoiceBroadcastAggregatorDelegate: AnyObject { func voiceBroadcastAggregatorDidStartLoading(_ aggregator: VoiceBroadcastAggregator) func voiceBroadcastAggregatorDidEndLoading(_ aggregator: VoiceBroadcastAggregator) func voiceBroadcastAggregator(_ aggregator: VoiceBroadcastAggregator, didFailWithError: Error) + func voiceBroadcastAggregator(_ aggregator: VoiceBroadcastAggregator, didReceiveChunk: VoiceBroadcastChunk) func voiceBroadcastAggregatorDidUpdateData(_ aggregator: VoiceBroadcastAggregator) } @@ -109,8 +110,6 @@ public class VoiceBroadcastAggregator { return } - MXLog.debug("[VoiceBroadcastAggregator] Start aggregation for broadcast \(self.voiceBroadcastStartEventId)") - self.events.removeAll() self.events.append(contentsOf: response.chunk) @@ -125,6 +124,10 @@ public class VoiceBroadcastAggregator { return } + if let chunk = self.voiceBroadcastBuilder.buildChunk(event: event, mediaManager: self.session.mediaManager, voiceBroadcastStartEventId: self.voiceBroadcastStartEventId) { + self.delegate?.voiceBroadcastAggregator(self, didReceiveChunk: chunk) + } + self.events.append(event) MXLog.debug("[VoiceBroadcastAggregator] Got a new chunk for broadcast \(relatedEventId). Total: \(self.events.count)") @@ -135,12 +138,22 @@ public class VoiceBroadcastAggregator { currentUserIdentifier: self.session.myUserId) } as Any + + self.events.forEach { event in + guard let chunk = self.voiceBroadcastBuilder.buildChunk(event: event, mediaManager: self.session.mediaManager, voiceBroadcastStartEventId: self.voiceBroadcastStartEventId) else { + return + } + self.delegate?.voiceBroadcastAggregator(self, didReceiveChunk: chunk) + } + self.voiceBroadcast = self.voiceBroadcastBuilder.build(mediaManager: self.session.mediaManager, voiceBroadcastStartEventId: self.voiceBroadcastStartEventId, voiceBroadcastInvoiceBroadcastStartEventContent: self.voiceBroadcastInfoStartEventContent, events: self.events, currentUserIdentifier: self.session.myUserId) + MXLog.debug("[VoiceBroadcastAggregator] Start aggregation with \(self.voiceBroadcast.chunks.count) chunks for broadcast \(self.voiceBroadcastStartEventId)") + self.delegate?.voiceBroadcastAggregatorDidEndLoading(self) } failure: { [weak self] error in diff --git a/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastBuilder.swift b/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastBuilder.swift index d81e538c7..e27f5258a 100644 --- a/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastBuilder.swift +++ b/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastBuilder.swift @@ -28,15 +28,19 @@ struct VoiceBroadcastBuilder { var voiceBroadcast = VoiceBroadcast() voiceBroadcast.chunks = Set(events.compactMap { event in - guard let attachment = MXKAttachment(event: event, andMediaManager: mediaManager), - let chunkInfo = event.content[VoiceBroadcastSettings.voiceBroadcastContentKeyChunkType] as? [String: UInt], - let sequence = chunkInfo[VoiceBroadcastSettings.voiceBroadcastContentKeyChunkSequence] else { - return nil - } - - return VoiceBroadcastChunk(voiceBroadcastInfoEventId: voiceBroadcastStartEventId, sequence: sequence, attachment: attachment) + buildChunk(event: event, mediaManager: mediaManager, voiceBroadcastStartEventId: voiceBroadcastStartEventId) }) return voiceBroadcast } + + func buildChunk(event: MXEvent, mediaManager: MXMediaManager, voiceBroadcastStartEventId: String) -> VoiceBroadcastChunk? { + guard let attachment = MXKAttachment(event: event, andMediaManager: mediaManager), + let chunkInfo = event.content[VoiceBroadcastSettings.voiceBroadcastContentKeyChunkType] as? [String: UInt], + let sequence = chunkInfo[VoiceBroadcastSettings.voiceBroadcastContentKeyChunkSequence] else { + return nil + } + + return VoiceBroadcastChunk(voiceBroadcastInfoEventId: voiceBroadcastStartEventId, sequence: sequence, attachment: attachment) + } } diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/VoiceBroadcastPlaybackViewModel.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/VoiceBroadcastPlaybackViewModel.swift index 5580b21d1..76cea5e41 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/VoiceBroadcastPlaybackViewModel.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/VoiceBroadcastPlaybackViewModel.swift @@ -65,9 +65,6 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType, Voic private func play() { MXLog.debug("[VoiceBroadcastPlaybackViewModel] play") - // TODO: But what? - let requiredNumberOfSamples = 100// playbackView.getRequiredNumberOfSamples() ? - guard let voiceBroadcast = voiceBroadcastAggregator.voiceBroadcast else { assert(false, "Cannot play. No voice broadcast data") } @@ -77,7 +74,8 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType, Voic return } - cacheManager.loadAttachment(attachment, numberOfSamples: requiredNumberOfSamples) { [weak self] result in + // numberOfSamples is for the equalizer view we do not support yet + cacheManager.loadAttachment(attachment, numberOfSamples: 1) { [weak self] result in guard let self = self else { return @@ -137,6 +135,10 @@ extension VoiceBroadcastPlaybackViewModel: VoiceBroadcastAggregatorDelegate { MXLog.debug("AAAA voiceBroadcastAggregatordidFailWithError") } + func voiceBroadcastAggregator(_ aggregator: VoiceBroadcastAggregator, didReceiveChunk: VoiceBroadcastChunk) { + MXLog.debug("AAAA voiceBroadcastAggregatorDidReceiveChunk") + } + func voiceBroadcastAggregatorDidUpdateData(_ aggregator: VoiceBroadcastAggregator) { MXLog.debug("AAAA voiceBroadcastAggregatorDidUpdateData") }