diff --git a/CHANGELOG.md b/CHANGELOG.md index b77e290c4..8dfb24eff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### 🔄 Changed +# [1.38.1](https://github.com/GetStream/stream-video-swift/releases/tag/1.38.1) +_December 15, 2025_ + +### ✅ Added +- Configuration in `CallKitAdapter` to skip calls from showing in the `Recents` app. [#1008](https://github.com/GetStream/stream-video-swift/pull/1008) + +### 🐞 Fixed +- An issue causing the local participant waveform to activate while the local participant wasn't speaking. [#1009](https://github.com/GetStream/stream-video-swift/pull/1009) + # [1.38.0](https://github.com/GetStream/stream-video-swift/releases/tag/1.38.0) _December 09, 2025_ diff --git a/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift b/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift index df3080a39..a300b942f 100644 --- a/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift +++ b/DocumentationTests/DocumentationTests/DocumentationTests/06-advanced/03-callkit-integration.swift @@ -153,6 +153,11 @@ private func content() { callKitAdapter.availabilityPolicy = .custom(MyCustomAvailabilityPolicy()) } + container { + @Injected(\.callKitAdapter) var callKitAdapter + callKitAdapter.includesCallsInRecents = false + } + container { class IntentHandler: INExtension, INStartCallIntentHandling { override func handler(for intent: INIntent) -> Any { diff --git a/README.md b/README.md index 401094e96..9b377f710 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@

