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

Reply via email to