Title: [174666] trunk/Source/WebCore
Revision
174666
Author
[email protected]
Date
2014-10-13 17:22:49 -0700 (Mon, 13 Oct 2014)

Log Message

[iOS] Refactor AirPlay monitoring code
https://bugs.webkit.org/show_bug.cgi?id=137645
<rdar://problem/18444817>

Reviewed by Jer Noble.

Refactor AirPlay route change monitoring code:
+ Have MediaSessionManager register/unregister for route changes depending on the state of
    all sessions so it does the right thing when there is more than one media element.
+ Make HTMLMediaElement unregister with MediaSession as soon as the media player is cleared
    because there can be no wireless playback without a player.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::~HTMLMediaElement): Call mediaSession->setHasPlaybackTargetAvailabilityListeners
    when there are target availability changed listeners.
(WebCore::HTMLMediaElement::clearMediaPlayer): Ditto.
(WebCore::HTMLMediaElement::wirelessRoutesAvailableDidChange): New, media session client method.
* html/HTMLMediaElement.h:

* html/HTMLMediaSession.cpp:
(WebCore::HTMLMediaSession::HTMLMediaSession): Initialize m_hasPlaybackTargetAvailabilityListeners.
(WebCore::HTMLMediaSession::setHasPlaybackTargetAvailabilityListeners): Remember whether or not
    the client has a target availability listener and tell the media session manager to reconfigure
    itself instead of telling it to start or stop listening for route changes so it does the
    right thing when there is more than one media element.
* html/HTMLMediaSession.h:
(WebCore::HTMLMediaSession::requiresPlaybackTargetRouteMonitoring): Return true when the client
    has a target availability listener, false otherwise.

* platform/audio/MediaSession.cpp:
(WebCore::MediaSession::wirelessRoutesAvailableDidChange): Inform the client that routes have changed.
* platform/audio/MediaSession.h:
(WebCore::MediaSession::requiresPlaybackTargetRouteMonitoring):
(WebCore::MediaSessionClient::wirelessRoutesAvailableDidChange):

* platform/audio/MediaSessionManager.cpp:
(WebCore::MediaSessionManager::wirelessRoutesAvailableChanged): Implement it.
* platform/audio/MediaSessionManager.h:
(WebCore::MediaSessionManager::configureWireLessTargetMonitoring):
(WebCore::MediaSessionManager::hasWirelessTargetsAvailable):
(WebCore::MediaSessionManager::sessions):
(WebCore::MediaSessionManager::startMonitoringAirPlayRoutes): Deleted.
(WebCore::MediaSessionManager::stopMonitoringAirPlayRoutes): Deleted.

* platform/audio/ios/MediaSessionManagerIOS.h:
* platform/audio/ios/MediaSessionManagerIOS.mm:
(WebCore::MediaSessionManageriOS::configureWireLessTargetMonitoring): Start or stop monitoring
    for route changes depending on client state.
(WebCore::MediaSessionManageriOS::startMonitoringAirPlayRoutes): Deleted.
(WebCore::MediaSessionManageriOS::stopMonitoringAirPlayRoutes): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (174665 => 174666)


