From 5484435b09a1c9a6c4215ca7c799000b1a5513b9 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:21:35 +0800 Subject: [PATCH 1/5] patch --- .../WebRTCModule+RTCAudioDeviceModule.m | 18 +++++++++++++++ ios/RCTWebRTC/WebRTCModule.h | 1 + ios/RCTWebRTC/WebRTCModule.m | 1 + src/AudioDeviceModule.ts | 22 +++++++++++++++++++ src/index.ts | 3 ++- 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m b/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m index fad0f7c3f..a1b01c93b 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) { + RTCDefaultAudioProcessingModule *apm = (RTCDefaultAudioProcessingModule *)self.audioProcessingModule; + if (apm == nil) { + return nil; + } + RTCAudioProcessingConfig *config = apm.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..652a8a33b 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, strong) 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..29c915a3d 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,17 @@ 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. + */ + static getAudioProcessingConfig(): AudioProcessingConfig | null { + if (Platform.OS === 'android') { + throw new Error('AudioDeviceModule is only available on iOS/macOS'); + } + + return WebRTCModule.audioDeviceModuleGetAudioProcessingConfig(); + } } diff --git a/src/index.ts b/src/index.ts index 3f2634fbf..023eae7dd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,7 +8,7 @@ if (WebRTCModule === null) { }`); } -import { AudioDeviceModule, AudioEngineMuteMode, AudioEngineAvailability } from './AudioDeviceModule'; +import { AudioDeviceModule, AudioEngineMuteMode, AudioEngineAvailability, type AudioProcessingConfig } from './AudioDeviceModule'; import { audioDeviceModuleEvents } from './AudioDeviceModuleEvents'; import { setupNativeEvents } from './EventEmitter'; import Logger from './Logger'; @@ -87,6 +87,7 @@ export { AudioDeviceModule, AudioEngineMuteMode, AudioEngineAvailability, + type AudioProcessingConfig, audioDeviceModuleEvents, }; From 4e0e0ee9c32a686c0588e051daec1f9316480e25 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:23:55 +0800 Subject: [PATCH 2/5] no android --- src/AudioDeviceModule.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/AudioDeviceModule.ts b/src/AudioDeviceModule.ts index 29c915a3d..8ab8cc45b 100644 --- a/src/AudioDeviceModule.ts +++ b/src/AudioDeviceModule.ts @@ -340,10 +340,12 @@ export class AudioDeviceModule { * 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') { - throw new Error('AudioDeviceModule is only available on iOS/macOS'); + return null; } return WebRTCModule.audioDeviceModuleGetAudioProcessingConfig(); From ed273ea5ebfd5c3c71656faa029a5cc810493d54 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:25:52 +0800 Subject: [PATCH 3/5] cast 1 --- ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m b/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m index a1b01c93b..bbec1a891 100644 --- a/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m +++ b/ios/RCTWebRTC/WebRTCModule+RTCAudioDeviceModule.m @@ -230,11 +230,11 @@ @implementation WebRTCModule (RTCAudioDeviceModule) #pragma mark - Audio Processing Config RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(audioDeviceModuleGetAudioProcessingConfig) { - RTCDefaultAudioProcessingModule *apm = (RTCDefaultAudioProcessingModule *)self.audioProcessingModule; - if (apm == nil) { + id module = self.audioProcessingModule; + if (![module isKindOfClass:[RTCDefaultAudioProcessingModule class]]) { return nil; } - RTCAudioProcessingConfig *config = apm.config; + RTCAudioProcessingConfig *config = ((RTCDefaultAudioProcessingModule *)module).config; return @{ @"echoCancellationEnabled" : @(config.isEchoCancellationEnabled), @"echoCancellationMobileMode" : @(config.isEchoCancellationMobileMode), From 240a688dbf16e3703c3c14345774465e3bfa651e Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:39:26 +0800 Subject: [PATCH 4/5] weak --- ios/RCTWebRTC/WebRTCModule.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RCTWebRTC/WebRTCModule.h b/ios/RCTWebRTC/WebRTCModule.h index 652a8a33b..9ac977b1b 100644 --- a/ios/RCTWebRTC/WebRTCModule.h +++ b/ios/RCTWebRTC/WebRTCModule.h @@ -50,7 +50,7 @@ static NSString *const kEventAudioDeviceModuleDevicesUpdated = @"audioDeviceModu @property(nonatomic, strong) NSMutableDictionary *dataPacketCryptors; @property(nonatomic, readonly) RTCAudioDeviceModule *audioDeviceModule; -@property(nonatomic, strong) id audioProcessingModule; +@property(nonatomic, weak) id audioProcessingModule; @property(nonatomic, strong) AudioDeviceModuleObserver *audioDeviceModuleObserver; - (RTCMediaStream *)streamForReactTag:(NSString *)reactTag; From 1e4dcd444a4b702cf2d1c60901cf0160b563b53e Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:45:59 +0800 Subject: [PATCH 5/5] lint --- src/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 023eae7dd..ed42abca2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,7 +8,10 @@ if (WebRTCModule === null) { }`); } -import { AudioDeviceModule, AudioEngineMuteMode, AudioEngineAvailability, type AudioProcessingConfig } 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';