Changeset 184788 in webkit


Ignore:
Timestamp:
May 22, 2015, 12:14:48 PM (11 years ago)
Author:
eric.carlson@apple.com
Message:

[Mac] Device picker menu should be persistent
https://bugs.webkit.org/show_bug.cgi?id=145311

Reviewed by Brent Fulgham.

  • Modules/mediasession/WebMediaSessionManager.cpp:

(WebCore::WebMediaSessionManager::addPlaybackTargetPickerClient): Add logging.
(WebCore::WebMediaSessionManager::removePlaybackTargetPickerClient): Ditto.
(WebCore::WebMediaSessionManager::removeAllPlaybackTargetPickerClients): Ditto.
(WebCore::WebMediaSessionManager::showPlaybackTargetPicker): Ditto.
(WebCore::WebMediaSessionManager::clientStateDidChange): Ditto.
(WebCore::WebMediaSessionManager::externalOutputDeviceAvailableDidChange): Ditto.
(WebCore::WebMediaSessionManager::configurePlaybackTargetMonitoring): Ditto.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::mediaState): Don't set ExternalDeviceAutoPlayCandidate unless
there is an event listener.

  • platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:

(WebCore::MediaPlaybackTargetPickerMac::~MediaPlaybackTargetPickerMac): Release the menu
controller and remove observers.
(WebCore::MediaPlaybackTargetPickerMac::create): Add logging.
(WebCore::MediaPlaybackTargetPickerMac::pendingActionTimerFired): Ditto.
(WebCore::MediaPlaybackTargetPickerMac::availableDevicesDidChange): Ditto.
(WebCore::MediaPlaybackTargetPickerMac::devicePicker): Ditto.
(WebCore::MediaPlaybackTargetPickerMac::showPlaybackTargetPicker): Ditto.
(WebCore::MediaPlaybackTargetPickerMac::addPendingAction): Start the timer after
a brief pause to debounce multiple identical notifications.
(WebCore::MediaPlaybackTargetPickerMac::currentDeviceDidChange): Add logging.
(WebCore::MediaPlaybackTargetPickerMac::startingMonitoringPlaybackTargets): Add logging.
(WebCore::MediaPlaybackTargetPickerMac::stopMonitoringPlaybackTargets): Don't release
the menu controller delegate.
(-[WebAVOutputDeviceMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]): Add logging.

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget): Update logging.
(WebCore::MediaPlayerPrivateAVFoundationObjC::setShouldPlayToPlaybackTarget): Ditto.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r184783 r184788  
     12015-05-22  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] Device picker menu should be persistent
     4        https://bugs.webkit.org/show_bug.cgi?id=145311
     5
     6        Reviewed by Brent Fulgham.
     7
     8        * Modules/mediasession/WebMediaSessionManager.cpp:
     9        (WebCore::WebMediaSessionManager::addPlaybackTargetPickerClient): Add logging.
     10        (WebCore::WebMediaSessionManager::removePlaybackTargetPickerClient): Ditto.
     11        (WebCore::WebMediaSessionManager::removeAllPlaybackTargetPickerClients): Ditto.
     12        (WebCore::WebMediaSessionManager::showPlaybackTargetPicker): Ditto.
     13        (WebCore::WebMediaSessionManager::clientStateDidChange): Ditto.
     14        (WebCore::WebMediaSessionManager::externalOutputDeviceAvailableDidChange): Ditto.
     15        (WebCore::WebMediaSessionManager::configurePlaybackTargetMonitoring): Ditto.
     16
     17        * html/HTMLMediaElement.cpp:
     18        (WebCore::HTMLMediaElement::mediaState): Don't set ExternalDeviceAutoPlayCandidate unless
     19        there is an event listener.
     20
     21        * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
     22        (WebCore::MediaPlaybackTargetPickerMac::~MediaPlaybackTargetPickerMac): Release the menu
     23        controller and remove observers.
     24        (WebCore::MediaPlaybackTargetPickerMac::create): Add logging.
     25        (WebCore::MediaPlaybackTargetPickerMac::pendingActionTimerFired): Ditto.
     26        (WebCore::MediaPlaybackTargetPickerMac::availableDevicesDidChange): Ditto.
     27        (WebCore::MediaPlaybackTargetPickerMac::devicePicker): Ditto.
     28        (WebCore::MediaPlaybackTargetPickerMac::showPlaybackTargetPicker): Ditto.
     29        (WebCore::MediaPlaybackTargetPickerMac::addPendingAction): Start the timer after
     30        a brief pause to debounce multiple identical notifications.
     31        (WebCore::MediaPlaybackTargetPickerMac::currentDeviceDidChange): Add logging.
     32        (WebCore::MediaPlaybackTargetPickerMac::startingMonitoringPlaybackTargets): Add logging.
     33        (WebCore::MediaPlaybackTargetPickerMac::stopMonitoringPlaybackTargets): Don't release
     34        the menu controller delegate.
     35        (-[WebAVOutputDeviceMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]): Add logging.
     36
     37        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     38        (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget): Update logging.
     39        (WebCore::MediaPlayerPrivateAVFoundationObjC::setShouldPlayToPlaybackTarget): Ditto.
     40
    1412015-05-22  Alexey Proskuryakov  <ap@apple.com>
    242
  • trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp

    r184555 r184788  
    3030
    3131#include "FloatRect.h"
     32#include "Logging.h"
    3233#include "MediaPlaybackTargetPickerMac.h"
    3334#include "WebMediaSessionManagerClient.h"
     
    7778        return 0;
    7879
     80    LOG(Media, "WebMediaSessionManager::addPlaybackTargetPickerClient(%p + %llu)", &client, contextId);
     81
    7982    m_clientState.append(std::make_unique<ClientState>(client, contextId));
    8083
     
    9295        return;
    9396
     97    LOG(Media, "WebMediaSessionManager::removePlaybackTargetPickerClient(%p + %llu)", &client, contextId);
     98
    9499    m_clientState.remove(index);
    95100    scheduleDelayedTask(TargetMonitoringConfigurationTask | TargetClientsConfigurationTask);
     
    98103void WebMediaSessionManager::removeAllPlaybackTargetPickerClients(WebMediaSessionManagerClient& client)
    99104{
     105    LOG(Media, "WebMediaSessionManager::removeAllPlaybackTargetPickerClients(%p)", &client);
     106
    100107    for (size_t i = m_clientState.size(); i > 0; --i) {
    101108        if (&m_clientState[i - 1]->client == &client)
     
    117124
    118125    bool hasActiveRoute = flagsAreSet(m_clientState[index]->flags, MediaProducer::IsPlayingToExternalDevice);
     126    LOG(Media, "WebMediaSessionManager::showPlaybackTargetPicker(%p + %llu) - hasActiveRoute = %i", &client, contextId, (int)hasActiveRoute);
    119127    targetPicker().showPlaybackTargetPicker(FloatRect(rect), hasActiveRoute);
    120128}
     
    129137    auto& changedClientState = m_clientState[index];
    130138    MediaProducer::MediaStateFlags oldFlags = changedClientState->flags;
     139    LOG(Media, "WebMediaSessionManager::clientStateDidChange(%p + %llu) - new flags = 0x%x, old flags = 0x%x", &client, contextId, newFlags, oldFlags);
    131140    if (newFlags == oldFlags)
    132141        return;
     
    176185void WebMediaSessionManager::externalOutputDeviceAvailableDidChange(bool available)
    177186{
     187    LOG(Media, "WebMediaSessionManager::externalOutputDeviceAvailableDidChange - clients = %zu, available = %i", m_clientState.size(), (int)available);
     188
    178189    m_externalOutputDeviceAvailable = available;
    179190    for (auto& state : m_clientState)
     
    246257        }
    247258    }
     259
     260    LOG(Media, "WebMediaSessionManager::configurePlaybackTargetMonitoring - monitoringRequired = %i", (int)monitoringRequired);
    248261
    249262    if (monitoringRequired)
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r184670 r184788  
    62826282        state |= IsPlayingToExternalDevice;
    62836283
    6284     if (!m_mediaSession->wirelessVideoPlaybackDisabled(*this)) {
    6285         if ((m_hasPlaybackTargetAvailabilityListeners || hasActiveVideo) && m_player->canPlayToWirelessPlaybackTarget())
    6286             state |= RequiresPlaybackTargetMonitoring;
    6287     }
     6284    if (!m_mediaSession->wirelessVideoPlaybackDisabled(*this) && m_hasPlaybackTargetAvailabilityListeners && m_player->canPlayToWirelessPlaybackTarget())
     6285        state |= RequiresPlaybackTargetMonitoring;
    62886286
    62896287    bool requireUserGesture = m_mediaSession->hasBehaviorRestriction(HTMLMediaSession::RequireUserGestureToAutoplayToExternalDevice);
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm

    r184204 r184788  
    2929#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
    3030
     31#import "Logging.h"
    3132#import <WebCore/AVFoundationSPI.h>
    3233#import <WebCore/AVKitSPI.h>
     
    6768namespace WebCore {
    6869
     70static const double pendingActionInterval = 1.0 / 10.0;
     71
    6972std::unique_ptr<MediaPlaybackTargetPickerMac> MediaPlaybackTargetPickerMac::create(MediaPlaybackTargetPicker::Client& client)
    7073{
     
    8386    m_pendingActionTimer.stop();
    8487    [m_outputDeviceMenuControllerDelegate clearCallback];
    85     stopMonitoringPlaybackTargets();
     88
     89    if (m_outputDeviceMenuController) {
     90        [m_outputDeviceMenuController removeObserver:m_outputDeviceMenuControllerDelegate.get() forKeyPath:externalOutputDeviceAvailableKeyName];
     91        [m_outputDeviceMenuController removeObserver:m_outputDeviceMenuControllerDelegate.get() forKeyPath:externalOutputDevicePickedKeyName];
     92        m_outputDeviceMenuController = nullptr;
     93    }
    8694}
    8795
    8896void MediaPlaybackTargetPickerMac::pendingActionTimerFired()
    8997{
     98    LOG(Media, "MediaPlaybackTargetPickerMac::pendingActionTimerFired - flags = 0x%x", m_pendingActionFlags);
     99
    90100    if (!m_outputDeviceMenuController || !m_client)
    91101        return;
     
    106116void MediaPlaybackTargetPickerMac::availableDevicesDidChange()
    107117{
     118    LOG(Media, "MediaPlaybackTargetPickerMac::availableDevicesDidChange - available = %i", (int)devicePicker().externalOutputDeviceAvailable);
     119
    108120    if (!m_client)
    109121        return;
     
    124136        [m_outputDeviceMenuController.get() addObserver:m_outputDeviceMenuControllerDelegate.get() forKeyPath:externalOutputDevicePickedKeyName options:NSKeyValueObservingOptionNew context:nullptr];
    125137
     138        LOG(Media, "MediaPlaybackTargetPickerMac::devicePicker - allocated menu controller %p", m_outputDeviceMenuController.get());
     139
    126140        if (m_outputDeviceMenuController.get().externalOutputDeviceAvailable)
    127141            availableDevicesDidChange();
     
    135149    if (!m_client || m_showingMenu)
    136150        return;
     151
     152    LOG(Media, "MediaPlaybackTargetPickerMac::showPlaybackTargetPicker - checkActiveRoute = %i", (int)checkActiveRoute);
    137153
    138154    AVOutputDeviceMenuControllerType *picker = devicePicker();
     
    151167{
    152168    m_pendingActionFlags |= action;
    153     m_pendingActionTimer.startOneShot(0);
     169    m_pendingActionTimer.startOneShot(pendingActionInterval);
    154170}
    155171
    156172void MediaPlaybackTargetPickerMac::currentDeviceDidChange()
    157173{
     174    LOG(Media, "MediaPlaybackTargetPickerMac::currentDeviceDidChange");
     175
    158176    if (!m_client)
    159177        return;
     
    164182void MediaPlaybackTargetPickerMac::startingMonitoringPlaybackTargets()
    165183{
     184    LOG(Media, "MediaPlaybackTargetPickerMac::startingMonitoringPlaybackTargets");
     185
    166186    devicePicker();
    167187}
     
    169189void MediaPlaybackTargetPickerMac::stopMonitoringPlaybackTargets()
    170190{
    171     if (m_outputDeviceMenuController) {
    172         [m_outputDeviceMenuController removeObserver:m_outputDeviceMenuControllerDelegate.get() forKeyPath:externalOutputDeviceAvailableKeyName];
    173         [m_outputDeviceMenuController removeObserver:m_outputDeviceMenuControllerDelegate.get() forKeyPath:externalOutputDevicePickedKeyName];
    174         m_outputDeviceMenuController = nullptr;
    175     }
     191    LOG(Media, "MediaPlaybackTargetPickerMac::stopMonitoringPlaybackTargets");
     192
     193    // FIXME: update once rdar://21062536 has been fixed.
    176194}
    177195
     
    202220    if (!m_callback)
    203221        return;
     222
     223    LOG(Media, "MediaPlaybackTargetPickerMac::observeValueForKeyPath - key = %s", [keyPath UTF8String]);
    204224
    205225    if (![keyPath isEqualToString:externalOutputDeviceAvailableKeyName] && ![keyPath isEqualToString:externalOutputDevicePickedKeyName])
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r184760 r184788  
    27982798
    27992799    m_outputContext = macTarget->outputContext();
    2800     LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(%p) - target = %p", this, m_outputContext.get());
     2800    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(%p) - target = %p, device name = %s", this, m_outputContext.get(), [m_outputContext.get().deviceName UTF8String]);
    28012801
    28022802    if (!m_outputContext || !m_outputContext.get().deviceName)
     
    28132813    AVOutputContext *newContext = shouldPlay ? m_outputContext.get() : nil;
    28142814    RetainPtr<AVOutputContext> currentContext = m_avPlayer.get().outputContext;
     2815
     2816    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setShouldPlayToPlaybackTarget(%p) - target = %p, shouldPlay = %s", this, newContext, boolString(shouldPlay));
     2817
    28152818    if ((!newContext && !currentContext.get()) || [currentContext.get() isEqual:newContext])
    28162819        return;
     
    28192822    m_avPlayer.get().outputContext = newContext;
    28202823    setDelayCallbacks(false);
    2821 
    2822     LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setShouldPlayToPlaybackTarget(%p) - target = %p, playing to target = %s", this, m_avPlayer.get().outputContext, boolString(shouldPlay));
    28232824}
    28242825
Note: See TracChangeset for help on using the changeset viewer.