diff --git a/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m b/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m index fad0f7c3f..bbec1a891 100644 --- a/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m +++ b/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m @@ -227,6 +227,24 @@ @implementation WebRTCModule (RTCAudioDeviceModule) } } +#pragma mark - Audio Processing Config + +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(audioDeviceModuleGetAudioProcessingConfig) { + id module = self.audioProcessingModule; + if (![module isKindOfClass:[RTCDefaultAudioProcessingModule class]]) { + return nil; + } + RTCAudioProcessingConfig *config = ((RTCDefaultAudioProcessingModule *)module).config; + return @{ + @"echoCancellationEnabled" : @(config.isEchoCancellationEnabled), + @"echoCancellationMobileMode" : @(config.isEchoCancellationMobileMode), + @"noiseSuppressionEnabled" : @(config.isNoiseSuppressionEnabled), + @"highpassFilterEnabled" : @(config.isHighpassFilterEnabled), + @"autoGainControl1Enabled" : @(config.isAutoGainControl1Enabled), + @"autoGainControl2Enabled" : @(config.isAutoGainControl2Enabled) + }; +} + #pragma mark - Observer Delegate Response Methods RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(audioDeviceModuleResolveEngineCreated : (NSInteger)result) { diff --git a/ios/RCTWebRTC/WebRTCModule.h b/ios/RCTWebRTC/WebRTCModule.h index 7badb2552..9ac977b1b 100644 --- a/ios/RCTWebRTC/WebRTCModule.h +++ b/ios/RCTWebRTC/WebRTCModule.h @@ -50,6 +50,7 @@ static NSString *const kEventAudioDeviceModuleDevicesUpdated = @"audioDeviceModu @property(nonatomic, strong) NSMutableDictionary *dataPacketCryptors; @property(nonatomic, readonly) RTCAudioDeviceModule *audioDeviceModule; +@property(nonatomic, weak) id audioProcessingModule; @property(nonatomic, strong) AudioDeviceModuleObserver *audioDeviceModuleObserver; - (RTCMediaStream *)streamForReactTag:(NSString *)reactTag; diff --git a/ios/RCTWebRTC/WebRTCModule.m b/ios/RCTWebRTC/WebRTCModule.m index ce54d8db9..9cc9c240a 100644 --- a/ios/RCTWebRTC/WebRTCModule.m +++ b/ios/RCTWebRTC/WebRTCModule.m @@ -95,6 +95,7 @@ - (instancetype)init { _dataPacketCryptors = [NSMutableDictionary new]; _audioDeviceModule = _peerConnectionFactory.audioDeviceModule; + _audioProcessingModule = audioProcessingModule; _audioDeviceModuleObserver = [[AudioDeviceModuleObserver alloc] initWithWebRTCModule:self]; _audioDeviceModule.observer = _audioDeviceModuleObserver; diff --git a/src/AudioDeviceModule.ts b/src/AudioDeviceModule.ts index 8d2ab676d..8ab8cc45b 100644 --- a/src/AudioDeviceModule.ts +++ b/src/AudioDeviceModule.ts @@ -25,6 +25,15 @@ export const AudioEngineAvailability = { }, } as const; +export interface AudioProcessingConfig { + echoCancellationEnabled: boolean; + echoCancellationMobileMode: boolean; + noiseSuppressionEnabled: boolean; + highpassFilterEnabled: boolean; + autoGainControl1Enabled: boolean; + autoGainControl2Enabled: boolean; +} + /** * Audio Device Module API for controlling audio devices and settings. * iOS/macOS only - will throw on Android. @@ -326,4 +335,19 @@ export class AudioDeviceModule { return WebRTCModule.audioDeviceModuleSetEngineAvailability(availability); } + + /** + * Get the current audio processing module config (read-only). + * Returns the live APM state showing which software audio processing + * features are currently enabled. + * + * Currently only available on iOS/macOS. Returns null on Android. + */ + static getAudioProcessingConfig(): AudioProcessingConfig | null { + if (Platform.OS === 'android') { + return null; + } + + return WebRTCModule.audioDeviceModuleGetAudioProcessingConfig(); + } } diff --git a/src/index.ts b/src/index.ts index 3f2634fbf..ed42abca2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,7 +8,10 @@ if (WebRTCModule === null) { }`); } -import { AudioDeviceModule, AudioEngineMuteMode, AudioEngineAvailability } from './AudioDeviceModule'; +import { + AudioDeviceModule, AudioEngineMuteMode, AudioEngineAvailability, +} from './AudioDeviceModule'; +import type { AudioProcessingConfig } from './AudioDeviceModule'; import { audioDeviceModuleEvents } from './AudioDeviceModuleEvents'; import { setupNativeEvents } from './EventEmitter'; import Logger from './Logger'; @@ -87,6 +90,7 @@ export { AudioDeviceModule, AudioEngineMuteMode, AudioEngineAvailability, + type AudioProcessingConfig, audioDeviceModuleEvents, };