diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index b79927f94e..993683e805 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -51,7 +51,7 @@ public final class OngoingGroupCallContext { let audioLevels = ValuePipe<[(UInt32, Float)]>() let myAudioLevel = ValuePipe() - init(queue: Queue) { + init(queue: Queue, inputDeviceId: String, outputDeviceId: String) { self.queue = queue var networkStateUpdatedImpl: ((GroupCallNetworkState) -> Void)? @@ -68,7 +68,9 @@ public final class OngoingGroupCallContext { }, myAudioLevelUpdated: { level in myAudioLevelUpdatedImpl?(level) - } + }, + inputDeviceId: inputDeviceId, + outputDeviceId: outputDeviceId ) let queue = self.queue @@ -190,6 +192,13 @@ public final class OngoingGroupCallContext { self.isMuted.set(isMuted) self.context.setIsMuted(isMuted) } + + func switchAudioInput(_ deviceId: String) { + self.context.switchAudioInput(deviceId) + } + func switchAudioOutput(_ deviceId: String) { + self.context.switchAudioOutput(deviceId) + } } private let queue = Queue() @@ -267,10 +276,10 @@ public final class OngoingGroupCallContext { } } - public init() { + public init(inputDeviceId: String = "", outputDeviceId: String = "") { let queue = self.queue self.impl = QueueLocalObject(queue: queue, generate: { - return Impl(queue: queue) + return Impl(queue: queue, inputDeviceId: inputDeviceId, outputDeviceId: outputDeviceId) }) } @@ -280,6 +289,16 @@ public final class OngoingGroupCallContext { } } + public func switchAudioInput(_ deviceId: String) { + self.impl.with { impl in + impl.switchAudioInput(deviceId) + } + } + public func switchAudioOutput(_ deviceId: String) { + self.impl.with { impl in + impl.switchAudioOutput(deviceId) + } + } public func setJoinResponse(payload: String, ssrcs: [UInt32]) { self.impl.with { impl in impl.setJoinResponse(payload: payload, ssrcs: ssrcs) diff --git a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h index 6458d4e959..7183673d66 100644 --- a/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h +++ b/submodules/TgVoipWebrtc/PublicHeaders/TgVoipWebrtc/OngoingCallThreadLocalContext.h @@ -158,7 +158,7 @@ typedef NS_ENUM(int32_t, GroupCallNetworkState) { @interface GroupCallThreadLocalContext : NSObject -- (instancetype _Nonnull)initWithQueue:(id _Nonnull)queue networkStateUpdated:(void (^ _Nonnull)(GroupCallNetworkState))networkStateUpdated audioLevelsUpdated:(void (^ _Nonnull)(NSArray * _Nonnull))audioLevelsUpdated myAudioLevelUpdated:(void (^ _Nonnull)(float))myAudioLevelUpdated; +- (instancetype _Nonnull)initWithQueue:(id _Nonnull)queue networkStateUpdated:(void (^ _Nonnull)(GroupCallNetworkState))networkStateUpdated audioLevelsUpdated:(void (^ _Nonnull)(NSArray * _Nonnull))audioLevelsUpdated myAudioLevelUpdated:(void (^ _Nonnull)(float))myAudioLevelUpdated inputDeviceId:(NSString * _Nonnull)inputDeviceId outputDeviceId:(NSString * _Nonnull)outputDeviceId; - (void)stop; @@ -167,6 +167,9 @@ typedef NS_ENUM(int32_t, GroupCallNetworkState) { - (void)setSsrcs:(NSArray * _Nonnull)ssrcs; - (void)setIsMuted:(bool)isMuted; +- (void)switchAudioOutput:(NSString * _Nonnull)deviceId; +- (void)switchAudioInput:(NSString * _Nonnull)deviceId; + @end #endif diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index dd13ce8241..5d0c2c69fd 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -808,7 +808,7 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; @implementation GroupCallThreadLocalContext -- (instancetype _Nonnull)initWithQueue:(id _Nonnull)queue networkStateUpdated:(void (^ _Nonnull)(GroupCallNetworkState))networkStateUpdated audioLevelsUpdated:(void (^ _Nonnull)(NSArray * _Nonnull))audioLevelsUpdated myAudioLevelUpdated:(void (^ _Nonnull)(float))myAudioLevelUpdated { +- (instancetype _Nonnull)initWithQueue:(id _Nonnull)queue networkStateUpdated:(void (^ _Nonnull)(GroupCallNetworkState))networkStateUpdated audioLevelsUpdated:(void (^ _Nonnull)(NSArray * _Nonnull))audioLevelsUpdated myAudioLevelUpdated:(void (^ _Nonnull)(float))myAudioLevelUpdated inputDeviceId:(NSString * _Nonnull)inputDeviceId outputDeviceId:(NSString * _Nonnull)outputDeviceId { self = [super init]; if (self != nil) { _queue = queue; @@ -836,7 +836,9 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; }, .myAudioLevelUpdated = [myAudioLevelUpdated](float level) { myAudioLevelUpdated(level); - } + }, + .initialInputDeviceId = inputDeviceId.UTF8String, + .initialOutputDeviceId = outputDeviceId.UTF8String })); } return self; @@ -1043,5 +1045,16 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; } } +- (void)switchAudioOutput:(NSString * _Nonnull)deviceId { + if (_instance) { + _instance->setAudioOutputDevice(deviceId.UTF8String); + } +} +- (void)switchAudioInput:(NSString * _Nonnull)deviceId { + if (_instance) { + _instance->setAudioInputDevice(deviceId.UTF8String); + } +} + @end