Title: [286669] trunk/Source/WebCore
- Revision
- 286669
- Author
- eric.carl...@apple.com
- Date
- 2021-12-08 11:33:47 -0800 (Wed, 08 Dec 2021)
Log Message
[iOS] Always set audio session preferred input after changing the category
https://bugs.webkit.org/show_bug.cgi?id=232626
rdar://81618758
Reviewed by Youenn Fablet.
* platform/audio/PlatformMediaSessionManager.cpp:
(WebCore::PlatformMediaSessionManager::sessionCaptureConfigurationChanged): Schedule
a session update so the category and/or preferred input is setup.
* platform/audio/PlatformMediaSessionManager.h:
* platform/audio/ios/AudioSessionIOS.h:
* platform/audio/ios/AudioSessionIOS.mm:
(WebCore::AudioSessionIOS::setCategory): Don't set the audio session category unless
something has changed. Ask the AVAudioSessionCaptureDeviceManager to set the preferred
capture device if that has changed.
* platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.h:
* platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm:
(WebCore::AVAudioSessionCaptureDeviceManager::setPreferredAudioSessionDeviceUID):
Remember the device UID if the configuration is successful.
(WebCore::AVAudioSessionCaptureDeviceManager::configurePreferredAudioCaptureDevice):
Reset the preferred device if necessary.
(WebCore::AVAudioSessionCaptureDeviceManager::setPreferredAudioSessionDeviceUIDInternal):
Refactored from setPreferredAudioSessionDeviceUID.
* platform/mediastream/mac/CoreAudioCaptureSource.cpp:
(WebCore::CoreAudioSharedUnit::captureDeviceChanged):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (286668 => 286669)
--- trunk/Source/WebCore/ChangeLog 2021-12-08 19:16:05 UTC (rev 286668)
+++ trunk/Source/WebCore/ChangeLog 2021-12-08 19:33:47 UTC (rev 286669)
@@ -1,3 +1,34 @@
+2021-12-08 Eric Carlson <eric.carl...@apple.com>
+
+ [iOS] Always set audio session preferred input after changing the category
+ https://bugs.webkit.org/show_bug.cgi?id=232626
+ rdar://81618758
+
+ Reviewed by Youenn Fablet.
+
+ * platform/audio/PlatformMediaSessionManager.cpp:
+ (WebCore::PlatformMediaSessionManager::sessionCaptureConfigurationChanged): Schedule
+ a session update so the category and/or preferred input is setup.
+ * platform/audio/PlatformMediaSessionManager.h:
+
+ * platform/audio/ios/AudioSessionIOS.h:
+ * platform/audio/ios/AudioSessionIOS.mm:
+ (WebCore::AudioSessionIOS::setCategory): Don't set the audio session category unless
+ something has changed. Ask the AVAudioSessionCaptureDeviceManager to set the preferred
+ capture device if that has changed.
+
+ * platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.h:
+ * platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm:
+ (WebCore::AVAudioSessionCaptureDeviceManager::setPreferredAudioSessionDeviceUID):
+ Remember the device UID if the configuration is successful.
+ (WebCore::AVAudioSessionCaptureDeviceManager::configurePreferredAudioCaptureDevice):
+ Reset the preferred device if necessary.
+ (WebCore::AVAudioSessionCaptureDeviceManager::setPreferredAudioSessionDeviceUIDInternal):
+ Refactored from setPreferredAudioSessionDeviceUID.
+
+ * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
+ (WebCore::CoreAudioSharedUnit::captureDeviceChanged):
+
2021-12-08 Antti Koivisto <an...@apple.com>
[CSS Cascade Layers] CSSImportRule.cssText doesn't include layer parameter
Modified: trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h (286668 => 286669)
--- trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h 2021-12-08 19:16:05 UTC (rev 286668)
+++ trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h 2021-12-08 19:33:47 UTC (rev 286669)
@@ -64,6 +64,7 @@
bool isMuted() const final;
void handleMutedStateChange() final;
+ String m_lastSetPreferredAudioDeviceUID;
Ref<WTF::WorkQueue> m_workQueue;
RetainPtr<WebInterruptionObserverHelper> m_interruptionObserverHelper;
};
Modified: trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.mm (286668 => 286669)
--- trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.mm 2021-12-08 19:16:05 UTC (rev 286668)
+++ trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.mm 2021-12-08 19:33:47 UTC (rev 286669)
@@ -28,6 +28,7 @@
#if USE(AUDIO_SESSION) && PLATFORM(IOS_FAMILY)
+#import "AVAudioSessionCaptureDeviceManager.h"
#import "Logging.h"
#import <AVFoundation/AVAudioSession.h>
#import <objc/runtime.h>
@@ -233,11 +234,39 @@
break;
}
- NSError *error = nil;
- [[PAL::getAVAudioSessionClass() sharedInstance] setCategory:categoryString mode:categoryMode routeSharingPolicy:static_cast<AVAudioSessionRouteSharingPolicy>(policy) options:options error:&error];
+ bool needDeviceUpdate = false;
+#if ENABLE(MEDIA_STREAM)
+ auto preferredDeviceUID = AVAudioSessionCaptureDeviceManager::singleton().preferredAudioSessionDeviceUID();
+ if ((newCategory == CategoryType::PlayAndRecord || newCategory == CategoryType::RecordAudio) && !preferredDeviceUID.isEmpty()) {
+ if (m_lastSetPreferredAudioDeviceUID != preferredDeviceUID)
+ needDeviceUpdate = true;
+ } else
+ m_lastSetPreferredAudioDeviceUID = emptyString();
+#endif
+
+ auto *session = [PAL::getAVAudioSessionClass() sharedInstance];
+ auto *currentCategory = [session category];
+ auto currentOptions = [session categoryOptions];
+ auto currentPolicy = [session routeSharingPolicy];
+ auto needSessionUpdate = ![currentCategory isEqualToString:categoryString] || currentOptions != options || currentPolicy != static_cast<AVAudioSessionRouteSharingPolicy>(policy);
+
+ if (!needSessionUpdate && !needDeviceUpdate)
+ return;
+
+ if (needSessionUpdate) {
+ NSError *error = nil;
+ [session setCategory:categoryString mode:categoryMode routeSharingPolicy:static_cast<AVAudioSessionRouteSharingPolicy>(policy) options:options error:&error];
#if !PLATFORM(IOS_FAMILY_SIMULATOR) && !PLATFORM(MACCATALYST)
- ASSERT(!error);
+ ASSERT(!error);
#endif
+ }
+
+#if ENABLE(MEDIA_STREAM)
+ if (needDeviceUpdate) {
+ AVAudioSessionCaptureDeviceManager::singleton().configurePreferredAudioCaptureDevice();
+ m_lastSetPreferredAudioDeviceUID = AVAudioSessionCaptureDeviceManager::singleton().preferredAudioSessionDeviceUID();
+ }
+#endif
for (auto& observer : audioSessionCategoryChangedObservers())
observer(*this, category());
}
Modified: trunk/Source/WebCore/platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.h (286668 => 286669)
--- trunk/Source/WebCore/platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.h 2021-12-08 19:16:05 UTC (rev 286668)
+++ trunk/Source/WebCore/platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.h 2021-12-08 19:33:47 UTC (rev 286669)
@@ -58,6 +58,8 @@
void disableAllDevicesQuery();
void setPreferredAudioSessionDeviceUID(const String&);
+ String preferredAudioSessionDeviceUID() const { return m_preferredAudioDeviceUID; }
+ void configurePreferredAudioCaptureDevice();
private:
AVAudioSessionCaptureDeviceManager();
@@ -68,6 +70,7 @@
void refreshAudioCaptureDevices();
Vector<AVAudioSessionCaptureDevice> retrieveAudioSessionCaptureDevices() const;
void setAudioCaptureDevices(Vector<AVAudioSessionCaptureDevice>&&);
+ bool setPreferredAudioSessionDeviceUIDInternal(const String&);
enum class AudioSessionState { NotNeeded, Inactive, Active };
@@ -78,6 +81,7 @@
RetainPtr<AVAudioSession> m_audioSession;
Ref<WorkQueue> m_dispatchQueue;
AudioSessionState m_audioSessionState { AudioSessionState::NotNeeded };
+ String m_preferredAudioDeviceUID;
bool m_recomputeDevices { true };
};
Modified: trunk/Source/WebCore/platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm (286668 => 286669)
--- trunk/Source/WebCore/platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm 2021-12-08 19:16:05 UTC (rev 286668)
+++ trunk/Source/WebCore/platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm 2021-12-08 19:33:47 UTC (rev 286669)
@@ -146,6 +146,19 @@
void AVAudioSessionCaptureDeviceManager::setPreferredAudioSessionDeviceUID(const String& deviceUID)
{
+ if (setPreferredAudioSessionDeviceUIDInternal(deviceUID))
+ m_preferredAudioDeviceUID = deviceUID;
+}
+
+void AVAudioSessionCaptureDeviceManager::configurePreferredAudioCaptureDevice()
+{
+ ASSERT(!m_preferredAudioDeviceUID.isEmpty());
+ if (!m_preferredAudioDeviceUID.isEmpty())
+ setPreferredAudioSessionDeviceUIDInternal(m_preferredAudioDeviceUID);
+}
+
+bool AVAudioSessionCaptureDeviceManager::setPreferredAudioSessionDeviceUIDInternal(const String& deviceUID)
+{
AVAudioSessionPortDescription *preferredPort = nil;
NSString *nsDeviceUID = deviceUID;
for (AVAudioSessionPortDescription *portDescription in [m_audioSession availableInputs]) {
@@ -157,12 +170,16 @@
if (!preferredPort) {
RELEASE_LOG_ERROR(WebRTC, "failed to find preferred input '%{public}s'", deviceUID.ascii().data());
- return;
+ return false;
}
NSError *error = nil;
- if (![[PAL::getAVAudioSessionClass() sharedInstance] setPreferredInput:preferredPort error:&error])
+ if (![[PAL::getAVAudioSessionClass() sharedInstance] setPreferredInput:preferredPort error:&error]) {
RELEASE_LOG_ERROR(WebRTC, "failed to set preferred input to '%{public}s' with error: %@", deviceUID.ascii().data(), error.localizedDescription);
+ return false;
+ }
+
+ return true;
}
void AVAudioSessionCaptureDeviceManager::scheduleUpdateCaptureDevices()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes