From b69e038c525493dbcf85c1b03d32d92d5edd245b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:02:36 +0800 Subject: [PATCH 1/3] implement in objc layer --- modules/audio_device/audio_device_generic.h | 2 + modules/audio_device/audio_device_impl.cc | 14 +++++ modules/audio_device/audio_device_impl.h | 2 + modules/audio_device/include/audio_device.h | 2 + modules/audio_device/mac/audio_device_mac.cc | 16 ++++++ modules/audio_device/mac/audio_device_mac.h | 2 + .../api/peerconnection/RTCAudioDeviceModule.h | 7 ++- .../peerconnection/RTCAudioDeviceModule.mm | 56 ++++++++++++++----- 8 files changed, 86 insertions(+), 15 deletions(-) diff --git a/modules/audio_device/audio_device_generic.h b/modules/audio_device/audio_device_generic.h index cf88464f99..a6b7350a5d 100644 --- a/modules/audio_device/audio_device_generic.h +++ b/modules/audio_device/audio_device_generic.h @@ -136,6 +136,8 @@ class AudioDeviceGeneric { #endif // WEBRTC_IOS virtual int32_t SetAudioDeviceSink(AudioDeviceSink* sink) = 0; + virtual int32_t GetPlayoutDevice() const { return -1; } + virtual int32_t GetRecordingDevice() const { return -1; } virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) = 0; diff --git a/modules/audio_device/audio_device_impl.cc b/modules/audio_device/audio_device_impl.cc index 4df40559be..780eb541b4 100644 --- a/modules/audio_device/audio_device_impl.cc +++ b/modules/audio_device/audio_device_impl.cc @@ -951,6 +951,20 @@ int32_t AudioDeviceModuleImpl::SetAudioDeviceSink(AudioDeviceSink* sink) const { return ok; } +int32_t AudioDeviceModuleImpl::GetPlayoutDevice() const { + RTC_LOG(LS_INFO) << __FUNCTION__; + int32_t r = audio_device_->GetPlayoutDevice(); + RTC_LOG(LS_INFO) << "output: " << r; + return r; +} + +int32_t AudioDeviceModuleImpl::GetRecordingDevice() const { + RTC_LOG(LS_INFO) << __FUNCTION__; + int32_t r = audio_device_->GetRecordingDevice(); + RTC_LOG(LS_INFO) << "output: " << r; + return r; +} + AudioDeviceModuleImpl::PlatformType AudioDeviceModuleImpl::Platform() const { RTC_LOG(LS_INFO) << __FUNCTION__; return platform_type_; diff --git a/modules/audio_device/audio_device_impl.h b/modules/audio_device/audio_device_impl.h index 226f2503c3..40ffa4d303 100644 --- a/modules/audio_device/audio_device_impl.h +++ b/modules/audio_device/audio_device_impl.h @@ -147,6 +147,8 @@ class AudioDeviceModuleImpl : public AudioDeviceModuleForTest { #endif // WEBRTC_IOS int32_t SetAudioDeviceSink(AudioDeviceSink* sink) const override; + int32_t GetPlayoutDevice() const override; + int32_t GetRecordingDevice() const override; #if defined(WEBRTC_ANDROID) // Only use this acccessor for test purposes on Android. diff --git a/modules/audio_device/include/audio_device.h b/modules/audio_device/include/audio_device.h index a976a2765c..5eb80cc604 100644 --- a/modules/audio_device/include/audio_device.h +++ b/modules/audio_device/include/audio_device.h @@ -168,6 +168,8 @@ class AudioDeviceModule : public rtc::RefCountInterface { #endif // WEBRTC_IOS virtual int32_t SetAudioDeviceSink(AudioDeviceSink* sink) const = 0; + virtual int32_t GetPlayoutDevice() const { return -1; } + virtual int32_t GetRecordingDevice() const { return -1; } protected: ~AudioDeviceModule() override {} diff --git a/modules/audio_device/mac/audio_device_mac.cc b/modules/audio_device/mac/audio_device_mac.cc index ac0e756dc5..2010200d35 100644 --- a/modules/audio_device/mac/audio_device_mac.cc +++ b/modules/audio_device/mac/audio_device_mac.cc @@ -795,6 +795,14 @@ int16_t AudioDeviceMac::PlayoutDevices() { MaxNumberDevices); } +int32_t AudioDeviceMac::GetPlayoutDevice() const { + if (_outputDeviceIsSpecified) { + return _outputDeviceIndex; + } + + return 0; +} + int32_t AudioDeviceMac::SetPlayoutDevice(uint16_t index) { MutexLock lock(&mutex_); @@ -869,6 +877,14 @@ int16_t AudioDeviceMac::RecordingDevices() { MaxNumberDevices); } +int32_t AudioDeviceMac::GetRecordingDevice() const { + if (_inputDeviceIsSpecified) { + return _inputDeviceIndex; + } + + return 0; +} + int32_t AudioDeviceMac::SetRecordingDevice(uint16_t index) { if (_recIsInitialized) { return -1; diff --git a/modules/audio_device/mac/audio_device_mac.h b/modules/audio_device/mac/audio_device_mac.h index 85dae0d905..6cb5482a84 100644 --- a/modules/audio_device/mac/audio_device_mac.h +++ b/modules/audio_device/mac/audio_device_mac.h @@ -158,6 +158,8 @@ class AudioDeviceMac : public AudioDeviceGeneric { audio_device_module_sink_ = sink; return 0; } + virtual int32_t GetPlayoutDevice() const; + virtual int32_t GetRecordingDevice() const; private: int32_t InitSpeakerLocked() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); diff --git a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h index 4333167fe0..17499afe71 100644 --- a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h +++ b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h @@ -33,9 +33,12 @@ RTC_OBJC_EXPORT @property(nonatomic, readonly) BOOL playing; @property(nonatomic, readonly) BOOL recording; +@property(nonatomic, assign) RTC_OBJC_TYPE(RTCAudioDevice) *outputDevice; +@property(nonatomic, assign) RTC_OBJC_TYPE(RTCAudioDevice) *inputDevice; + // Executes low-level API's in sequence to switch the device -- (BOOL)setOutputDevice: (nullable RTCAudioDevice *)device; -- (BOOL)setInputDevice: (nullable RTCAudioDevice *)device; +// - (BOOL)setOutputDevice: (nullable RTCAudioDevice *)device; +// - (BOOL)setInputDevice: (nullable RTCAudioDevice *)device; - (BOOL)setDevicesUpdatedHandler: (nullable RTCOnAudioDevicesDidUpdate) handler; diff --git a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm index dee10905f9..20177f856d 100644 --- a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm +++ b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm @@ -78,15 +78,31 @@ - (instancetype)initWithNativeModule:(rtc::scoped_refptrInvoke(RTC_FROM_HERE, [self, device] { + return _workerThread->Invoke(RTC_FROM_HERE, [self] { + + NSArray *devices = [self _outputDevices]; + int16_t devicesCount = (int16_t)([devices count]); + int16_t index = _native->GetPlayoutDevice(); + + if (devicesCount == 0 || index <= -1 || index > (devicesCount - 1)) { + return (RTC_OBJC_TYPE(RTCAudioDevice) *)nil; + } + + return (RTC_OBJC_TYPE(RTCAudioDevice) *)[devices objectAtIndex:index]; + }); +} + +- (void)setOutputDevice: (RTCAudioDevice *)device { + + return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { NSUInteger index = 0; NSArray *devices = [self _outputDevices]; if ([devices count] == 0) { - return NO; + return; } if (device != nil) { @@ -94,7 +110,7 @@ - (BOOL)setOutputDevice: (nullable RTCAudioDevice *)device { return (*stop = [e.deviceId isEqualToString:device.deviceId]); }]; if (index == NSNotFound) { - return NO; + return; } } @@ -104,22 +120,37 @@ - (BOOL)setOutputDevice: (nullable RTCAudioDevice *)device { && _native->InitPlayout() == 0 && _native->StartPlayout() == 0) { - return YES; + // Success + return; + } + }); +} + +- (RTCAudioDevice *)inputDevice { + + return _workerThread->Invoke(RTC_FROM_HERE, [self] { + + NSArray *devices = [self _inputDevices]; + int16_t devicesCount = (int16_t)([devices count]); + int16_t index = _native->GetRecordingDevice(); + + if (devicesCount == 0 || index <= -1 || index > (devicesCount - 1)) { + return (RTC_OBJC_TYPE(RTCAudioDevice) *)nil; } - return NO; + return (RTC_OBJC_TYPE(RTCAudioDevice) *)[devices objectAtIndex:index]; }); } -- (BOOL)setInputDevice: (nullable RTCAudioDevice *)device { +- (void)setInputDevice: (RTCAudioDevice *)device { - return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { + return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { NSUInteger index = 0; NSArray *devices = [self _inputDevices]; if ([devices count] == 0) { - return NO; + return; } if (device != nil) { @@ -127,7 +158,7 @@ - (BOOL)setInputDevice: (nullable RTCAudioDevice *)device { return (*stop = [e.deviceId isEqualToString:device.deviceId]); }]; if (index == NSNotFound) { - return NO; + return; } } @@ -137,10 +168,9 @@ - (BOOL)setInputDevice: (nullable RTCAudioDevice *)device { && _native->InitRecording() == 0 && _native->StartRecording() == 0) { - return YES; + // Success + return; } - - return NO; }); } From 127d70a4178c9b3c698c558f1058464778bc2d3b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:18:49 +0800 Subject: [PATCH 2/3] try methods --- .../api/peerconnection/RTCAudioDeviceModule.h | 6 ++-- .../peerconnection/RTCAudioDeviceModule.mm | 28 +++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h index 17499afe71..429c93cddb 100644 --- a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h +++ b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h @@ -37,8 +37,10 @@ RTC_OBJC_EXPORT @property(nonatomic, assign) RTC_OBJC_TYPE(RTCAudioDevice) *inputDevice; // Executes low-level API's in sequence to switch the device -// - (BOOL)setOutputDevice: (nullable RTCAudioDevice *)device; -// - (BOOL)setInputDevice: (nullable RTCAudioDevice *)device; +// Use outputDevice / inputDevice property unless you need to know if setting the device is +// successful. +- (BOOL)trySetOutputDevice:(nullable RTCAudioDevice *)device; +- (BOOL)trySetInputDevice:(nullable RTCAudioDevice *)device; - (BOOL)setDevicesUpdatedHandler: (nullable RTCOnAudioDevicesDidUpdate) handler; diff --git a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm index 20177f856d..58f0e0c5fa 100644 --- a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm +++ b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm @@ -95,14 +95,18 @@ - (RTCAudioDevice *)outputDevice { } - (void)setOutputDevice: (RTCAudioDevice *)device { + [self trySetOutputDevice: device]; +} + +- (BOOL)trySetOutputDevice: (RTCAudioDevice *)device { - return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { + return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { NSUInteger index = 0; NSArray *devices = [self _outputDevices]; if ([devices count] == 0) { - return; + return NO; } if (device != nil) { @@ -110,7 +114,7 @@ - (void)setOutputDevice: (RTCAudioDevice *)device { return (*stop = [e.deviceId isEqualToString:device.deviceId]); }]; if (index == NSNotFound) { - return; + return NO; } } @@ -121,8 +125,10 @@ - (void)setOutputDevice: (RTCAudioDevice *)device { && _native->StartPlayout() == 0) { // Success - return; + return YES; } + + return NO; }); } @@ -143,14 +149,18 @@ - (RTCAudioDevice *)inputDevice { } - (void)setInputDevice: (RTCAudioDevice *)device { + [self trySetInputDevice: device]; +} + +- (BOOL)trySetInputDevice: (RTCAudioDevice *)device { - return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { + return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { NSUInteger index = 0; NSArray *devices = [self _inputDevices]; if ([devices count] == 0) { - return; + return NO; } if (device != nil) { @@ -158,7 +168,7 @@ - (void)setInputDevice: (RTCAudioDevice *)device { return (*stop = [e.deviceId isEqualToString:device.deviceId]); }]; if (index == NSNotFound) { - return; + return NO; } } @@ -169,8 +179,10 @@ - (void)setInputDevice: (RTCAudioDevice *)device { && _native->StartRecording() == 0) { // Success - return; + return YES; } + + return NO; }); } From 577f15f2301857a5a4074725745e80e2099b9ba8 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:20:30 +0800 Subject: [PATCH 3/3] clean --- sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm index 58f0e0c5fa..74c978c138 100644 --- a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm +++ b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm @@ -124,10 +124,9 @@ - (BOOL)trySetOutputDevice: (RTCAudioDevice *)device { && _native->InitPlayout() == 0 && _native->StartPlayout() == 0) { - // Success return YES; } - + return NO; }); } @@ -178,7 +177,6 @@ - (BOOL)trySetInputDevice: (RTCAudioDevice *)device { && _native->InitRecording() == 0 && _native->StartRecording() == 0) { - // Success return YES; }