Changeset 182486 in webkit
- Timestamp:
- Apr 7, 2015 1:23:17 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r182478 r182486 1 2015-04-07 Eric Carlson <eric.carlson@apple.com> 2 3 [Mac] video playing to external device should not be interrupted 4 https://bugs.webkit.org/show_bug.cgi?id=143492 5 6 Reviewed by Jer Noble. 7 8 * Modules/mediacontrols/mediaControlsApple.js: 9 (Controller.prototype.handlePanelTransitionEnd): Drive-by fix to make sure the controls are 10 not hidden if the opacity timer is primed before they go into a state where they should 11 never be hidden. 12 13 * html/HTMLMediaElement.cpp: 14 (WebCore::HTMLMediaElement::canPlayToWirelessPlaybackTarget): Make it const. 15 (WebCore::HTMLMediaElement::isPlayingToWirelessPlaybackTarget): New. 16 * html/HTMLMediaElement.h: 17 18 * html/HTMLMediaSession.cpp: 19 (WebCore::HTMLMediaSession::canPlayToWirelessPlaybackTarget): New. Short-circuit call to 20 client when we already know the answer. 21 (WebCore::HTMLMediaSession::isPlayingToWirelessPlaybackTarget): Ditto. 22 (WebCore::HTMLMediaSession::startPlayingToPlaybackTarget): Ditto. 23 (WebCore::HTMLMediaSession::stopPlayingToPlaybackTarget): Ditto. 24 * html/HTMLMediaSession.h: 25 26 * platform/audio/MediaSession.cpp: 27 (WebCore::MediaSession::canPlayToWirelessPlaybackTarget): Deleted, moved inline and neutered 28 because only HTMLMediaSession needs to use them. 29 (WebCore::MediaSession::startPlayingToPlaybackTarget): Ditto. 30 (WebCore::MediaSession::stopPlayingToPlaybackTarget): Ditto. 31 * platform/audio/MediaSession.h: 32 (WebCore::MediaSession::canPlayToWirelessPlaybackTarget): 33 (WebCore::MediaSession::isPlayingToWirelessPlaybackTarget): 34 (WebCore::MediaSession::startPlayingToPlaybackTarget): 35 (WebCore::MediaSession::stopPlayingToPlaybackTarget): 36 (WebCore::MediaSessionClient::canPlayToWirelessPlaybackTarget): 37 (WebCore::MediaSessionClient::isPlayingToWirelessPlaybackTarget): 38 39 * platform/audio/MediaSessionManager.cpp: 40 (WebCore::MediaSessionManager::MediaSessionManager): 41 (WebCore::MediaSessionManager::sessionShouldBeginPlayingToWirelessPlaybackTarget): New. 42 (WebCore::MediaSessionManager::sessionWillBeginPlayback): Don't interrupt an active session 43 playing to a target device. 44 * platform/audio/MediaSessionManager.h: 45 46 * platform/graphics/MediaPlayer.cpp: 47 (WebCore::MediaPlayer::isPlayingToWirelessPlaybackTarget): New, passthrough. 48 * platform/graphics/MediaPlayer.h: 49 * platform/graphics/MediaPlayerPrivate.h: 50 (WebCore::MediaPlayerPrivateInterface::isPlayingToWirelessPlaybackTarget): 51 52 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h: 53 (WebCore::MediaPlayerPrivateAVFoundationObjC::canPlayToWirelessPlaybackTarget): 54 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: 55 (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget): Explicitly call 56 when passed a nil or inactive target context. 57 (WebCore::MediaPlayerPrivateAVFoundationObjC::startPlayingToPlaybackTarget): Add logging. 58 (WebCore::MediaPlayerPrivateAVFoundationObjC::stopPlayingToPlaybackTarget): Ditto. 59 (WebCore::MediaPlayerPrivateAVFoundationObjC::isPlayingToWirelessPlaybackTarget): New. Return 60 true when playing with an active context. 61 (WebCore::playerKVOProperties): "outputContext" is not observable. 62 1 63 2015-04-07 Sam Weinig <sam@webkit.org> 2 64 -
trunk/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js
r182282 r182486 784 784 if (parseInt(opacity) > 0) { 785 785 this.controls.panel.classList.remove(this.ClassNames.hidden); 786 } else {786 } else if (!this.controlsAlwaysVisible()) { 787 787 this.controls.panel.classList.add(this.ClassNames.hidden); 788 788 } -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r182478 r182486 7304 7304 078E43DB1ABB6F6F001C2FA6 /* MediaPlaybackTargetPickerMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaPlaybackTargetPickerMac.h; path = objc/MediaPlaybackTargetPickerMac.h; sourceTree = "<group>"; }; 7305 7305 078E43DC1ABB6F6F001C2FA6 /* MediaPlaybackTargetPickerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MediaPlaybackTargetPickerMac.mm; path = objc/MediaPlaybackTargetPickerMac.mm; sourceTree = "<group>"; }; 7306 079216531AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaPlaybackTargetPickerClient.h; path = graphics/MediaPlaybackTargetPickerClient.h; sourceTree = "<group>"; };7306 079216531AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlaybackTargetPickerClient.h; sourceTree = "<group>"; }; 7307 7307 0794178F166E855F009416C2 /* InbandTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrack.cpp; sourceTree = "<group>"; }; 7308 7308 07941790166E855F009416C2 /* InbandTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrack.h; sourceTree = "<group>"; }; … … 20819 20819 078E43D71ABB6C7E001C2FA6 /* MediaPlaybackTargetPicker.cpp */, 20820 20820 078E43D81ABB6C7E001C2FA6 /* MediaPlaybackTargetPicker.h */, 20821 079216531AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h */, 20821 20822 E4B41E0C0CBF90BD00AF2ECE /* MediaPlayer.cpp */, 20822 20823 E4B41E0D0CBF90BD00AF2ECE /* MediaPlayer.h */, … … 21624 21625 isa = PBXGroup; 21625 21626 children = ( 21626 079216531AA560AA00A3C049 /* MediaPlaybackTargetPickerClient.h */,21627 21627 49E912A40EFAC8E6009D0CAF /* animation */, 21628 21628 FD31604012B026A300C1A359 /* audio */, -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r182240 r182486 4886 4886 } 4887 4887 4888 bool HTMLMediaElement::canPlayToWirelessPlaybackTarget() 4888 bool HTMLMediaElement::canPlayToWirelessPlaybackTarget() const 4889 4889 { 4890 4890 bool canPlay = m_player && m_player->canPlayToWirelessPlaybackTarget(); … … 4893 4893 4894 4894 return canPlay; 4895 } 4896 4897 bool HTMLMediaElement::isPlayingToWirelessPlaybackTarget() const 4898 { 4899 bool isPlaying = m_player && m_player->isPlayingToWirelessPlaybackTarget(); 4900 4901 LOG(Media, "HTMLMediaElement::isPlayingToWirelessPlaybackTarget(%p) - returning %s", this, boolString(isPlaying)); 4902 4903 return isPlaying; 4895 4904 } 4896 4905 -
trunk/Source/WebCore/html/HTMLMediaElement.h
r182439 r182486 362 362 363 363 virtual void wirelessRoutesAvailableDidChange() override; 364 virtual bool canPlayToWirelessPlaybackTarget() override; 364 virtual bool canPlayToWirelessPlaybackTarget() const override; 365 virtual bool isPlayingToWirelessPlaybackTarget() const override; 365 366 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) override; 366 367 virtual void startPlayingToPlaybackTarget() override; -
trunk/Source/WebCore/html/HTMLMediaSession.cpp
r182274 r182486 318 318 return m_hasPlaybackTargetAvailabilityListeners; 319 319 } 320 321 bool HTMLMediaSession::canPlayToWirelessPlaybackTarget() const 322 { 323 if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute()) 324 return false; 325 326 return client().canPlayToWirelessPlaybackTarget(); 327 } 328 329 bool HTMLMediaSession::isPlayingToWirelessPlaybackTarget() const 330 { 331 if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute()) 332 return false; 333 334 return client().isPlayingToWirelessPlaybackTarget(); 335 } 336 337 void HTMLMediaSession::startPlayingToPlaybackTarget() 338 { 339 if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute()) 340 return; 341 342 client().startPlayingToPlaybackTarget(); 343 } 344 345 void HTMLMediaSession::stopPlayingToPlaybackTarget() 346 { 347 if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute()) 348 return; 349 350 client().stopPlayingToPlaybackTarget(); 351 } 320 352 #endif 321 353 -
trunk/Source/WebCore/html/HTMLMediaSession.h
r182240 r182486 64 64 65 65 void setHasPlaybackTargetAvailabilityListeners(const HTMLMediaElement&, bool); 66 67 virtual bool canPlayToWirelessPlaybackTarget() const override; 68 virtual bool isPlayingToWirelessPlaybackTarget() const override; 69 virtual void startPlayingToPlaybackTarget() override; 70 virtual void stopPlayingToPlaybackTarget() override; 66 71 #endif 67 72 -
trunk/Source/WebCore/platform/audio/MediaSession.cpp
r182240 r182486 228 228 } 229 229 230 bool MediaSession::canPlayToWirelessPlaybackTarget() const231 {232 return m_client.canPlayToWirelessPlaybackTarget();233 }234 235 void MediaSession::startPlayingToPlaybackTarget()236 {237 client().startPlayingToPlaybackTarget();238 }239 240 void MediaSession::stopPlayingToPlaybackTarget()241 {242 client().stopPlayingToPlaybackTarget();243 }244 245 230 String MediaSessionClient::mediaSessionTitle() const 246 231 { -
trunk/Source/WebCore/platform/audio/MediaSession.h
r182240 r182486 118 118 bool isHidden() const; 119 119 120 bool canPlayToWirelessPlaybackTarget() const; 121 void startPlayingToPlaybackTarget(); 122 void stopPlayingToPlaybackTarget(); 120 virtual bool canPlayToWirelessPlaybackTarget() const { return false; } 121 virtual bool isPlayingToWirelessPlaybackTarget() const { return false; } 122 virtual void startPlayingToPlaybackTarget() { } 123 virtual void stopPlayingToPlaybackTarget() { } 123 124 124 125 #if ENABLE(WIRELESS_PLAYBACK_TARGET) … … 170 171 virtual void wirelessRoutesAvailableDidChange() { } 171 172 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) { } 172 virtual bool canPlayToWirelessPlaybackTarget() { return false; } 173 virtual bool canPlayToWirelessPlaybackTarget() const { return false; } 174 virtual bool isPlayingToWirelessPlaybackTarget() const { return false; } 173 175 virtual void startPlayingToPlaybackTarget() { } 174 176 virtual void stopPlayingToPlaybackTarget() { } -
trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp
r182240 r182486 46 46 MediaSessionManager::MediaSessionManager() 47 47 : m_systemSleepListener(SystemSleepListener::create(*this)) 48 , m_interrupted(false)49 48 { 50 49 resetRestrictions(); … … 168 167 } 169 168 169 bool MediaSessionManager::sessionShouldBeginPlayingToWirelessPlaybackTarget(MediaSession& session) const 170 { 171 if (!session.canPlayToWirelessPlaybackTarget()) 172 return false; 173 174 if (session.isPlayingToWirelessPlaybackTarget()) 175 return false; 176 177 Vector<MediaSession*> sessions = m_sessions; 178 for (auto* oneSession : sessions) { 179 if (oneSession == &session) 180 continue; 181 if (oneSession->isPlayingToWirelessPlaybackTarget()) 182 return false; 183 } 184 185 return true; 186 } 187 170 188 bool MediaSessionManager::sessionWillBeginPlayback(MediaSession& session) 171 189 { … … 187 205 endInterruption(MediaSession::NoFlags); 188 206 189 bool newSessionCanPlayToPlaybackTarget = session.canPlayToWirelessPlaybackTarget();207 bool shouldPlayToPlaybackTarget = sessionShouldBeginPlayingToWirelessPlaybackTarget(session); 190 208 Vector<MediaSession*> sessions = m_sessions; 191 209 for (auto* oneSession : sessions) { 192 210 if (oneSession == &session) 193 211 continue; 194 if ( newSessionCanPlayToPlaybackTarget)212 if (shouldPlayToPlaybackTarget) 195 213 oneSession->stopPlayingToPlaybackTarget(); 196 214 if (oneSession->mediaType() == sessionType && restrictions & ConcurrentPlaybackNotPermitted) 197 215 oneSession->pauseSession(); 198 216 } 199 session.startPlayingToPlaybackTarget(); 217 218 if (shouldPlayToPlaybackTarget) 219 session.startPlayingToPlaybackTarget(); 200 220 201 221 updateSessionState(); -
trunk/Source/WebCore/platform/audio/MediaSessionManager.h
r182240 r182486 102 102 103 103 void updateSessionState(); 104 bool sessionShouldBeginPlayingToWirelessPlaybackTarget(MediaSession&) const; 104 105 105 106 // RemoteCommandListenerClient … … 118 119 119 120 Vector<MediaSession*> m_sessions; 121 120 122 std::unique_ptr<RemoteCommandListener> m_remoteCommandListener; 121 123 std::unique_ptr<SystemSleepListener> m_systemSleepListener; 122 124 RefPtr<AudioHardwareListener> m_audioHardwareListener; 123 bool m_interrupted ;125 bool m_interrupted { false }; 124 126 }; 125 127 -
trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp
r182240 r182486 879 879 } 880 880 881 bool MediaPlayer::isPlayingToWirelessPlaybackTarget() const 882 { 883 return m_private->isPlayingToWirelessPlaybackTarget(); 884 } 885 881 886 void MediaPlayer::setWirelessPlaybackTarget(const MediaPlaybackTarget& device) 882 887 { -
trunk/Source/WebCore/platform/graphics/MediaPlayer.h
r182240 r182486 481 481 482 482 bool canPlayToWirelessPlaybackTarget() const; 483 bool isPlayingToWirelessPlaybackTarget() const; 483 484 void setWirelessPlaybackTarget(const MediaPlaybackTarget&); 484 485 -
trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h
r182240 r182486 171 171 172 172 virtual bool canPlayToWirelessPlaybackTarget() const { return false; } 173 virtual bool isPlayingToWirelessPlaybackTarget() { return false; } 173 174 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) { } 174 175 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h
r182240 r182486 278 278 virtual bool wirelessVideoPlaybackDisabled() const override; 279 279 virtual void setWirelessVideoPlaybackDisabled(bool) override; 280 virtual bool canPlayToWirelessPlaybackTarget() const { return true; } 280 281 void updateDisableExternalPlayback(); 281 bool canPlayToWirelessPlaybackTarget() const { return true; }282 282 #endif 283 283 … … 286 286 virtual void startPlayingToPlaybackTarget() override; 287 287 virtual void stopPlayingToPlaybackTarget() override; 288 virtual bool isPlayingToWirelessPlaybackTarget(); 288 289 #endif 289 290 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
r182292 r182486 2769 2769 m_outputContext = target.devicePickerContext(); 2770 2770 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(%p) - target = %p", this, m_outputContext.get()); 2771 2772 if (!m_outputContext || !m_outputContext.get().deviceName) 2773 stopPlayingToPlaybackTarget(); 2771 2774 } 2772 2775 … … 2782 2785 m_avPlayer.get().outputContext = m_outputContext.get(); 2783 2786 setDelayCallbacks(false); 2787 2788 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::startPlayingToPlaybackTarget(%p) - target = %p", this, m_avPlayer.get().outputContext); 2784 2789 } 2785 2790 … … 2793 2798 // m_avPlayer.get().outputContext = nil; 2794 2799 setDelayCallbacks(false); 2795 } 2796 #endif 2800 2801 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::stopPlayingToPlaybackTarget(%p) - target = %p", this, m_avPlayer.get().outputContext); 2802 } 2803 2804 bool MediaPlayerPrivateAVFoundationObjC::isPlayingToWirelessPlaybackTarget() 2805 { 2806 if (!m_avPlayer) 2807 return false; 2808 2809 if (!m_outputContext || !m_outputContext.get().deviceName) 2810 return false; 2811 2812 return m_cachedRate; 2813 } 2814 #endif // !PLATFORM(IOS) 2797 2815 2798 2816 void MediaPlayerPrivateAVFoundationObjC::updateDisableExternalPlayback() … … 3111 3129 static NSArray* keys = [[NSArray alloc] initWithObjects:@"rate", 3112 3130 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 3113 @"externalPlaybackActive", @" outputContext", @"allowsExternalPlayback",3131 @"externalPlaybackActive", @"allowsExternalPlayback", 3114 3132 #endif 3115 3133 nil]; … … 3232 3250 function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::rateDidChange, m_callback, [newValue doubleValue]); 3233 3251 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 3234 else if ([keyPath isEqualToString:@"externalPlaybackActive"] || [keyPath isEqualToString:@" outputContext"] || [keyPath isEqualToString:@"allowsExternalPlayback"])3252 else if ([keyPath isEqualToString:@"externalPlaybackActive"] || [keyPath isEqualToString:@"allowsExternalPlayback"]) 3235 3253 function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback); 3236 3254 #endif
Note: See TracChangeset
for help on using the changeset viewer.