Changeset 168075 in webkit


Ignore:
Timestamp:
Apr 30, 2014 6:47:20 PM (10 years ago)
Author:
eric.carlson@apple.com
Message:

[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.

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:
Location:
trunk/Source
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r168067 r168075  
     12014-04-30  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [iOS] do not pause video when entering background while playing to external device
     4        https://bugs.webkit.org/show_bug.cgi?id=132374
     5
     6        Reviewed by Jer Noble.
     7
     8        * WebCore.exp.in: Update beginInterruption signature.
     9
     10        * html/HTMLMediaElement.cpp:
     11        (WebCore::HTMLMediaElement::canOverrideBackgroundPlaybackRestriction): New, return true when
     12            playing to external device.
     13        * html/HTMLMediaElement.h:
     14
     15        * platform/audio/MediaSession.cpp:
     16        (WebCore::MediaSession::beginInterruption): Add interruption type to beginInterruption.
     17        * platform/audio/MediaSession.h:
     18
     19        * platform/audio/MediaSessionManager.cpp:
     20        (WebCore::MediaSessionManager::beginInterruption): Ditto.
     21        (WebCore::MediaSessionManager::applicationWillEnterBackground): Ditto.
     22        (WebCore::MediaSessionManager::systemWillSleep): Ditto.
     23        * platform/audio/MediaSessionManager.h:
     24
     25        * platform/audio/ios/AudioDestinationIOS.h:
     26        * platform/audio/ios/MediaSessionManagerIOS.mm:
     27        (-[WebMediaSessionHelper interruption:]): Ditto.
     28
     29        * platform/audio/mac/AudioDestinationMac.h: Make most methods private. Add
     30            canOverrideBackgroundPlaybackRestriction. Add missing overrides.
     31        * testing/Internals.cpp:
     32        (WebCore::Internals::beginMediaSessionInterruption): Pass interruption type.
     33
    1342014-04-30  Manuel Rego Casasnovas  <rego@igalia.com>
    235
  • trunk/Source/WebCore/WebCore.exp.in

    r168052 r168075  
    802802__ZN7WebCore19MediaSessionManager14addRestrictionENS_12MediaSession9MediaTypeEj
    803803__ZN7WebCore19MediaSessionManager15endInterruptionENS_12MediaSession20EndInterruptionFlagsE
    804 __ZN7WebCore19MediaSessionManager17beginInterruptionEv
     804__ZN7WebCore19MediaSessionManager17beginInterruptionENS_12MediaSession16InterruptionTypeE
    805805__ZN7WebCore19MediaSessionManager17removeRestrictionENS_12MediaSession9MediaTypeEj
    806806__ZN7WebCore19MediaSessionManager30didReceiveRemoteControlCommandENS_12MediaSession24RemoteControlCommandTypeE
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r168036 r168075  
    61826182}
    61836183
     6184bool HTMLMediaElement::overrideBackgroundPlaybackRestriction() const
     6185{
     6186#if ENABLE(IOS_AIRPLAY)
     6187    if (m_player && m_player->isCurrentPlaybackTargetWireless())
     6188        return true;
     6189#endif
     6190    return false;
     6191}
     6192
    61846193bool HTMLMediaElement::doesHaveAttribute(const AtomicString& attribute, AtomicString* value) const
    61856194{
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r168036 r168075  
    718718    virtual bool canReceiveRemoteControlCommands() const override { return true; }
    719719    virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override;
     720    virtual bool overrideBackgroundPlaybackRestriction() const override;
    720721
    721722    void registerWithDocument(Document&);
  • trunk/Source/WebCore/platform/audio/MediaSession.cpp

    r167734 r168075  
    7777}
    7878
    79 void MediaSession::beginInterruption()
     79void MediaSession::beginInterruption(InterruptionType type)
    8080{
    8181    LOG(Media, "MediaSession::beginInterruption(%p), state = %s", this, stateName(m_state));
     82
     83    if (type == EnteringBackground && client().overrideBackgroundPlaybackRestriction())
     84        return;
    8285
    8386    m_stateToRestore = state();
  • trunk/Source/WebCore/platform/audio/MediaSession.h

    r167734 r168075  
    5858    void setState(State);
    5959
     60    enum InterruptionType {
     61        SystemSleep,
     62        EnteringBackground,
     63        SystemInterruption,
     64    };
    6065    enum EndInterruptionFlags {
    6166        NoFlags = 0,
    6267        MayResumePlaying = 1 << 0,
    6368    };
    64     void beginInterruption();
     69    void beginInterruption(InterruptionType);
    6570    void endInterruption(EndInterruptionFlags);
    6671
     
    128133    virtual bool elementIsHidden() const { return false; }
    129134
     135    virtual bool overrideBackgroundPlaybackRestriction() const = 0;
     136
    130137protected:
    131138    virtual ~MediaSessionClient() { }
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp

    r166384 r168075  
    8282}
    8383
    84 void MediaSessionManager::beginInterruption()
     84void MediaSessionManager::beginInterruption(MediaSession::InterruptionType type)
    8585{
    8686    LOG(Media, "MediaSessionManager::beginInterruption");
     
    8989    Vector<MediaSession*> sessions = m_sessions;
    9090    for (auto* session : sessions)
    91         session->beginInterruption();
     91        session->beginInterruption(type);
    9292}
    9393
     
    264264    for (auto* session : sessions) {
    265265        if (m_restrictions[session->mediaType()] & BackgroundPlaybackNotPermitted)
    266             session->beginInterruption();
     266            session->beginInterruption(MediaSession::EnteringBackground);
    267267    }
    268268}
     
    315315
    316316    for (auto session : m_sessions)
    317         session->beginInterruption();
     317        session->beginInterruption(MediaSession::SystemSleep);
    318318}
    319319
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.h

    r166384 r168075  
    6161    int count(MediaSession::MediaType) const;
    6262
    63     void beginInterruption();
     63    void beginInterruption(MediaSession::InterruptionType);
    6464    void endInterruption(MediaSession::EndInterruptionFlags);
    6565
  • trunk/Source/WebCore/platform/audio/ios/AudioDestinationIOS.h

    r167767 r168075  
    6060    virtual bool canReceiveRemoteControlCommands() const { return false; }
    6161    virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) { }
     62    virtual bool overrideBackgroundPlaybackRestriction() const { return false; }
    6263    virtual void pausePlayback() override { stop(); }
    6364    virtual void resumePlayback() override { start(); }
  • trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm

    r167767 r168075  
    283283
    284284        if (type == AVAudioSessionInterruptionTypeBegan)
    285             _callback->beginInterruption();
     285            _callback->beginInterruption(MediaSession::SystemInterruption);
    286286        else
    287287            _callback->endInterruption(flags);
  • trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.h

    r165676 r168075  
    4545    virtual ~AudioDestinationMac();
    4646
     47private:
     48    void configure();
     49
     50    // DefaultOutputUnit callback
     51    static OSStatus inputProc(void* userData, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 busNumber, UInt32 numberOfFrames, AudioBufferList* ioData);
     52
     53    OSStatus render(UInt32 numberOfFrames, AudioBufferList* ioData);
     54
     55    virtual MediaSession::MediaType mediaType() const override { return MediaSession::WebAudio; }
     56    virtual bool canReceiveRemoteControlCommands() const override { return false; }
     57    virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override { }
     58    virtual bool overrideBackgroundPlaybackRestriction() const override { return false; }
     59
    4760    virtual void start() override;
    4861    virtual void stop() override;
     
    5366
    5467    virtual float sampleRate() const override { return m_sampleRate; }
    55 
    56 private:
    57     void configure();
    58 
    59     // DefaultOutputUnit callback
    60     static OSStatus inputProc(void* userData, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 busNumber, UInt32 numberOfFrames, AudioBufferList* ioData);
    61 
    62     OSStatus render(UInt32 numberOfFrames, AudioBufferList* ioData);
    63 
    64     virtual MediaSession::MediaType mediaType() const { return MediaSession::WebAudio; }
    65     virtual bool canReceiveRemoteControlCommands() const { return false; }
    66     virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) { }
    6768
    6869    AudioUnit m_outputUnit;
  • trunk/Source/WebCore/testing/Internals.cpp

    r167530 r168075  
    22172217void Internals::beginMediaSessionInterruption()
    22182218{
    2219     MediaSessionManager::sharedManager().beginInterruption();
     2219    MediaSessionManager::sharedManager().beginInterruption(MediaSession::SystemInterruption);
    22202220}
    22212221
  • trunk/Source/WebKit/ChangeLog

    r168073 r168075  
     12014-04-30  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [iOS] do not pause video when entering background while playing to external device
     4        https://bugs.webkit.org/show_bug.cgi?id=132374
     5
     6        Reviewed by Jer Noble.
     7
     8        * WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in:
     9
    1102014-04-30  Anders Carlsson  <andersca@apple.com>
    211
  • trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in

    r167587 r168075  
    243243#if ENABLE(VIDEO)
    244244        symbolWithPointer(?sharedManager@MediaSessionManager@WebCore@@SAAAV12@XZ, ?sharedManager@MediaSessionManager@WebCore@@SAAEAV12@XZ)
    245         symbolWithPointer(?beginInterruption@MediaSessionManager@WebCore@@QAEXXZ, ?beginInterruption@MediaSessionManager@WebCore@@QEAAXXZ)
     245        symbolWithPointer(?beginInterruption@MediaSessionManager@WebCore@@QAEXW4InterruptionType@MediaSession@2@@Z, ?beginInterruption@MediaSessionManager@WebCore@@QAEXW4InterruptionType@MediaSession@2@@Z)
    246246        symbolWithPointer(?endInterruption@MediaSessionManager@WebCore@@QAEXW4EndInterruptionFlags@MediaSession@2@@Z, ?endInterruption@MediaSessionManager@WebCore@@QEAAXW4EndInterruptionFlags@MediaSession@2@@Z)
    247247        symbolWithPointer(?addRestriction@MediaSessionManager@WebCore@@QAEXW4MediaType@MediaSession@2@I@Z, ?addRestriction@MediaSessionManager@WebCore@@QEAAXW4MediaType@MediaSession@2@I@Z)
Note: See TracChangeset for help on using the changeset viewer.