--- trunk/Source/WebCore/ChangeLog	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/ChangeLog	2014-10-14 00:22:49 UTC (rev 174666)
@@ -1,3 +1,56 @@
+2014-10-13  Eric Carlson  <[email protected]>
+
+        [iOS] Refactor AirPlay monitoring code
+        https://bugs.webkit.org/show_bug.cgi?id=137645
+        <rdar://problem/18444817>
+
+        Reviewed by Jer Noble.
+
+        Refactor AirPlay route change monitoring code:
+        + Have MediaSessionManager register/unregister for route changes depending on the state of
+            all sessions so it does the right thing when there is more than one media element.
+        + Make HTMLMediaElement unregister with MediaSession as soon as the media player is cleared
+            because there can be no wireless playback without a player.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::~HTMLMediaElement): Call mediaSession->setHasPlaybackTargetAvailabilityListeners
+            when there are target availability changed listeners.
+        (WebCore::HTMLMediaElement::clearMediaPlayer): Ditto.
+        (WebCore::HTMLMediaElement::wirelessRoutesAvailableDidChange): New, media session client method.
+        * html/HTMLMediaElement.h:
+
+        * html/HTMLMediaSession.cpp:
+        (WebCore::HTMLMediaSession::HTMLMediaSession): Initialize m_hasPlaybackTargetAvailabilityListeners.
+        (WebCore::HTMLMediaSession::setHasPlaybackTargetAvailabilityListeners): Remember whether or not
+            the client has a target availability listener and tell the media session manager to reconfigure
+            itself instead of telling it to start or stop listening for route changes so it does the 
+            right thing when there is more than one media element.
+        * html/HTMLMediaSession.h:
+        (WebCore::HTMLMediaSession::requiresPlaybackTargetRouteMonitoring): Return true when the client 
+            has a target availability listener, false otherwise.
+
+        * platform/audio/MediaSession.cpp:
+        (WebCore::MediaSession::wirelessRoutesAvailableDidChange): Inform the client that routes have changed.
+        * platform/audio/MediaSession.h:
+        (WebCore::MediaSession::requiresPlaybackTargetRouteMonitoring):
+        (WebCore::MediaSessionClient::wirelessRoutesAvailableDidChange):
+
+        * platform/audio/MediaSessionManager.cpp:
+        (WebCore::MediaSessionManager::wirelessRoutesAvailableChanged): Implement it.
+        * platform/audio/MediaSessionManager.h:
+        (WebCore::MediaSessionManager::configureWireLessTargetMonitoring):
+        (WebCore::MediaSessionManager::hasWirelessTargetsAvailable):
+        (WebCore::MediaSessionManager::sessions):
+        (WebCore::MediaSessionManager::startMonitoringAirPlayRoutes): Deleted.
+        (WebCore::MediaSessionManager::stopMonitoringAirPlayRoutes): Deleted.
+
+        * platform/audio/ios/MediaSessionManagerIOS.h:
+        * platform/audio/ios/MediaSessionManagerIOS.mm:
+        (WebCore::MediaSessionManageriOS::configureWireLessTargetMonitoring): Start or stop monitoring
+            for route changes depending on client state.
+        (WebCore::MediaSessionManageriOS::startMonitoringAirPlayRoutes): Deleted.
+        (WebCore::MediaSessionManageriOS::stopMonitoringAirPlayRoutes): Deleted.
+
 2014-10-13  Chris Dumez  <[email protected]>
 
         [Mac] Return value of createImageSourceOptions() is leaked in ImageSourceCG

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (174665 => 174666)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2014-10-14 00:22:49 UTC (rev 174666)
@@ -396,7 +396,7 @@
 #endif
 
 #if ENABLE(IOS_AIRPLAY)
-    if (!hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent))
+    if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent))
         m_mediaSession->setHasPlaybackTargetAvailabilityListeners(*this, false);
 #endif
 
@@ -4638,6 +4638,11 @@
     closeMediaSource();
 #endif
 
+#if ENABLE(IOS_AIRPLAY)
+    if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent))
+        m_mediaSession->setHasPlaybackTargetAvailabilityListeners(*this, false);
+#endif
+
     m_player.clear();
 
     stopPeriodicTimers();
@@ -4784,6 +4789,11 @@
     return m_mediaSession->currentPlaybackTargetIsWireless(*this);
 }
 
+void HTMLMediaElement::wirelessRoutesAvailableDidChange()
+{
+    enqueuePlaybackTargetAvailabilityChangedEvent();
+}
+
 void HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged(MediaPlayer*)
 {
     LOG(Media, "HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged(%p) - webkitCurrentPlaybackTargetIsWireless = %s", this, boolString(webkitCurrentPlaybackTargetIsWireless()));

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (174665 => 174666)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2014-10-14 00:22:49 UTC (rev 174666)
@@ -373,6 +373,7 @@
 
     virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) override;
     virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) override;
