From ed9aa72af4a9640c12705cc8aaf59bd6278e987f Mon Sep 17 00:00:00 2001 From: Stream Bot Date: Wed, 10 Dec 2025 15:13:48 +0000 Subject: [PATCH 1/8] Update release version to snapshot --- Sources/StreamVideo/Generated/SystemEnvironment+Version.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/StreamVideo/Generated/SystemEnvironment+Version.swift b/Sources/StreamVideo/Generated/SystemEnvironment+Version.swift index c6fdce4bc..97270c51a 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.39.0-SNAPSHOT" /// The WebRTC version. public static let webRTCVersion: String = "137.0.54" } From dd7de08e6347777cfcab99a3d27a145f2fb8b5f7 Mon Sep 17 00:00:00 2001 From: Ilias Pavlidakis Date: Thu, 11 Dec 2025 11:53:38 +0200 Subject: [PATCH 2/8] [Enhancement]Allow calls to skip Recents (#1008) --- .../06-advanced/03-callkit-integration.swift | 5 ++++ .../StreamVideo/CallKit/CallKitAdapter.swift | 6 ++++ .../StreamVideo/CallKit/CallKitService.swift | 3 ++ .../CallKit/CallKitServiceTests.swift | 29 +++++++++++++++++++ 4 files changed, 43 insertions(+) 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/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/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 From 98eca26d7e667b05270e7ec7a9f9f3579162771e Mon Sep 17 00:00:00 2001 From: Ilias Pavlidakis Date: Thu, 11 Dec 2025 11:55:48 +0200 Subject: [PATCH 3/8] Update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b77e290c4..f7ddeee67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). # Upcoming -### 🔄 Changed +### ✅ Added +- Configuration in `CallKitAdapter` to skip calls from showing in the `Recents` app. [#1008](https://github.com/GetStream/stream-video-swift/pull/1008) # [1.38.0](https://github.com/GetStream/stream-video-swift/releases/tag/1.38.0) _December 09, 2025_ From 64588e9e748e18a9f94312f5fda55e1ee37251e3 Mon Sep 17 00:00:00 2001 From: Ilias Pavlidakis Date: Fri, 12 Dec 2025 12:35:18 +0200 Subject: [PATCH 4/8] [Fix]Increase Swift Version requirement for unavailable APIs --- .../RTCAudioStore/Components/AVAudioSessionObserver.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 From 427a2fcf8ea261c78a183d6d3fb8a3437841bb27 Mon Sep 17 00:00:00 2001 From: Ilias Pavlidakis Date: Mon, 15 Dec 2025 11:42:58 +0200 Subject: [PATCH 5/8] [Fix]VoiceProcessing being wrongly bypassed (#1009) --- .../AudioDeviceModule/AudioDeviceModule.swift | 3 +-- .../AudioCustomProcessingModule.swift | 21 +++++++++++++++++++ ...rocessingStore+AudioFilterMiddleware.swift | 18 +++++----------- .../AudioDeviceModule_Tests.swift | 4 +++- 4 files changed, 30 insertions(+), 16 deletions(-) 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..3cec643e9 100644 --- a/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift +++ b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift @@ -13,8 +13,6 @@ extension AudioProcessingStore.Namespace { final class AudioFilterMiddleware: Middleware, @unchecked Sendable { - private var cancellable: AnyCancellable? - override func apply( state: AudioProcessingStore.Namespace.StoreState, action: AudioProcessingStore.Namespace.StoreAction, @@ -58,22 +56,16 @@ 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 + log.debug("AudioFilter:\(audioFilter.id) will receive captured audioBuffer:\($0).") + self?.process($0, on: audioFilter) + } } private func process( 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]) From 91dfe2fa9b927059ebf20431247f63e14074f990 Mon Sep 17 00:00:00 2001 From: Ilias Pavlidakis Date: Mon, 15 Dec 2025 16:25:41 +0200 Subject: [PATCH 6/8] [Fix]Reapply audioFilter when route changes (#1010) --- ...rocessingStore+AudioFilterMiddleware.swift | 59 +++++++++++++++---- .../AudioFilterMiddleware_Tests.swift | 16 +++-- 2 files changed, 58 insertions(+), 17 deletions(-) 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 3cec643e9..5640691e1 100644 --- a/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift +++ b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift @@ -13,6 +13,22 @@ extension AudioProcessingStore.Namespace { final class AudioFilterMiddleware: Middleware, @unchecked Sendable { + @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, action: AudioProcessingStore.Namespace.StoreAction, @@ -30,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() @@ -63,7 +82,10 @@ extension AudioProcessingStore.Namespace { } capturePostProcessingDelegate.processingHandler = { [weak self] in - log.debug("AudioFilter:\(audioFilter.id) will receive captured audioBuffer:\($0).") + log + .debug( + "AudioFilter:\(audioFilter.id) will receive captured audioBuffer with channels:\($0.channels) frames:\($0.frames)." + ) self?.process($0, on: audioFilter) } } @@ -75,5 +97,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/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 + } } } From c5b45177a3f6e08018c3576912b2d0ff8db9ecaf Mon Sep 17 00:00:00 2001 From: Stream Bot Date: Mon, 15 Dec 2025 14:51:00 +0000 Subject: [PATCH 7/8] Bump 1.38.1 --- CHANGELOG.md | 5 +++++ README.md | 2 +- .../StreamVideo/Generated/SystemEnvironment+Version.swift | 2 +- Sources/StreamVideo/Info.plist | 2 +- Sources/StreamVideoSwiftUI/Info.plist | 2 +- Sources/StreamVideoUIKit/Info.plist | 2 +- StreamVideo-XCFramework.podspec | 2 +- StreamVideo.podspec | 2 +- StreamVideoArtifacts.json | 2 +- StreamVideoSwiftUI-XCFramework.podspec | 2 +- StreamVideoSwiftUI.podspec | 2 +- StreamVideoUIKit-XCFramework.podspec | 2 +- StreamVideoUIKit.podspec | 2 +- 13 files changed, 17 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7ddeee67..f0658cc26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). # Upcoming +### 🔄 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) 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/Generated/SystemEnvironment+Version.swift b/Sources/StreamVideo/Generated/SystemEnvironment+Version.swift index 97270c51a..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.39.0-SNAPSHOT" + 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/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/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.' From 85dc4f21b77230ff1cc50f6166b0c071ee118ea1 Mon Sep 17 00:00:00 2001 From: Ilias Pavlidakis Date: Mon, 15 Dec 2025 18:02:52 +0200 Subject: [PATCH 8/8] [Hygiene]Update Changelog + Remove noisy logging --- CHANGELOG.md | 3 +++ .../AudioProcessingStore+AudioFilterMiddleware.swift | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0658cc26..8dfb24eff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ _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/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift index 5640691e1..811b76c07 100644 --- a/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift +++ b/Sources/StreamVideo/Utils/AudioSession/AudioProcessing/Namespace/Middleware/AudioProcessingStore+AudioFilterMiddleware.swift @@ -82,10 +82,6 @@ extension AudioProcessingStore.Namespace { } capturePostProcessingDelegate.processingHandler = { [weak self] in - log - .debug( - "AudioFilter:\(audioFilter.id) will receive captured audioBuffer with channels:\($0.channels) frames:\($0.frames)." - ) self?.process($0, on: audioFilter) } }