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..429c93cddb 100644 --- a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h +++ b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.h @@ -33,9 +33,14 @@ 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; +// 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 dee10905f9..74c978c138 100644 --- a/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm +++ b/sdk/objc/api/peerconnection/RTCAudioDeviceModule.mm @@ -78,7 +78,27 @@ - (instancetype)initWithNativeModule:(rtc::scoped_refptrInvoke(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 { + [self trySetOutputDevice: device]; +} + +- (BOOL)trySetOutputDevice: (RTCAudioDevice *)device { return _workerThread->Invoke(RTC_FROM_HERE, [self, device] { @@ -111,7 +131,27 @@ - (BOOL)setOutputDevice: (nullable RTCAudioDevice *)device { }); } -- (BOOL)setInputDevice: (nullable RTCAudioDevice *)device { +- (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 (RTC_OBJC_TYPE(RTCAudioDevice) *)[devices objectAtIndex:index]; + }); +} + +- (void)setInputDevice: (RTCAudioDevice *)device { + [self trySetInputDevice: device]; +} + +- (BOOL)trySetInputDevice: (RTCAudioDevice *)device { return _workerThread->Invoke(RTC_FROM_HERE, [self, device] {