+    virtual void wirelessRoutesAvailableDidChange() override;
 
     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitcurrentplaybacktargetiswirelesschanged);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitplaybacktargetavailabilitychanged);

Modified: trunk/Source/WebCore/html/HTMLMediaSession.cpp (174665 => 174666)


--- trunk/Source/WebCore/html/HTMLMediaSession.cpp	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/html/HTMLMediaSession.cpp	2014-10-14 00:22:49 UTC (rev 174666)
@@ -77,6 +77,7 @@
 HTMLMediaSession::HTMLMediaSession(MediaSessionClient& client)
     : MediaSession(client)
     , m_restrictions(NoRestrictions)
+    , m_hasPlaybackTargetAvailabilityListeners(false)
 {
 }
 
@@ -247,10 +248,8 @@
     LOG(Media, "HTMLMediaSession::setHasPlaybackTargetAvailabilityListeners - hasListeners %s", hasListeners ? "TRUE" : "FALSE");
     UNUSED_PARAM(element);
 
-    if (hasListeners)
-        MediaSessionManager::sharedManager().startMonitoringAirPlayRoutes();
-    else
-        MediaSessionManager::sharedManager().stopMonitoringAirPlayRoutes();
+    m_hasPlaybackTargetAvailabilityListeners = hasListeners;
+    MediaSessionManager::sharedManager().configureWireLessTargetMonitoring();
 }
 #endif
 

Modified: trunk/Source/WebCore/html/HTMLMediaSession.h (174665 => 174666)


--- trunk/Source/WebCore/html/HTMLMediaSession.h	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/html/HTMLMediaSession.h	2014-10-14 00:22:49 UTC (rev 174666)
@@ -88,7 +88,10 @@
 #endif
 
 private:
+    virtual bool requiresPlaybackTargetRouteMonitoring() const { return m_hasPlaybackTargetAvailabilityListeners; }
+
     BehaviorRestrictions m_restrictions;
+    bool m_hasPlaybackTargetAvailabilityListeners;
 };
 
 }

Modified: trunk/Source/WebCore/platform/audio/MediaSession.cpp (174665 => 174666)


--- trunk/Source/WebCore/platform/audio/MediaSession.cpp	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/platform/audio/MediaSession.cpp	2014-10-14 00:22:49 UTC (rev 174666)
@@ -205,6 +205,11 @@
     m_client.setShouldBufferData(shouldBuffer);
 }
 
+void MediaSession::wirelessRoutesAvailableDidChange() const
+{
+    m_client.wirelessRoutesAvailableDidChange();
+}
+
 String MediaSessionClient::mediaSessionTitle() const
 {
     return String();

Modified: trunk/Source/WebCore/platform/audio/MediaSession.h (174665 => 174666)


--- trunk/Source/WebCore/platform/audio/MediaSession.h	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/platform/audio/MediaSession.h	2014-10-14 00:22:49 UTC (rev 174666)
@@ -107,6 +107,9 @@
     bool canReceiveRemoteControlCommands() const;
     void didReceiveRemoteControlCommand(RemoteControlCommandType);
 
+    virtual bool requiresPlaybackTargetRouteMonitoring() const { return false; }
+    void wirelessRoutesAvailableDidChange() const;
+
 protected:
     MediaSessionClient& client() const { return m_client; }
 
@@ -147,6 +150,8 @@
     virtual bool hasMediaCharacteristics(MediaSession::MediaCharacteristics) const = 0;
     virtual void mediaStateDidChange() { }
 
+    virtual void wirelessRoutesAvailableDidChange() { }
+
 protected:
     virtual ~MediaSessionClient() { }
 };

Modified: trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp (174665 => 174666)


--- trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp	2014-10-14 00:22:49 UTC (rev 174666)
@@ -282,7 +282,10 @@
 
 void MediaSessionManager::wirelessRoutesAvailableChanged()
 {
-    notImplemented();
+    LOG(Media, "MediaSessionManager::wirelessRoutesAvailableChanged");
+    Vector<MediaSession*> sessions = m_sessions;
+    for (auto* session : sessions)
+        session->wirelessRoutesAvailableDidChange();
 }
 
 #if !PLATFORM(COCOA)

Modified: trunk/Source/WebCore/platform/audio/MediaSessionManager.h (174665 => 174666)


--- trunk/Source/WebCore/platform/audio/MediaSessionManager.h	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/platform/audio/MediaSessionManager.h	2014-10-14 00:22:49 UTC (rev 174666)
@@ -65,7 +65,7 @@
         BackgroundPlaybackNotPermitted = 1 << 4,
     };
     typedef unsigned SessionRestrictions;
-    
+
     WEBCORE_EXPORT void addRestriction(MediaSession::MediaType, SessionRestrictions);
     WEBCORE_EXPORT void removeRestriction(MediaSession::MediaType, SessionRestrictions);
     WEBCORE_EXPORT SessionRestrictions restrictions(MediaSession::MediaType);
@@ -73,13 +73,13 @@
 
     virtual void sessionWillBeginPlayback(MediaSession&);
     virtual void sessionWillEndPlayback(MediaSession&);
-    
+
     bool sessionRestrictsInlineVideoPlayback(const MediaSession&) const;
 
+    virtual void configureWireLessTargetMonitoring() { }
+
 #if ENABLE(IOS_AIRPLAY)
     virtual bool hasWirelessTargetsAvailable() { return false; }
-    virtual void startMonitoringAirPlayRoutes() { }
-    virtual void stopMonitoringAirPlayRoutes() { }
 #endif
 
 protected:
@@ -88,10 +88,12 @@
 
     void addSession(MediaSession&);
     void removeSession(MediaSession&);
-    
+
     void setCurrentSession(MediaSession&);
     MediaSession* currentSession();
-    
+
+    Vector<MediaSession*> sessions() { return m_sessions; }
+
 private:
     friend class Internals;
 

Modified: trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h (174665 => 174666)


--- trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h	2014-10-14 00:22:49 UTC (rev 174666)
@@ -57,8 +57,7 @@
 
 #if ENABLE(IOS_AIRPLAY)
     virtual bool hasWirelessTargetsAvailable() override;
-    virtual void startMonitoringAirPlayRoutes() override;
-    virtual void stopMonitoringAirPlayRoutes() override;
+    virtual void configureWireLessTargetMonitoring() override;
 #endif
 
     MediaSessionManageriOS();

Modified: trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm (174665 => 174666)


--- trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm	2014-10-13 23:46:20 UTC (rev 174665)
+++ trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm	2014-10-14 00:22:49 UTC (rev 174666)
@@ -149,20 +149,27 @@
 }
 
 #if ENABLE(IOS_AIRPLAY)
-
 bool MediaSessionManageriOS::hasWirelessTargetsAvailable()
 {
     return [m_objcObserver hasWirelessTargetsAvailable];
 }
 
-void MediaSessionManageriOS::startMonitoringAirPlayRoutes()
+void MediaSessionManageriOS::configureWireLessTargetMonitoring()
 {
-    [m_objcObserver startMonitoringAirPlayRoutes];
-}
+    Vector<MediaSession*> sessions = this->sessions();
+    bool requiresMonitoring = false;
 
-void MediaSessionManageriOS::stopMonitoringAirPlayRoutes()
-{
-    [m_objcObserver stopMonitoringAirPlayRoutes];
+    for (auto* session : sessions) {
+        if (session->requiresPlaybackTargetRouteMonitoring()) {
+            requiresMonitoring = true;
+            break;
+        }
+    }
+
+    if (requiresMonitoring)
+        [m_objcObserver startMonitoringAirPlayRoutes];
+    else
+        [m_objcObserver stopMonitoringAirPlayRoutes];
 }
 #endif
     
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to