https://bugs.webkit.org/show_bug.cgi?id=132374
Reviewed by Jer Noble.
Source/WebCore:
* WebCore.exp.in: Update beginInterruption signature.
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::canOverrideBackgroundPlaybackRestriction): New, return true when
playing to external device.
* html/HTMLMediaElement.h:
* platform/audio/MediaSession.cpp:
(WebCore::MediaSession::beginInterruption): Add interruption type to beginInterruption.
* platform/audio/MediaSession.h:
* platform/audio/MediaSessionManager.cpp:
(WebCore::MediaSessionManager::beginInterruption): Ditto.
(WebCore::MediaSessionManager::applicationWillEnterBackground): Ditto.
(WebCore::MediaSessionManager::systemWillSleep): Ditto.
* platform/audio/MediaSessionManager.h:
* platform/audio/ios/AudioDestinationIOS.h:
* platform/audio/ios/MediaSessionManagerIOS.mm:
(-[WebMediaSessionHelper interruption:]): Ditto.
* platform/audio/mac/AudioDestinationMac.h: Make most methods private. Add
canOverrideBackgroundPlaybackRestriction. Add missing overrides.
* testing/Internals.cpp:
(WebCore::Internals::beginMediaSessionInterruption): Pass interruption type.
Source/webkit:
* WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@168075
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2014-04-30 Eric Carlson <eric.carlson@apple.com>
+
+ [iOS] do not pause video when entering background while playing to external device
+ https://bugs.webkit.org/show_bug.cgi?id=132374
+
+ Reviewed by Jer Noble.
+
+ * WebCore.exp.in: Update beginInterruption signature.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::canOverrideBackgroundPlaybackRestriction): New, return true when
+ playing to external device.
+ * html/HTMLMediaElement.h:
+
+ * platform/audio/MediaSession.cpp:
+ (WebCore::MediaSession::beginInterruption): Add interruption type to beginInterruption.
+ * platform/audio/MediaSession.h:
+
+ * platform/audio/MediaSessionManager.cpp:
+ (WebCore::MediaSessionManager::beginInterruption): Ditto.
+ (WebCore::MediaSessionManager::applicationWillEnterBackground): Ditto.
+ (WebCore::MediaSessionManager::systemWillSleep): Ditto.
+ * platform/audio/MediaSessionManager.h:
+
+ * platform/audio/ios/AudioDestinationIOS.h:
+ * platform/audio/ios/MediaSessionManagerIOS.mm:
+ (-[WebMediaSessionHelper interruption:]): Ditto.
+
+ * platform/audio/mac/AudioDestinationMac.h: Make most methods private. Add
+ canOverrideBackgroundPlaybackRestriction. Add missing overrides.
+ * testing/Internals.cpp:
+ (WebCore::Internals::beginMediaSessionInterruption): Pass interruption type.
+
2014-04-30 Manuel Rego Casasnovas <rego@igalia.com>
Unreviewed, rolling out r167879 and r167942.
__ZN7WebCore19MediaSessionManager13sharedManagerEv
__ZN7WebCore19MediaSessionManager14addRestrictionENS_12MediaSession9MediaTypeEj
__ZN7WebCore19MediaSessionManager15endInterruptionENS_12MediaSession20EndInterruptionFlagsE
-__ZN7WebCore19MediaSessionManager17beginInterruptionEv
+__ZN7WebCore19MediaSessionManager17beginInterruptionENS_12MediaSession16InterruptionTypeE
__ZN7WebCore19MediaSessionManager17removeRestrictionENS_12MediaSession9MediaTypeEj
__ZN7WebCore19MediaSessionManager30didReceiveRemoteControlCommandENS_12MediaSession24RemoteControlCommandTypeE
__ZN7WebCore19MediaSessionManager9addClientEPNS_25MediaSessionManagerClientE
}
}
+bool HTMLMediaElement::overrideBackgroundPlaybackRestriction() const
+{
+#if ENABLE(IOS_AIRPLAY)
+ if (m_player && m_player->isCurrentPlaybackTargetWireless())
+ return true;
+#endif
+ return false;
+}
+
bool HTMLMediaElement::doesHaveAttribute(const AtomicString& attribute, AtomicString* value) const
{
QualifiedName attributeName(nullAtom, attribute, nullAtom);
virtual double mediaSessionCurrentTime() const override { return currentTime(); }
virtual bool canReceiveRemoteControlCommands() const override { return true; }
virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override;
+ virtual bool overrideBackgroundPlaybackRestriction() const override;
void registerWithDocument(Document&);
void unregisterWithDocument(Document&);
m_state = state;
}
-void MediaSession::beginInterruption()
+void MediaSession::beginInterruption(InterruptionType type)
{
LOG(Media, "MediaSession::beginInterruption(%p), state = %s", this, stateName(m_state));
+ if (type == EnteringBackground && client().overrideBackgroundPlaybackRestriction())
+ return;
+
m_stateToRestore = state();
m_notifyingClient = true;
client().pausePlayback();
State state() const { return m_state; }
void setState(State);
+ enum InterruptionType {
+ SystemSleep,
+ EnteringBackground,
+ SystemInterruption,
+ };
enum EndInterruptionFlags {
NoFlags = 0,
MayResumePlaying = 1 << 0,
};
- void beginInterruption();
+ void beginInterruption(InterruptionType);
void endInterruption(EndInterruptionFlags);
void applicationWillEnterForeground() const;
virtual void setShouldBufferData(bool) { }
virtual bool elementIsHidden() const { return false; }
+ virtual bool overrideBackgroundPlaybackRestriction() const = 0;
+
protected:
virtual ~MediaSessionClient() { }
};
return count;
}
-void MediaSessionManager::beginInterruption()
+void MediaSessionManager::beginInterruption(MediaSession::InterruptionType type)
{
LOG(Media, "MediaSessionManager::beginInterruption");
m_interrupted = true;
Vector<MediaSession*> sessions = m_sessions;
for (auto* session : sessions)
- session->beginInterruption();
+ session->beginInterruption(type);
}
void MediaSessionManager::endInterruption(MediaSession::EndInterruptionFlags flags)
Vector<MediaSession*> sessions = m_sessions;
for (auto* session : sessions) {
if (m_restrictions[session->mediaType()] & BackgroundPlaybackNotPermitted)
- session->beginInterruption();
+ session->beginInterruption(MediaSession::EnteringBackground);
}
}
return;
for (auto session : m_sessions)
- session->beginInterruption();
+ session->beginInterruption(MediaSession::SystemSleep);
}
void MediaSessionManager::systemDidWake()
bool has(MediaSession::MediaType) const;
int count(MediaSession::MediaType) const;
- void beginInterruption();
+ void beginInterruption(MediaSession::InterruptionType);
void endInterruption(MediaSession::EndInterruptionFlags);
void applicationWillEnterForeground() const;
virtual MediaSession::MediaType mediaType() const { return MediaSession::WebAudio; }
virtual bool canReceiveRemoteControlCommands() const { return false; }
virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) { }
+ virtual bool overrideBackgroundPlaybackRestriction() const { return false; }
virtual void pausePlayback() override { stop(); }
virtual void resumePlayback() override { start(); }
return;
if (type == AVAudioSessionInterruptionTypeBegan)
- _callback->beginInterruption();
+ _callback->beginInterruption(MediaSession::SystemInterruption);
else
_callback->endInterruption(flags);
AudioDestinationMac(AudioIOCallback&, float sampleRate);
virtual ~AudioDestinationMac();
- virtual void start() override;
- virtual void stop() override;
- virtual bool isPlaying() override { return m_isPlaying; }
-
- virtual void pausePlayback() override { stop(); }
- virtual void resumePlayback() override { start(); }
-
- virtual float sampleRate() const override { return m_sampleRate; }
-
private:
void configure();
OSStatus render(UInt32 numberOfFrames, AudioBufferList* ioData);
- virtual MediaSession::MediaType mediaType() const { return MediaSession::WebAudio; }
- virtual bool canReceiveRemoteControlCommands() const { return false; }
- virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) { }
+ virtual MediaSession::MediaType mediaType() const override { return MediaSession::WebAudio; }
+ virtual bool canReceiveRemoteControlCommands() const override { return false; }
+ virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override { }
+ virtual bool overrideBackgroundPlaybackRestriction() const override { return false; }
+
+ virtual void start() override;
+ virtual void stop() override;
+ virtual bool isPlaying() override { return m_isPlaying; }
+
+ virtual void pausePlayback() override { stop(); }
+ virtual void resumePlayback() override { start(); }
+
+ virtual float sampleRate() const override { return m_sampleRate; }
AudioUnit m_outputUnit;
AudioIOCallback& m_callback;
#if ENABLE(VIDEO)
void Internals::beginMediaSessionInterruption()
{
- MediaSessionManager::sharedManager().beginInterruption();
+ MediaSessionManager::sharedManager().beginInterruption(MediaSession::SystemInterruption);
}
void Internals::endMediaSessionInterruption(const String& flagsString)
+2014-04-30 Eric Carlson <eric.carlson@apple.com>
+
+ [iOS] do not pause video when entering background while playing to external device
+ https://bugs.webkit.org/show_bug.cgi?id=132374
+
+ Reviewed by Jer Noble.
+
+ * WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in:
+
2014-04-30 Anders Carlsson <andersca@apple.com>
Try yet again to fix the build.
symbolWithPointer(?shadowRoot@Element@WebCore@@QBEPAVShadowRoot@2@XZ, ?shadowRoot@Element@WebCore@@QEBAPEAVShadowRoot@2@XZ)
#if ENABLE(VIDEO)
symbolWithPointer(?sharedManager@MediaSessionManager@WebCore@@SAAAV12@XZ, ?sharedManager@MediaSessionManager@WebCore@@SAAEAV12@XZ)
- symbolWithPointer(?beginInterruption@MediaSessionManager@WebCore@@QAEXXZ, ?beginInterruption@MediaSessionManager@WebCore@@QEAAXXZ)
+ symbolWithPointer(?beginInterruption@MediaSessionManager@WebCore@@QAEXW4InterruptionType@MediaSession@2@@Z, ?beginInterruption@MediaSessionManager@WebCore@@QAEXW4InterruptionType@MediaSession@2@@Z)
symbolWithPointer(?endInterruption@MediaSessionManager@WebCore@@QAEXW4EndInterruptionFlags@MediaSession@2@@Z, ?endInterruption@MediaSessionManager@WebCore@@QEAAXW4EndInterruptionFlags@MediaSession@2@@Z)
symbolWithPointer(?addRestriction@MediaSessionManager@WebCore@@QAEXW4MediaType@MediaSession@2@I@Z, ?addRestriction@MediaSessionManager@WebCore@@QEAAXW4MediaType@MediaSession@2@I@Z)
symbolWithPointer(?removeRestriction@MediaSessionManager@WebCore@@QAEXW4MediaType@MediaSession@2@I@Z, ?removeRestriction@MediaSessionManager@WebCore@@QEAAXW4MediaType@MediaSession@2@I@Z)