- StreamVideo + StreamVideo StreamVideoSwiftUI StreamVideoUIKit StreamWebRTC diff --git a/Sources/StreamVideo/CallKit/CallKitAdapter.swift b/Sources/StreamVideo/CallKit/CallKitAdapter.swift index 29a27f4b7..39d5a4f6a 100644 --- a/Sources/StreamVideo/CallKit/CallKitAdapter.swift +++ b/Sources/StreamVideo/CallKit/CallKitAdapter.swift @@ -27,6 +27,12 @@ open class CallKitAdapter { set { callKitService.ringtoneSound = newValue } } + /// Configure whether calls should appear in the Recents app. + open var includesCallsInRecents: Bool { + get { callKitService.includesCallsInRecents } + set { callKitService.includesCallsInRecents = newValue } + } + /// The callSettings to use when joining a call (after accepting it on CallKit) /// default: nil open var callSettings: CallSettings? { diff --git a/Sources/StreamVideo/CallKit/CallKitService.swift b/Sources/StreamVideo/CallKit/CallKitService.swift index 182d55a13..20bb366c9 100644 --- a/Sources/StreamVideo/CallKit/CallKitService.swift +++ b/Sources/StreamVideo/CallKit/CallKitService.swift @@ -83,6 +83,8 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable { /// Whether video is supported. If true, CallKit push titles add "Video"; /// otherwise "Audio". Default is `false`. open var supportsVideo: Bool = false + /// Whether calls received will be showing in Recents app. + open var includesCallsInRecents: Bool = true /// Policy for handling calls when mic permission is missing while the app /// runs in the background. See `CallKitMissingPermissionPolicy`. @@ -692,6 +694,7 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable { configuration.supportedHandleTypes = supportedHandleTypes configuration.iconTemplateImageData = iconTemplateImageData configuration.ringtoneSound = ringtoneSound + configuration.includesCallsInRecents = includesCallsInRecents if supportsHolding { // Holding a call isn't supported yet. diff --git a/Sources/StreamVideo/Generated/SystemEnvironment+Version.swift b/Sources/StreamVideo/Generated/SystemEnvironment+Version.swift index c6fdce4bc..3f977d45e 100644 --- a/Sources/StreamVideo/Generated/SystemEnvironment+Version.swift +++ b/Sources/StreamVideo/Generated/SystemEnvironment+Version.swift @@ -7,7 +7,7 @@ import Foundation extension SystemEnvironment { /// A Stream Video version. - public static let version: String = "1.38.0" + public static let version: String = "1.38.1" /// The WebRTC version. public static let webRTCVersion: String = "137.0.54" } diff --git a/Sources/StreamVideo/Info.plist b/Sources/StreamVideo/Info.plist index 372fc32a9..a8ea0f1ec 100644 --- a/Sources/StreamVideo/Info.plist +++ b/Sources/StreamVideo/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.38.0 + 1.38.1 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright diff --git a/Sources/StreamVideo/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule.swift b/Sources/StreamVideo/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule.swift index 5b723122d..a7aa4911d 100644 --- a/Sources/StreamVideo/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule.swift +++ b/Sources/StreamVideo/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule.swift @@ -216,8 +216,6 @@ final class AudioDeviceModule: NSObject, RTCAudioDeviceModuleDelegate, Encodable audioLevelsAdapter.subject = audioLevelSubject source.observer = self - - source.isVoiceProcessingBypassed = true } // MARK: - Recording @@ -242,6 +240,7 @@ final class AudioDeviceModule: NSObject, RTCAudioDeviceModuleDelegate, Encodable /// sendAudio capability. _ = source.setRecordingAlwaysPreparedMode(false) source.prefersStereoPlayout = isPreferred + source.isVoiceProcessingBypassed = isPreferred } /// Starts or stops speaker playout on the ADM, retrying transient failures. diff --git a/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Components/AudioCustomProcessingModule.swift b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Components/AudioCustomProcessingModule.swift index 3778bad99..6c175c82d 100644 --- a/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Components/AudioCustomProcessingModule.swift +++ b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Components/AudioCustomProcessingModule.swift @@ -8,6 +8,15 @@ import StreamWebRTC /// Bridges `RTCAudioCustomProcessingDelegate` callbacks into a Combine stream. /// +/// The delegate must stay extremely light-weight because WebRTC calls it while +/// holding an internal lock; any expensive work risks exceeding the ~10 ms +/// cadence and the native adapter will start skipping frames entirely. By +/// immediately forwarding each callback into a Combine publisher we decouple +/// the real-time audio path from the rest of the SDK: reducers, middleware, and +/// filters can subscribe (and hop to their own schedulers if needed) without +/// lengthening the time spent inside the delegate. This keeps capture responsive +/// while still letting higher layers observe every event and apply effects. +/// /// The module publishes structured events that middleware can observe to update /// audio processing configuration and feed buffers into active filters. @@ -27,6 +36,9 @@ final class AudioCustomProcessingModule: NSObject, RTCAudioCustomProcessingDeleg /// Event stream used by store middleware to react to audio callbacks. var publisher: AnyPublisher { subject.eraseToAnyPublisher() } + /// Direct callback used for in-place filtering; must return within ~10 ms. + var processingHandler: ((RTCAudioBuffer) -> Void)? + /// RTCAudioCustomProcessingDelegate func audioProcessingInitialize( sampleRate sampleRateHz: Int, @@ -42,6 +54,15 @@ final class AudioCustomProcessingModule: NSObject, RTCAudioCustomProcessingDeleg /// RTCAudioCustomProcessingDelegate func audioProcessingProcess(audioBuffer: RTCAudioBuffer) { + // Synchronous filtering happens via `processingHandler` so we can finish + // within WebRTC's ~10 ms processing budget; the native adapter wraps this + // delegate in a trylock and simply drops the frame if we block. Running + // Combine here would introduce scheduling/queue hops that blow the budget. + processingHandler?(audioBuffer) + + // Downstream observers only need metadata (channel count, logs, etc.), so + // we enqueue the Combine event after the synchronous work; this publish is + // fire-and-forget and keeps the hot path lock-free. subject.send(.audioProcessingProcess(audioBuffer)) } diff --git a/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift index 0ed6a3785..811b76c07 100644 --- a/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift +++ b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift @@ -13,7 +13,21 @@ extension AudioProcessingStore.Namespace { final class AudioFilterMiddleware: Middleware, @unchecked Sendable { - private var cancellable: AnyCancellable? + @Injected(\.audioStore) private var audioStore + + private let processingQueue = OperationQueue(maxConcurrentOperationCount: 1) + private var currentRouteCancellable: AnyCancellable? + + override init() { + super.init() + /// For some reason AudioFilters stop working after the audioOutput changes a couple of + /// times. Here we reapply the existing filter if any to ensure correct configuration + currentRouteCancellable = audioStore + .publisher(\.currentRoute) + .removeDuplicates() + .receive(on: processingQueue) + .sink { [weak self] _ in self?.reApplyFilterAfterRouteChange() } + } override func apply( state: AudioProcessingStore.Namespace.StoreState, @@ -32,18 +46,21 @@ extension AudioProcessingStore.Namespace { ) } case let .setAudioFilter(audioFilter): - state.audioFilter?.release() - // Late filter selection: initialize if we already know format. - if state.initializedSampleRate > 0, state.initializedChannels > 0 { - audioFilter?.initialize( - sampleRate: state.initializedSampleRate, - channels: state.initializedChannels + processingQueue.addOperation { [weak self] in + guard let self else { return } + state.audioFilter?.release() + // Late filter selection: initialize if we already know format. + if state.initializedSampleRate > 0, state.initializedChannels > 0 { + audioFilter?.initialize( + sampleRate: state.initializedSampleRate, + channels: state.initializedChannels + ) + } + didUpdate( + audioFilter, + capturePostProcessingDelegate: state.capturePostProcessingDelegate ) } - didUpdate( - audioFilter, - capturePostProcessingDelegate: state.capturePostProcessingDelegate - ) case .release: state.audioFilter?.release() @@ -58,22 +75,15 @@ extension AudioProcessingStore.Namespace { _ audioFilter: AudioFilter?, capturePostProcessingDelegate: AudioCustomProcessingModule ) { - cancellable?.cancel() - cancellable = nil + capturePostProcessingDelegate.processingHandler = nil guard let audioFilter else { return } - cancellable = capturePostProcessingDelegate - .publisher - .compactMap { - guard case let .audioProcessingProcess(buffer) = $0 else { - return nil - } - return buffer - } - .sink { [weak self, audioFilter] in self?.process($0, on: audioFilter) } + capturePostProcessingDelegate.processingHandler = { [weak self] in + self?.process($0, on: audioFilter) + } } private func process( @@ -83,5 +93,20 @@ extension AudioProcessingStore.Namespace { var audioBuffer = audioBuffer audioFilter.applyEffect(to: &audioBuffer) } + + private func reApplyFilterAfterRouteChange() { + processingQueue.addOperation { [weak self] in + guard + let self, + let audioFilter = state?.audioFilter, + let capturePostProcessingDelegate = state?.capturePostProcessingDelegate + else { + return + } + + didUpdate(nil, capturePostProcessingDelegate: capturePostProcessingDelegate) + didUpdate(audioFilter, capturePostProcessingDelegate: capturePostProcessingDelegate) + } + } } } diff --git a/Sources/StreamVideo/Utils/AudioSession/RTCAudioStore/Components/AVAudioSessionObserver.swift b/Sources/StreamVideo/Utils/AudioSession/RTCAudioStore/Components/AVAudioSessionObserver.swift index 66d62fea6..9ebb70625 100644 --- a/Sources/StreamVideo/Utils/AudioSession/RTCAudioStore/Components/AVAudioSessionObserver.swift +++ b/Sources/StreamVideo/Utils/AudioSession/RTCAudioStore/Components/AVAudioSessionObserver.swift @@ -62,21 +62,21 @@ extension AVAudioSession { self.renderingMode = "" #endif - #if compiler(>=6.0) + #if compiler(>=6.1) if #available(iOS 18.2, *) { self.prefersEchoCancelledInput = source.prefersEchoCancelledInput } else { self.prefersEchoCancelledInput = false } #else self.prefersEchoCancelledInput = false #endif - #if compiler(>=6.0) + #if compiler(>=6.1) if #available(iOS 18.2, *) { self.isEchoCancelledInputEnabled = source.isEchoCancelledInputEnabled } else { self.isEchoCancelledInputEnabled = false } #else self.isEchoCancelledInputEnabled = false #endif - #if compiler(>=6.0) + #if compiler(>=6.1) if #available(iOS 18.2, *) { self.isEchoCancelledInputAvailable = source.isEchoCancelledInputAvailable } else { self.isEchoCancelledInputAvailable = false } #else diff --git a/Sources/StreamVideoSwiftUI/Info.plist b/Sources/StreamVideoSwiftUI/Info.plist index 372fc32a9..a8ea0f1ec 100644 --- a/Sources/StreamVideoSwiftUI/Info.plist +++ b/Sources/StreamVideoSwiftUI/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.38.0 + 1.38.1 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright diff --git a/Sources/StreamVideoUIKit/Info.plist b/Sources/StreamVideoUIKit/Info.plist index 372fc32a9..a8ea0f1ec 100644 --- a/Sources/StreamVideoUIKit/Info.plist +++ b/Sources/StreamVideoUIKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.38.0 + 1.38.1 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright diff --git a/StreamVideo-XCFramework.podspec b/StreamVideo-XCFramework.podspec index 2c0cf8861..1cf921a83 100644 --- a/StreamVideo-XCFramework.podspec +++ b/StreamVideo-XCFramework.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamVideo-XCFramework' - spec.version = '1.38.0' + spec.version = '1.38.1' spec.summary = 'StreamVideo iOS Video Client' spec.description = 'StreamVideo is the official Swift client for Stream Video, a service for building video applications.' diff --git a/StreamVideo.podspec b/StreamVideo.podspec index 60a14ef16..6a06b391d 100644 --- a/StreamVideo.podspec +++ b/StreamVideo.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamVideo' - spec.version = '1.38.0' + spec.version = '1.38.1' spec.summary = 'StreamVideo iOS Video Client' spec.description = 'StreamVideo is the official Swift client for Stream Video, a service for building video applications.' diff --git a/StreamVideoArtifacts.json b/StreamVideoArtifacts.json index abd3b4406..b9a9558da 100644 --- a/StreamVideoArtifacts.json +++ b/StreamVideoArtifacts.json @@ -1 +1 @@ -{"0.4.2":"https://github.com/GetStream/stream-video-swift/releases/download/0.4.2/StreamVideo-All.zip","0.5.0":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.0/StreamVideo-All.zip","0.5.1":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.1/StreamVideo-All.zip","0.5.2":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.2/StreamVideo-All.zip","0.5.3":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.3/StreamVideo-All.zip","1.0.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.0/StreamVideo-All.zip","1.0.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.1/StreamVideo-All.zip","1.0.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.2/StreamVideo-All.zip","1.0.3":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.3/StreamVideo-All.zip","1.0.4":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.4/StreamVideo-All.zip","1.0.5":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.5/StreamVideo-All.zip","1.0.6":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.6/StreamVideo-All.zip","1.0.7":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.7/StreamVideo-All.zip","1.0.8":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.8/StreamVideo-All.zip","1.0.9":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.9/StreamVideo-All.zip","1.10.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.10.0/StreamVideo-All.zip","1.11.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.11.0/StreamVideo-All.zip","1.12.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.12.0/StreamVideo-All.zip","1.13.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.13.0/StreamVideo-All.zip","1.14.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.14.0/StreamVideo-All.zip","1.14.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.14.1/StreamVideo-All.zip","1.15.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.15.0/StreamVideo-All.zip","1.16.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.16.0/StreamVideo-All.zip","1.17.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.17.0/StreamVideo-All.zip","1.18.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.18.0/StreamVideo-All.zip","1.19.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.19.0/StreamVideo-All.zip","1.19.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.19.1/StreamVideo-All.zip","1.19.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.19.2/StreamVideo-All.zip","1.20.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.20.0/StreamVideo-All.zip","1.21.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.21.0/StreamVideo-All.zip","1.21.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.21.1/StreamVideo-All.zip","1.22.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.22.0/StreamVideo-All.zip","1.22.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.22.1/StreamVideo-All.zip","1.22.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.22.2/StreamVideo-All.zip","1.24.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.24.0/StreamVideo-All.zip","1.25.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.25.0/StreamVideo-All.zip","1.26.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.26.0/StreamVideo-All.zip","1.27.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.27.0/StreamVideo-All.zip","1.27.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.27.1/StreamVideo-All.zip","1.27.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.27.2/StreamVideo-All.zip","1.28.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.28.0/StreamVideo-All.zip","1.28.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.28.1/StreamVideo-All.zip","1.29.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.29.0/StreamVideo-All.zip","1.29.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.29.1/StreamVideo-All.zip","1.30.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.30.0/StreamVideo-All.zip","1.31.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.31.0/StreamVideo-All.zip","1.32.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.32.0/StreamVideo-All.zip","1.33.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.33.0/StreamVideo-All.zip","1.34.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.34.0/StreamVideo-All.zip","1.34.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.34.1/StreamVideo-All.zip","1.34.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.34.2/StreamVideo-All.zip","1.35.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.35.0/StreamVideo-All.zip","1.36.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.36.0/StreamVideo-All.zip","1.37.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.37.0/StreamVideo-All.zip","1.38.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.38.0/StreamVideo-All.zip"} \ No newline at end of file +{"0.4.2":"https://github.com/GetStream/stream-video-swift/releases/download/0.4.2/StreamVideo-All.zip","0.5.0":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.0/StreamVideo-All.zip","0.5.1":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.1/StreamVideo-All.zip","0.5.2":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.2/StreamVideo-All.zip","0.5.3":"https://github.com/GetStream/stream-video-swift/releases/download/0.5.3/StreamVideo-All.zip","1.0.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.0/StreamVideo-All.zip","1.0.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.1/StreamVideo-All.zip","1.0.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.2/StreamVideo-All.zip","1.0.3":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.3/StreamVideo-All.zip","1.0.4":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.4/StreamVideo-All.zip","1.0.5":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.5/StreamVideo-All.zip","1.0.6":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.6/StreamVideo-All.zip","1.0.7":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.7/StreamVideo-All.zip","1.0.8":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.8/StreamVideo-All.zip","1.0.9":"https://github.com/GetStream/stream-video-swift/releases/download/1.0.9/StreamVideo-All.zip","1.10.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.10.0/StreamVideo-All.zip","1.11.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.11.0/StreamVideo-All.zip","1.12.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.12.0/StreamVideo-All.zip","1.13.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.13.0/StreamVideo-All.zip","1.14.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.14.0/StreamVideo-All.zip","1.14.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.14.1/StreamVideo-All.zip","1.15.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.15.0/StreamVideo-All.zip","1.16.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.16.0/StreamVideo-All.zip","1.17.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.17.0/StreamVideo-All.zip","1.18.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.18.0/StreamVideo-All.zip","1.19.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.19.0/StreamVideo-All.zip","1.19.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.19.1/StreamVideo-All.zip","1.19.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.19.2/StreamVideo-All.zip","1.20.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.20.0/StreamVideo-All.zip","1.21.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.21.0/StreamVideo-All.zip","1.21.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.21.1/StreamVideo-All.zip","1.22.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.22.0/StreamVideo-All.zip","1.22.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.22.1/StreamVideo-All.zip","1.22.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.22.2/StreamVideo-All.zip","1.24.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.24.0/StreamVideo-All.zip","1.25.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.25.0/StreamVideo-All.zip","1.26.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.26.0/StreamVideo-All.zip","1.27.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.27.0/StreamVideo-All.zip","1.27.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.27.1/StreamVideo-All.zip","1.27.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.27.2/StreamVideo-All.zip","1.28.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.28.0/StreamVideo-All.zip","1.28.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.28.1/StreamVideo-All.zip","1.29.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.29.0/StreamVideo-All.zip","1.29.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.29.1/StreamVideo-All.zip","1.30.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.30.0/StreamVideo-All.zip","1.31.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.31.0/StreamVideo-All.zip","1.32.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.32.0/StreamVideo-All.zip","1.33.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.33.0/StreamVideo-All.zip","1.34.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.34.0/StreamVideo-All.zip","1.34.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.34.1/StreamVideo-All.zip","1.34.2":"https://github.com/GetStream/stream-video-swift/releases/download/1.34.2/StreamVideo-All.zip","1.35.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.35.0/StreamVideo-All.zip","1.36.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.36.0/StreamVideo-All.zip","1.37.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.37.0/StreamVideo-All.zip","1.38.0":"https://github.com/GetStream/stream-video-swift/releases/download/1.38.0/StreamVideo-All.zip","1.38.1":"https://github.com/GetStream/stream-video-swift/releases/download/1.38.1/StreamVideo-All.zip"} \ No newline at end of file diff --git a/StreamVideoSwiftUI-XCFramework.podspec b/StreamVideoSwiftUI-XCFramework.podspec index a9e6591f9..92596718e 100644 --- a/StreamVideoSwiftUI-XCFramework.podspec +++ b/StreamVideoSwiftUI-XCFramework.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamVideoSwiftUI-XCFramework' - spec.version = '1.38.0' + spec.version = '1.38.1' spec.summary = 'StreamVideo SwiftUI Video Components' spec.description = 'StreamVideoSwiftUI SDK offers flexible SwiftUI components able to display data provided by StreamVideo SDK.' diff --git a/StreamVideoSwiftUI.podspec b/StreamVideoSwiftUI.podspec index 5f9732a37..fe30aa732 100644 --- a/StreamVideoSwiftUI.podspec +++ b/StreamVideoSwiftUI.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamVideoSwiftUI' - spec.version = '1.38.0' + spec.version = '1.38.1' spec.summary = 'StreamVideo SwiftUI Video Components' spec.description = 'StreamVideoSwiftUI SDK offers flexible SwiftUI components able to display data provided by StreamVideo SDK.' diff --git a/StreamVideoTests/CallKit/CallKitServiceTests.swift b/StreamVideoTests/CallKit/CallKitServiceTests.swift index e8f958aa3..cf042b23e 100644 --- a/StreamVideoTests/CallKit/CallKitServiceTests.swift +++ b/StreamVideoTests/CallKit/CallKitServiceTests.swift @@ -137,6 +137,35 @@ final class CallKitServiceTests: XCTestCase, @unchecked Sendable { XCTAssertNil(subject.callProvider.configuration.iconTemplateImageData) } + @MainActor + func test_reportIncomingCall_withIncludesCallsInRecents_callUpdateWasConfiguredCorrectly() throws { + subject = .init() + + subject.reportIncomingCall( + cid, + localizedCallerName: localizedCallerName, + callerId: callerId, + hasVideo: false + ) { _ in } + + XCTAssertTrue(subject.callProvider.configuration.includesCallsInRecents) + } + + @MainActor + func test_reportIncomingCall_withoutIncludesCallsInRecents_callUpdateWasConfiguredCorrectly() throws { + subject = .init() + subject.includesCallsInRecents = false + + subject.reportIncomingCall( + cid, + localizedCallerName: localizedCallerName, + callerId: callerId, + hasVideo: false + ) { _ in } + + XCTAssertFalse(subject.callProvider.configuration.includesCallsInRecents) + } + @MainActor func test_reportIncomingCall_callProviderWasCalledWithExpectedValues() { // Given diff --git a/StreamVideoTests/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule_Tests.swift b/StreamVideoTests/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule_Tests.swift index 50af9cb17..3424afee2 100644 --- a/StreamVideoTests/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule_Tests.swift +++ b/StreamVideoTests/Utils/AudioSession/AudioDeviceModule/AudioDeviceModule_Tests.swift @@ -159,14 +159,16 @@ final class AudioDeviceModule_Tests: XCTestCase, @unchecked Sendable { // MARK: - Stereo playout - func test_setStereoPlayoutPreference_updatesMuteModeAndPreference() { + func test_setStereoPlayoutPreference_updatesMuteModePreferenceAndVPBypassed() { makeSubject() subject.setStereoPlayoutPreference(true) XCTAssertTrue(source.prefersStereoPlayout) + XCTAssertTrue(source.isVoiceProcessingBypassed) subject.setStereoPlayoutPreference(false) XCTAssertFalse(source.prefersStereoPlayout) + XCTAssertFalse(source.isVoiceProcessingBypassed) let recordedModes = source.recordedInputPayload(RTCAudioEngineMuteMode.self, for: .setMuteMode) XCTAssertEqual(recordedModes, [.inputMixer, .voiceProcessing]) diff --git a/StreamVideoTests/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioFilterMiddleware_Tests.swift b/StreamVideoTests/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioFilterMiddleware_Tests.swift index 2a2ea2bb6..7b1a80cfd 100644 --- a/StreamVideoTests/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioFilterMiddleware_Tests.swift +++ b/StreamVideoTests/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioFilterMiddleware_Tests.swift @@ -16,7 +16,7 @@ final class AudioFilterMiddleware_Tests: XCTestCase, @unchecked Sendable { super.tearDown() } - func test_setInitializedConfiguration_initializesExistingFilter() { + func test_setInitializedConfiguration_initializesExistingFilter() async { let filter = MockAudioFilter(id: "f") var state = AudioProcessingStore.Namespace.StoreState.initial state.audioFilter = filter @@ -27,11 +27,13 @@ final class AudioFilterMiddleware_Tests: XCTestCase, @unchecked Sendable { file: #file, function: #function, line: #line ) - XCTAssertEqual(filter.initializedParams?.sampleRate, 48000) - XCTAssertEqual(filter.initializedParams?.channels, 2) + await fulfillment { + filter.initializedParams?.sampleRate == 48000 + && filter.initializedParams?.channels == 2 + } } - func test_setAudioFilter_initializesWhenFormatKnown() { + func test_setAudioFilter_initializesWhenFormatKnown() async { let filter = MockAudioFilter(id: "g") var state = AudioProcessingStore.Namespace.StoreState.initial state.initializedSampleRate = 44100 @@ -43,7 +45,9 @@ final class AudioFilterMiddleware_Tests: XCTestCase, @unchecked Sendable { file: #file, function: #function, line: #line ) - XCTAssertEqual(filter.initializedParams?.sampleRate, 44100) - XCTAssertEqual(filter.initializedParams?.channels, 1) + await fulfillment { + filter.initializedParams?.sampleRate == 44100 + && filter.initializedParams?.channels == 1 + } } } diff --git a/StreamVideoUIKit-XCFramework.podspec b/StreamVideoUIKit-XCFramework.podspec index cc738ac75..a9e91f292 100644 --- a/StreamVideoUIKit-XCFramework.podspec +++ b/StreamVideoUIKit-XCFramework.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamVideoUIKit-XCFramework' - spec.version = '1.38.0' + spec.version = '1.38.1' spec.summary = 'StreamVideo UIKit Video Components' spec.description = 'StreamVideoUIKit SDK offers flexible UIKit components able to display data provided by StreamVideo SDK.' diff --git a/StreamVideoUIKit.podspec b/StreamVideoUIKit.podspec index de657d2b7..bae18b6da 100644 --- a/StreamVideoUIKit.podspec +++ b/StreamVideoUIKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamVideoUIKit' - spec.version = '1.38.0' + spec.version = '1.38.1' spec.summary = 'StreamVideo UIKit Video Components' spec.description = 'StreamVideoUIKit SDK offers flexible UIKit components able to display data provided by StreamVideo SDK.'