Changeset 186636 in webkit


Ignore:
Timestamp:
Jul 9, 2015 2:59:33 PM (9 years ago)
Author:
eric.carlson@apple.com
Message:

[Mac] AirPlay to password protected AppleTV fails
https://bugs.webkit.org/show_bug.cgi?id=146812

Reviewed by NOBODY (OOPS!).

  • Modules/mediasession/WebMediaSessionManager.cpp:

(WebCore::WebMediaSessionManager::showPlaybackTargetPicker): Initialize previouslyRequestedPicker.
(WebCore::WebMediaSessionManager::clientStateDidChange): Cleanup the logic and add a comment

to make it slightly easier to follow. Don't begin playing to a device unless playback
has just started (don't switch in mid-play).

(WebCore::WebMediaSessionManager::configurePlaybackTargetClients): Use the last client to

request the device picker as a fallback in case no other client is a canditate. Add more
logging to make it possible to debug the selection logic.

(WebCore::WebMediaSessionManager::scheduleDelayedTask): Fiddle with the logging.

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r186608 r186636  
     12015-07-09  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] AirPlay to password protected AppleTV fails
     4        https://bugs.webkit.org/show_bug.cgi?id=146812
     5
     6        Reviewed by Dean Jackson.
     7
     8        * Modules/mediasession/WebMediaSessionManager.cpp:
     9        (WebCore::WebMediaSessionManager::showPlaybackTargetPicker): Initialize previouslyRequestedPicker.
     10        (WebCore::WebMediaSessionManager::clientStateDidChange): Cleanup the logic and add a comment
     11          to make it slightly easier to follow. Don't begin playing to a device unless playback
     12          has just started (don't switch in mid-play).
     13        (WebCore::WebMediaSessionManager::configurePlaybackTargetClients): Use the last client to
     14          request the device picker as a fallback in case no other client is a canditate. Add more
     15          logging to make it possible to debug the selection logic.
     16        (WebCore::WebMediaSessionManager::scheduleDelayedTask): Fiddle with the logging.
     17
    1182015-07-09  Matthew Daiter  <mdaiter@apple.com>
    219
  • trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp

    r186519 r186636  
    5555    WebCore::MediaProducer::MediaStateFlags flags { WebCore::MediaProducer::IsNotPlaying };
    5656    bool requestedPicker { false };
     57    bool previouslyRequestedPicker { false };
    5758    bool configurationRequired { true };
    5859    bool playedToEnd { false };
     
    149150
    150151    auto& clientRequestingPicker = m_clientState[index];
    151     for (auto& state : m_clientState)
     152    for (auto& state : m_clientState) {
    152153        state->requestedPicker = state == clientRequestingPicker;
     154        state->previouslyRequestedPicker = state == clientRequestingPicker;
     155    }
    153156
    154157    bool hasActiveRoute = flagsAreSet(m_clientState[index]->flags, MediaProducer::IsPlayingToExternalDevice);
     
    182185    }
    183186
    184     if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute())
    185         return;
    186 
    187     if (!flagsAreSet(newFlags, MediaProducer::ExternalDeviceAutoPlayCandidate) || !flagsAreSet(newFlags, MediaProducer::IsPlayingVideo))
     187    if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute() || !flagsAreSet(newFlags, MediaProducer::ExternalDeviceAutoPlayCandidate))
    188188        return;
    189189
    190190    // Do not interrupt another element already playing to a device.
    191     bool anotherClientHasActiveTarget = false;
    192191    for (auto& state : m_clientState) {
    193192        if (state == changedClientState)
    194193            continue;
    195194
    196         if (flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice)) {
    197             if (flagsAreSet(state->flags, MediaProducer::IsPlayingVideo))
    198                 return;
    199             anotherClientHasActiveTarget = true;
    200         }
    201     }
    202 
    203     if (anotherClientHasActiveTarget || !flagsAreSet(newFlags, MediaProducer::IsPlayingVideo))
     195        if (flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice) && flagsAreSet(state->flags, MediaProducer::IsPlayingVideo))
     196            return;
     197    }
     198
     199    // Do not take begin playing to the device unless playback has just started.
     200    if (!flagsAreSet(newFlags, MediaProducer::IsPlayingVideo) || flagsAreSet(oldFlags, MediaProducer::IsPlayingVideo))
    204201        return;
    205202
     
    250247{
    251248    size_t indexOfClientThatRequestedPicker = notFound;
    252     size_t indexOfAutoPlayCandidate = notFound;
     249    size_t indexOfLastClientToRequestPicker = notFound;
    253250    size_t indexOfClientWillPlayToTarget = notFound;
    254251    bool haveActiveRoute = m_playbackTarget && m_playbackTarget->hasActiveRoute();
     
    257254        auto& state = m_clientState[i];
    258255
     256        LOG(Media, "WebMediaSessionManager::configurePlaybackTargetClients %zu - client (%p + %llu) requestedPicker = %i, flags = %s", i, &state->client, state->contextId, state->requestedPicker, mediaProducerStateString(state->flags).utf8().data());
     257
    259258        if (m_targetChanged && state->requestedPicker)
    260259            indexOfClientThatRequestedPicker = i;
     
    262261        if (indexOfClientWillPlayToTarget == notFound && flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice))
    263262            indexOfClientWillPlayToTarget = i;
     263
     264        if (indexOfClientWillPlayToTarget == notFound && haveActiveRoute && state->previouslyRequestedPicker)
     265            indexOfLastClientToRequestPicker = i;
    264266    }
    265267
    266268    if (indexOfClientThatRequestedPicker != notFound)
    267269        indexOfClientWillPlayToTarget = indexOfClientThatRequestedPicker;
    268     if (indexOfClientWillPlayToTarget == notFound && haveActiveRoute && indexOfAutoPlayCandidate != notFound)
    269         indexOfClientWillPlayToTarget = indexOfAutoPlayCandidate;
     270    if (indexOfClientWillPlayToTarget == notFound && indexOfLastClientToRequestPicker != notFound)
     271        indexOfClientWillPlayToTarget = indexOfLastClientToRequestPicker;
     272
     273    LOG(Media, "WebMediaSessionManager::configurePlaybackTargetClients - indexOfClientWillPlayToTarget = %zu", indexOfClientWillPlayToTarget);
    270274
    271275    for (size_t i = 0; i < m_clientState.size(); ++i) {
     
    285289    if (haveActiveRoute && indexOfClientWillPlayToTarget != notFound) {
    286290        auto& state = m_clientState[indexOfClientWillPlayToTarget];
     291
    287292        if (!flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice))
    288293            state->client.setShouldPlayToPlaybackTarget(state->contextId, true);
     
    334339void WebMediaSessionManager::scheduleDelayedTask(ConfigurationTasks tasks)
    335340{
    336     LOG(Media, "WebMediaSessionManager::scheduleDelayedTask - tasks = %s", toString(tasks).utf8().data());
     341    LOG(Media, "WebMediaSessionManager::scheduleDelayedTask - %s", toString(tasks).utf8().data());
    337342
    338343    m_taskFlags |= tasks;
Note: See TracChangeset for help on using the changeset viewer.