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 @@
-
+
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.'