Changeset 183560 in webkit


Ignore:
Timestamp:
Apr 29, 2015, 11:05:25 AM (10 years ago)
Author:
eric.carlson@apple.com
Message:

[Mac] Use new device picker menu API
https://bugs.webkit.org/show_bug.cgi?id=144392

Reviewed by Jer Noble.

  • Modules/mediasession/WebMediaSessionManager.cpp:

(WebCore::WebMediaSessionManager::showPlaybackTargetPicker): Pass the route state to the picker.

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

(WebCore::MediaPlaybackTargetPickerMac::MediaPlaybackTargetPickerMac): m_deviceChangeTimer -> m_pendingActionTimer.
(WebCore::MediaPlaybackTargetPickerMac::~MediaPlaybackTargetPickerMac): Ditto.
(WebCore::MediaPlaybackTargetPickerMac::pendingActionTimerFired): Renamed from
outputeDeviceAvailabilityChangedTimerFired.
(WebCore::MediaPlaybackTargetPickerMac::availableDevicesDidChange): Use addPendingAction.
(WebCore::MediaPlaybackTargetPickerMac::showPlaybackTargetPicker): Call new picker API if it is
available. New API returns true if a target is chosen, so call currentDeviceDidChange in that case.
(WebCore::MediaPlaybackTargetPickerMac::addPendingAction): New.
(WebCore::MediaPlaybackTargetPickerMac::currentDeviceDidChange): Make asynchronous because it
can now be called from showPlaybackTargetPicker.
(WebCore::MediaPlaybackTargetPickerMac::outputeDeviceAvailabilityChangedTimerFired): Renamed
pendingActionTimerFired.

  • platform/spi/cocoa/AVKitSPI.h: Add new SPI.
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r183555 r183560  
     12015-04-29  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] Use new device picker menu API
     4        https://bugs.webkit.org/show_bug.cgi?id=144392
     5
     6        Reviewed by Jer Noble.
     7
     8        * Modules/mediasession/WebMediaSessionManager.cpp:
     9        (WebCore::WebMediaSessionManager::showPlaybackTargetPicker): Pass the route state to the picker.
     10        * platform/graphics/MediaPlaybackTargetPicker.h:
     11
     12        * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h:
     13        * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
     14        (WebCore::MediaPlaybackTargetPickerMac::MediaPlaybackTargetPickerMac):  m_deviceChangeTimer -> m_pendingActionTimer.
     15        (WebCore::MediaPlaybackTargetPickerMac::~MediaPlaybackTargetPickerMac): Ditto.
     16        (WebCore::MediaPlaybackTargetPickerMac::pendingActionTimerFired): Renamed from
     17        outputeDeviceAvailabilityChangedTimerFired.
     18        (WebCore::MediaPlaybackTargetPickerMac::availableDevicesDidChange): Use addPendingAction.
     19        (WebCore::MediaPlaybackTargetPickerMac::showPlaybackTargetPicker): Call new picker API if it is
     20        available. New API returns true if a target is chosen, so call currentDeviceDidChange in that case.
     21        (WebCore::MediaPlaybackTargetPickerMac::addPendingAction): New.
     22        (WebCore::MediaPlaybackTargetPickerMac::currentDeviceDidChange): Make asynchronous because it
     23        can now be called from showPlaybackTargetPicker.
     24        (WebCore::MediaPlaybackTargetPickerMac::outputeDeviceAvailabilityChangedTimerFired): Renamed
     25        pendingActionTimerFired.
     26
     27        * platform/spi/cocoa/AVKitSPI.h: Add new SPI.
     28
    1292015-04-29  Antti Koivisto  <antti@apple.com>
    230
  • trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp

    r183509 r183560  
    115115}
    116116
    117 void WebMediaSessionManager::showPlaybackTargetPicker(WebMediaSessionManagerClient& client, uint64_t contextId, const IntRect& rect, bool isVideo)
     117void WebMediaSessionManager::showPlaybackTargetPicker(WebMediaSessionManagerClient& client, uint64_t contextId, const IntRect& rect, bool)
    118118{
    119119    size_t index = find(&client, contextId);
     
    125125        state->requestedPicker = (state->contextId == contextId && state->client == &client);
    126126
    127     targetPicker().showPlaybackTargetPicker(FloatRect(rect), isVideo);
     127    bool hasActiveRoute = flagsAreSet(m_clientState[index]->flags, MediaProducer::IsPlayingToExternalDevice);
     128    targetPicker().showPlaybackTargetPicker(FloatRect(rect), hasActiveRoute);
    128129}
    129130
  • trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.h

    r183096 r183560  
    5151    virtual ~MediaPlaybackTargetPicker();
    5252
    53     virtual void showPlaybackTargetPicker(const FloatRect&, bool);
     53    virtual void showPlaybackTargetPicker(const FloatRect&, bool checkActiveRoute);
    5454    virtual void startingMonitoringPlaybackTargets();
    5555    virtual void stopMonitoringPlaybackTargets();
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h

    r183114 r183560  
    4545    WEBCORE_EXPORT static std::unique_ptr<MediaPlaybackTargetPickerMac> create(MediaPlaybackTargetPicker::Client&);
    4646
    47     virtual void showPlaybackTargetPicker(const FloatRect&, bool) override;
     47    virtual void showPlaybackTargetPicker(const FloatRect&, bool checkActiveRoute) override;
    4848    virtual void startingMonitoringPlaybackTargets() override;
    4949    virtual void stopMonitoringPlaybackTargets() override;
     
    5656
    5757    AVOutputDeviceMenuController *devicePicker();
    58     void outputeDeviceAvailabilityChangedTimerFired();
    5958
     59    enum ActionType {
     60        OutputDeviceAvailabilityChanged = 1 << 0,
     61        CurrentDeviceDidChange = 1 << 1,
     62    };
     63    typedef unsigned PendingActionFlags;
     64
     65    void addPendingAction(PendingActionFlags);
     66    void pendingActionTimerFired();
     67
     68    PendingActionFlags m_pendingActionFlags { 0 };
    6069    RetainPtr<AVOutputDeviceMenuController> m_outputDeviceMenuController;
    6170    RetainPtr<WebAVOutputDeviceMenuControllerHelper> m_outputDeviceMenuControllerDelegate;
    62     RunLoop::Timer<MediaPlaybackTargetPickerMac> m_deviceChangeTimer;
     71    RunLoop::Timer<MediaPlaybackTargetPickerMac> m_pendingActionTimer;
    6372};
    6473
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm

    r183096 r183560  
    5151static NSString *externalOutputDevicePickedKeyName = @"externalOutputDevicePicked";
    5252
     53// FIXME: remove this once the headers are available.
     54@interface AVOutputDeviceMenuController (ForwardDeclaration)
     55- (BOOL)showMenuForRect:(NSRect)screenRect appearanceName:(NSString *)appearanceName allowReselectionOfSelectedOutputDevice:(BOOL)allowReselectionOfSelectedOutputDevice;
     56@end
     57
    5358@interface WebAVOutputDeviceMenuControllerHelper : NSObject {
    5459    MediaPlaybackTargetPickerMac* m_callback;
     
    7075    : MediaPlaybackTargetPicker(client)
    7176    , m_outputDeviceMenuControllerDelegate(adoptNS([[WebAVOutputDeviceMenuControllerHelper alloc] initWithCallback:this]))
    72     , m_deviceChangeTimer(RunLoop::main(), this, &MediaPlaybackTargetPickerMac::outputeDeviceAvailabilityChangedTimerFired)
     77    , m_pendingActionTimer(RunLoop::main(), this, &MediaPlaybackTargetPickerMac::pendingActionTimerFired)
    7378{
    7479}
     
    7681MediaPlaybackTargetPickerMac::~MediaPlaybackTargetPickerMac()
    7782{
    78     m_deviceChangeTimer.stop();
     83    m_pendingActionTimer.stop();
    7984    [m_outputDeviceMenuControllerDelegate clearCallback];
    8085    stopMonitoringPlaybackTargets();
    8186}
    8287
    83 void MediaPlaybackTargetPickerMac::outputeDeviceAvailabilityChangedTimerFired()
     88void MediaPlaybackTargetPickerMac::pendingActionTimerFired()
    8489{
    8590    if (!m_outputDeviceMenuController || !m_client)
    8691        return;
    8792
    88     m_client->externalOutputDeviceAvailableDidChange(devicePicker().externalOutputDeviceAvailable);
     93    PendingActionFlags pendingActions = m_pendingActionFlags;
     94    m_pendingActionFlags = 0;
     95
     96    if (pendingActions & OutputDeviceAvailabilityChanged)
     97        m_client->externalOutputDeviceAvailableDidChange(devicePicker().externalOutputDeviceAvailable);
     98
     99    if (pendingActions & CurrentDeviceDidChange) {
     100        AVOutputDeviceMenuControllerType* devicePicker = this->devicePicker();
     101        if (devicePicker)
     102            m_client->setPlaybackTarget(WebCore::MediaPlaybackTargetMac::create([devicePicker outputContext]));
     103    }
    89104}
    90105
     
    94109        return;
    95110
    96     m_deviceChangeTimer.stop();
    97     m_deviceChangeTimer.startOneShot(0);
     111    addPendingAction(OutputDeviceAvailabilityChanged);
    98112}
    99113
     
    117131}
    118132
    119 void MediaPlaybackTargetPickerMac::showPlaybackTargetPicker(const FloatRect& location, bool)
     133void MediaPlaybackTargetPickerMac::showPlaybackTargetPicker(const FloatRect& location, bool checkActiveRoute)
    120134{
    121135    if (!m_client)
    122136        return;
    123137
    124     [devicePicker() showMenuForRect:location appearanceName:NSAppearanceNameVibrantLight];
     138    AVOutputDeviceMenuControllerType *picker = devicePicker();
     139    if ([picker respondsToSelector:@selector(showMenuForRect:appearanceName:allowReselectionOfSelectedOutputDevice:)]) {
     140        if ([picker showMenuForRect:location appearanceName:NSAppearanceNameVibrantLight allowReselectionOfSelectedOutputDevice:!checkActiveRoute])
     141            currentDeviceDidChange();
     142    } else
     143        [picker showMenuForRect:location appearanceName:NSAppearanceNameVibrantLight];
     144}
     145
     146void MediaPlaybackTargetPickerMac::addPendingAction(PendingActionFlags action)
     147{
     148    m_pendingActionFlags |= action;
     149    m_pendingActionTimer.startOneShot(0);
    125150}
    126151
     
    130155        return;
    131156
    132     AVOutputDeviceMenuControllerType* devicePicker = this->devicePicker();
    133     if (!devicePicker)
    134         return;
    135 
    136     m_client->setPlaybackTarget(WebCore::MediaPlaybackTargetMac::create([devicePicker outputContext]));
     157    addPendingAction(CurrentDeviceDidChange);
    137158}
    138159
  • trunk/Source/WebCore/platform/spi/cocoa/AVKitSPI.h

    r183289 r183560  
    140140
    141141- (void)showMenuForRect:(NSRect)screenRect appearanceName:(NSString *)appearanceName;
     142- (BOOL)showMenuForRect:(NSRect)screenRect appearanceName:(NSString *)appearanceName allowReselectionOfSelectedOutputDevice:(BOOL)allowReselectionOfSelectedOutputDevice;
    142143
    143144@end
Note: See TracChangeset for help on using the changeset viewer.