Changeset 171069 in webkit


Ignore:
Timestamp:
Jul 14, 2014 11:17:34 AM (10 years ago)
Author:
eric.carlson@apple.com
Message:

[Mac] don't enable low power audio mode on external output devices
https://bugs.webkit.org/show_bug.cgi?id=134877

Reviewed by Sam Weinig.

Source/WebCore:
No new tests, this deals with changes to the audio hardware at runtime.

  • WebCore.xcodeproj/project.pbxproj: Remove AudioSessionListener.h.
  • WebCore.vcxproj/WebCore.vcxproj: Ditto.
  • platform/audio/AudioHardwareListener.cpp:

(WebCore::AudioHardwareListener::AudioHardwareListener): Initialize m_outputDeviceSupportsLowPowerMode

to true on iOS.

  • platform/audio/AudioHardwareListener.h:

(WebCore::AudioHardwareListener::outputDeviceSupportsLowPowerMode): New accessor.
(WebCore::AudioHardwareListener::setHardwareActivity): New setter for derived classes.
(WebCore::AudioHardwareListener::setOutputDeviceSupportsLowPowerMode): Ditto.

Remove AudioSessionListener interface, it wasn't being used.

  • platform/audio/AudioSession.cpp:

(WebCore::AudioSession::addListener): Deleted.
(WebCore::AudioSession::removeListener): Deleted.
(WebCore::AudioSession::beganAudioInterruption): Deleted.
(WebCore::AudioSession::endedAudioInterruption): Deleted.

  • platform/audio/AudioSession.h:
  • platform/audio/AudioSessionListener.h: Removed.
  • platform/audio/MediaSessionManager.cpp:

(WebCore::MediaSessionManager::addSession): Allocate the AudioHardwareListener if necessary.
(WebCore::MediaSessionManager::removeSession): Free the AudioHardwareListener if necessary.
(WebCore::MediaSessionManager::audioOutputDeviceChanged): AudioHardwareListener client interface

called when the output device changes, call updateSessionState to make sure we are using
the correct buffer size.

  • platform/audio/MediaSessionManager.h:
  • platform/audio/ios/AudioDestinationIOS.h:
  • platform/audio/ios/AudioSessionIOS.mm:

(WebCore::AudioSessionPrivate::AudioSessionPrivate): Drive-by cleanup, remove ObjC helper object

that was used to listen for OS notifications, it is no longer used.

(SOFT_LINK_POINTER): Deleted.
(-[WebAudioSessionHelper initWithCallback:]): Deleted.
(-[WebAudioSessionHelper dealloc]): Deleted.
(-[WebAudioSessionHelper interruption:]): Deleted.

  • platform/audio/mac/AudioHardwareListenerMac.cpp:

(WebCore::currentDeviceSupportsLowPowerBufferSize): New, return true only if using build-in

transport device.

(WebCore::processIsRunningPropertyDescriptor): Return reference to static AudioObjectPropertyAddress

for kAudioHardwarePropertyProcessIsRunning instead of declaring one in every method
that needs one.

(WebCore::outputDevicePropertyDescriptor): Return reference to static AudioObjectPropertyAddress

for kAudioHardwarePropertyDefaultOutputDevice.

(WebCore::AudioHardwareListenerMac::AudioHardwareListenerMac): Restructure and add audio object

listener for default output device.

(WebCore::AudioHardwareListenerMac::~AudioHardwareListenerMac): *Remove* listener audio object

property listener instead of *Adding* a new one. Remove new listener.

(WebCore::AudioHardwareListenerMac::propertyChanged): Enumerate the properties that changed,

call appropriate method.

(WebCore::AudioHardwareListenerMac::processIsRunningChanged): Renamed from setHardwareActive,

cleanup.

(WebCore::AudioHardwareListenerMac::outputDeviceChanged): New, call client.audioHardwareOutputDeviceChanged.
(WebCore::AudioHardwareListenerMac::setHardwareActive): Deleted, renamed processIsRunningChanged.

  • platform/audio/mac/AudioHardwareListenerMac.h:
  • platform/audio/mac/MediaSessionManagerMac.cpp:

(MediaSessionManager::updateSessionState): Only set the output buffer size to 4K when hardware

supports it.

Source/WebKit2:

  • PluginProcess/PluginProcess.h: Add an empty implementation of

AudioHardwareListener::audioOutputDeviceChanged.

Location:
trunk/Source
Files:
1 deleted
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r171059 r171069  
     12014-07-14  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] don't enable low power audio mode on external output devices
     4        https://bugs.webkit.org/show_bug.cgi?id=134877
     5
     6        Reviewed by Sam Weinig.
     7
     8        No new tests, this deals with changes to the audio hardware at runtime.
     9
     10        * WebCore.xcodeproj/project.pbxproj: Remove AudioSessionListener.h.
     11        * WebCore.vcxproj/WebCore.vcxproj: Ditto.
     12
     13        * platform/audio/AudioHardwareListener.cpp:
     14        (WebCore::AudioHardwareListener::AudioHardwareListener): Initialize m_outputDeviceSupportsLowPowerMode
     15            to true on iOS.
     16        * platform/audio/AudioHardwareListener.h:
     17        (WebCore::AudioHardwareListener::outputDeviceSupportsLowPowerMode): New accessor.
     18        (WebCore::AudioHardwareListener::setHardwareActivity): New setter for derived classes.
     19        (WebCore::AudioHardwareListener::setOutputDeviceSupportsLowPowerMode): Ditto.
     20
     21        Remove AudioSessionListener interface, it wasn't being used.
     22        * platform/audio/AudioSession.cpp:
     23        (WebCore::AudioSession::addListener): Deleted.
     24        (WebCore::AudioSession::removeListener): Deleted.
     25        (WebCore::AudioSession::beganAudioInterruption): Deleted.
     26        (WebCore::AudioSession::endedAudioInterruption): Deleted.
     27        * platform/audio/AudioSession.h:
     28        * platform/audio/AudioSessionListener.h: Removed.
     29
     30        * platform/audio/MediaSessionManager.cpp:
     31        (WebCore::MediaSessionManager::addSession): Allocate the AudioHardwareListener if necessary.
     32        (WebCore::MediaSessionManager::removeSession): Free the AudioHardwareListener if necessary.
     33        (WebCore::MediaSessionManager::audioOutputDeviceChanged): AudioHardwareListener client interface
     34            called when the output device changes, call updateSessionState to make sure we are using
     35            the correct buffer size.
     36        * platform/audio/MediaSessionManager.h:
     37
     38        * platform/audio/ios/AudioDestinationIOS.h:
     39        * platform/audio/ios/AudioSessionIOS.mm:
     40        (WebCore::AudioSessionPrivate::AudioSessionPrivate): Drive-by cleanup, remove ObjC helper object
     41            that was used to listen for OS notifications, it is no longer used.
     42        (SOFT_LINK_POINTER): Deleted.
     43        (-[WebAudioSessionHelper initWithCallback:]): Deleted.
     44        (-[WebAudioSessionHelper dealloc]): Deleted.
     45        (-[WebAudioSessionHelper interruption:]): Deleted.
     46
     47        * platform/audio/mac/AudioHardwareListenerMac.cpp:
     48        (WebCore::currentDeviceSupportsLowPowerBufferSize): New, return true only if using build-in
     49            transport device.
     50        (WebCore::processIsRunningPropertyDescriptor): Return reference to static AudioObjectPropertyAddress
     51            for kAudioHardwarePropertyProcessIsRunning instead of declaring one in every method
     52            that needs one.
     53        (WebCore::outputDevicePropertyDescriptor): Return reference to static AudioObjectPropertyAddress
     54            for kAudioHardwarePropertyDefaultOutputDevice.
     55        (WebCore::AudioHardwareListenerMac::AudioHardwareListenerMac): Restructure and add audio object
     56            listener for default output device.
     57        (WebCore::AudioHardwareListenerMac::~AudioHardwareListenerMac): *Remove* listener audio object
     58            property listener instead of *Adding* a new one. Remove new listener.
     59        (WebCore::AudioHardwareListenerMac::propertyChanged): Enumerate the properties that changed,
     60            call appropriate method.
     61        (WebCore::AudioHardwareListenerMac::processIsRunningChanged): Renamed from setHardwareActive,
     62            cleanup.
     63        (WebCore::AudioHardwareListenerMac::outputDeviceChanged): New, call client.audioHardwareOutputDeviceChanged.
     64        (WebCore::AudioHardwareListenerMac::setHardwareActive): Deleted, renamed processIsRunningChanged.
     65        * platform/audio/mac/AudioHardwareListenerMac.h:
     66
     67        * platform/audio/mac/MediaSessionManagerMac.cpp:
     68        (MediaSessionManager::updateSessionState): Only set the output buffer size to 4K when hardware
     69            supports it.
     70
    1712014-07-13  Benjamin Poulain  <benjamin@webkit.org>
    272
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r170698 r171069  
    1931019310    <ClInclude Include="..\platform\FloatConversion.h" />
    1931119311    <ClInclude Include="..\platform\audio\AudioSession.h" />
    19312     <ClInclude Include="..\platform\audio\AudioSessionListener.h" />
    1931319312    <ClInclude Include="..\platform\audio\MediaSession.h" />
    1931419313    <ClInclude Include="..\platform\audio\MediaSessionManager.h" />
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r170730 r171069  
    1311513115                CDA07FC018E0A22B004699FA /* SystemSleepListenerMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SystemSleepListenerMac.h; sourceTree = "<group>"; };
    1311613116                CDA79821170A22DC00D45C55 /* AudioSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioSession.h; sourceTree = "<group>"; };
    13117                 CDA79822170A24F400D45C55 /* AudioSessionListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioSessionListener.h; sourceTree = "<group>"; };
    1311813117                CDA79823170A258300D45C55 /* AudioSession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioSession.cpp; sourceTree = "<group>"; };
    1311913118                CDA79825170A279000D45C55 /* AudioSessionIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AudioSessionIOS.mm; path = ios/AudioSessionIOS.mm; sourceTree = "<group>"; };
     
    2308423083                                CDA79823170A258300D45C55 /* AudioSession.cpp */,
    2308523084                                CDA79821170A22DC00D45C55 /* AudioSession.h */,
    23086                                 CDA79822170A24F400D45C55 /* AudioSessionListener.h */,
    2308723085                                FD31605312B026F700C1A359 /* AudioSourceProvider.h */,
    2308823086                                FD62F52D145898D80094B0ED /* AudioSourceProviderClient.h */,
  • trunk/Source/WebCore/platform/audio/AudioHardwareListener.cpp

    r166446 r171069  
    3939    : m_client(client)
    4040    , m_activity(AudioHardwareActivityType::Unknown)
     41    , m_outputDeviceSupportsLowPowerMode(false)
    4142{
    42    
     43#if PLATFORM(IOS)
     44    m_outputDeviceSupportsLowPowerMode = true;
     45#endif
    4346}
    4447
  • trunk/Source/WebCore/platform/audio/AudioHardwareListener.h

    r166446 r171069  
    4545        virtual void audioHardwareDidBecomeActive() = 0;
    4646        virtual void audioHardwareDidBecomeInactive() = 0;
     47        virtual void audioOutputDeviceChanged() = 0;
    4748    };
    4849
     
    5152   
    5253    AudioHardwareActivityType hardwareActivity() const { return m_activity; }
     54    bool outputDeviceSupportsLowPowerMode() const { return m_outputDeviceSupportsLowPowerMode; }
    5355
    5456protected:
    5557    AudioHardwareListener(Client&);
    5658
     59    void setHardwareActivity(AudioHardwareActivityType activity) { m_activity = activity; }
     60    void setOutputDeviceSupportsLowPowerMode(bool support) { m_outputDeviceSupportsLowPowerMode = support; }
     61
    5762    Client& m_client;
    5863    AudioHardwareActivityType m_activity;
     64    bool m_outputDeviceSupportsLowPowerMode;
    5965};
    6066
  • trunk/Source/WebCore/platform/audio/AudioSession.cpp

    r165607 r171069  
    11/*
    2  * Copyright (C) 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013-2014 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2929#if USE(AUDIO_SESSION)
    3030
    31 #include "AudioSessionListener.h"
    3231#include "NotImplemented.h"
    3332
     
    3837    DEPRECATED_DEFINE_STATIC_LOCAL(AudioSession, session, ());
    3938    return session;
    40 }
    41 
    42 void AudioSession::addListener(AudioSessionListener* listener)
    43 {
    44     m_listeners.add(listener);
    45 }
    46 
    47 void AudioSession::removeListener(AudioSessionListener* listener)
    48 {
    49     m_listeners.remove(listener);
    50 }
    51 
    52 void AudioSession::beganAudioInterruption()
    53 {
    54     for (HashSet<AudioSessionListener*>::iterator i = m_listeners.begin(); i != m_listeners.end(); ++i)
    55         (*i)->beganAudioInterruption();
    56 }
    57 
    58 void AudioSession::endedAudioInterruption()
    59 {
    60     for (HashSet<AudioSessionListener*>::iterator i = m_listeners.begin(); i != m_listeners.end(); ++i)
    61         (*i)->endedAudioInterruption();
    6239}
    6340
  • trunk/Source/WebCore/platform/audio/AudioSession.h

    r162774 r171069  
    11/*
    2  * Copyright (C) 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013-2014 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3535namespace WebCore {
    3636
    37 class AudioSessionListener;
    3837class AudioSessionPrivate;
    3938
     
    5857    CategoryType categoryOverride() const;
    5958
    60     void addListener(AudioSessionListener*);
    61     void removeListener(AudioSessionListener*);
    62 
    6359    float sampleRate() const;
    6460    size_t numberOfOutputChannels() const;
     
    6965    void setPreferredBufferSize(size_t);
    7066
    71     void beganAudioInterruption();
    72     void endedAudioInterruption();
    73 
    7467private:
    7568    AudioSession();
     
    7770
    7871    std::unique_ptr<AudioSessionPrivate> m_private;
    79     HashSet<AudioSessionListener*> m_listeners;
    8072};
    8173
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp

    r170370 r171069  
    120120    if (m_interrupted)
    121121        session.setState(MediaSession::Interrupted);
    122     updateSessionState();
    123122
    124123    if (!m_remoteCommandListener)
    125124        m_remoteCommandListener = RemoteCommandListener::create(*this);
     125
     126    if (!m_audioHardwareListener)
     127        m_audioHardwareListener = AudioHardwareListener::create(*this);
     128
     129    updateSessionState();
    126130
    127131    if (m_clients.isEmpty() || !(session.mediaType() == MediaSession::Video || session.mediaType() == MediaSession::Audio))
     
    142146   
    143147    m_sessions.remove(index);
    144     updateSessionState();
    145 
    146     if (m_sessions.isEmpty())
     148
     149    if (m_sessions.isEmpty()) {
    147150        m_remoteCommandListener = nullptr;
     151        m_audioHardwareListener = nullptr;
     152    }
     153
     154    updateSessionState();
    148155
    149156    if (m_clients.isEmpty() || !(session.mediaType() == MediaSession::Video || session.mediaType() == MediaSession::Audio))
     
    340347}
    341348
     349void MediaSessionManager::audioOutputDeviceChanged()
     350{
     351    updateSessionState();
     352}
     353
    342354}
    343355
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.h

    r170370 r171069  
    2727#define MediaSessionManager_h
    2828
     29#include <AudioHardwareListener.h>
    2930#include "MediaSession.h"
    3031#include "RemoteCommandListener.h"
     
    5354};
    5455
    55 class MediaSessionManager : RemoteCommandListenerClient, SystemSleepListener::Client {
     56class MediaSessionManager : private RemoteCommandListenerClient, private SystemSleepListener::Client, private AudioHardwareListener::Client {
    5657public:
    5758    static MediaSessionManager& sharedManager();
     
    9596#endif
    9697
    97     virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override;
    98 
    9998    void addClient(MediaSessionManagerClient*);
    10099    void removeClient(MediaSessionManagerClient*);
     
    115114    void updateSessionState();
    116115
    117     virtual void systemWillSleep();
    118     virtual void systemDidWake();
     116
     117    // RemoteCommandListenerClient
     118    virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override;
     119
     120    // AudioHardwareListenerClient
     121    virtual void audioHardwareDidBecomeActive() override { }
     122    virtual void audioHardwareDidBecomeInactive() override { }
     123    virtual void audioOutputDeviceChanged() override;
     124
     125    // SystemSleepListener
     126    virtual void systemWillSleep() override;
     127    virtual void systemDidWake() override;
    119128
    120129    SessionRestrictions m_restrictions[MediaSession::WebAudio + 1];
     
    124133    std::unique_ptr<RemoteCommandListener> m_remoteCommandListener;
    125134    std::unique_ptr<SystemSleepListener> m_systemSleepListener;
     135    RefPtr<AudioHardwareListener> m_audioHardwareListener;
    126136    bool m_interrupted;
    127137};
  • trunk/Source/WebCore/platform/audio/ios/AudioDestinationIOS.h

    r168075 r171069  
    3333#include "AudioBus.h"
    3434#include "AudioDestination.h"
    35 #include "AudioSessionListener.h"
    3635#include "MediaSession.h"
    3736#include <AudioUnit/AudioUnit.h>
  • trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.mm

    r167767 r171069  
    5555#define AVAudioSessionInterruptionTypeKey getAVAudioSessionInterruptionTypeKey()
    5656
    57 static NSString * const WCAVAudioSessionInterruptionNotification = @"AVAudioSessionInterruptionNotification";
    58 
    59 #if !ASSERT_DISABLED
    60 SOFT_LINK_POINTER(AVFoundation, AVAudioSessionInterruptionNotification, NSString *)
    61 #endif
    62 
    63 @interface WebAudioSessionHelper : NSObject {
    64     WebCore::AudioSession* _callback;
    65 }
    66 - (id)initWithCallback:(WebCore::AudioSession*)callback;
    67 - (void)interruption:(NSNotification*)notification;
    68 @end
    69 
    70 @implementation WebAudioSessionHelper
    71 - (id)initWithCallback:(WebCore::AudioSession*)callback
    72 {
    73     self = [super init];
    74     if (!self)
    75         return nil;
    76 
    77     _callback = callback;
    78 
    79     ASSERT([WCAVAudioSessionInterruptionNotification isEqualToString:getAVAudioSessionInterruptionNotification()]);
    80 
    81     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruption:) name:WCAVAudioSessionInterruptionNotification object:nil];
    82 
    83     return self;
    84 }
    85 
    86 - (void)dealloc
    87 {
    88     [[NSNotificationCenter defaultCenter] removeObserver:self name:WCAVAudioSessionInterruptionNotification object:nil];
    89     [super dealloc];
    90 }
    91 
    92 - (void)interruption:(NSNotification *)notification
    93 {
    94     ASSERT([AVAudioSession sharedInstance] == [notification object]);
    95     if ([AVAudioSession sharedInstance] != [notification object])
    96         return;
    97 
    98     NSUInteger type = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
    99     if (type == AVAudioSessionInterruptionTypeBegan)
    100         _callback->beganAudioInterruption();
    101     else
    102         _callback->endedAudioInterruption();
    103 }
    104 @end
    105 
    10657namespace WebCore {
    107 
    10858
    10959#if !LOG_DISABLED
     
    12979public:
    13080    AudioSessionPrivate(AudioSession*);
    131     RetainPtr<WebAudioSessionHelper> m_helper;
    13281    AudioSession::CategoryType m_categoryOverride;
    13382};
    13483
    135 AudioSessionPrivate::AudioSessionPrivate(AudioSession* session)
    136     : m_helper(adoptNS([[WebAudioSessionHelper alloc] initWithCallback:session]))
    137     , m_categoryOverride(AudioSession::None)
     84AudioSessionPrivate::AudioSessionPrivate(AudioSession*)
     85    : m_categoryOverride(AudioSession::None)
    13886{
    13987}
  • trunk/Source/WebCore/platform/audio/mac/AudioHardwareListenerMac.cpp

    r166442 r171069  
    5959        return AudioHardwareActivityType::IsInactive;
    6060}
    61    
     61
     62static bool currentDeviceSupportsLowPowerBufferSize()
     63{
     64    AudioDeviceID deviceID = kAudioDeviceUnknown;
     65    UInt32 descriptorSize = sizeof(deviceID);
     66    AudioObjectPropertyAddress defaultOutputDeviceDescriptor = {
     67        kAudioHardwarePropertyDefaultOutputDevice,
     68        kAudioObjectPropertyScopeGlobal,
     69        kAudioObjectPropertyElementMaster };
     70
     71    if (AudioObjectGetPropertyData(kAudioObjectSystemObject, &defaultOutputDeviceDescriptor, 0, 0, &descriptorSize, (void*)&deviceID))
     72        return false;
     73
     74    UInt32 transportType = kAudioDeviceTransportTypeUnknown;
     75    descriptorSize = sizeof(transportType);
     76    AudioObjectPropertyAddress tranportTypeDescriptor = {
     77        kAudioDevicePropertyTransportType,
     78        kAudioObjectPropertyScopeGlobal,
     79        kAudioObjectPropertyElementMaster,
     80    };
     81
     82    if (AudioObjectGetPropertyData(deviceID, &tranportTypeDescriptor, 0, 0, &descriptorSize, &transportType))
     83        return false;
     84
     85    // Only allow low-power buffer size when using built-in output device, many external devices perform
     86    // poorly with a large output buffer.
     87    return kAudioDeviceTransportTypeBuiltIn == transportType;
     88}
     89
     90static const AudioObjectPropertyAddress& processIsRunningPropertyDescriptor()
     91{
     92    static AudioObjectPropertyAddress processIsRunningProperty = {
     93        kAudioHardwarePropertyProcessIsRunning,
     94        kAudioObjectPropertyScopeGlobal,
     95        kAudioObjectPropertyElementMaster
     96    };
     97
     98    return processIsRunningProperty;
     99};
     100
     101static const AudioObjectPropertyAddress& outputDevicePropertyDescriptor()
     102{
     103    static AudioObjectPropertyAddress outputDeviceProperty = {
     104        kAudioHardwarePropertyDefaultOutputDevice,
     105        kAudioObjectPropertyScopeGlobal,
     106        kAudioObjectPropertyElementMaster
     107    };
     108
     109    return outputDeviceProperty;
     110};
     111
    62112PassRefPtr<AudioHardwareListener> AudioHardwareListener::create(Client& client)
    63113{
     
    73123    : AudioHardwareListener(client)
    74124{
    75     m_activity = isAudioHardwareProcessRunning();
    76     if (hardwareActivity() == AudioHardwareActivityType::Unknown)
    77         return;
     125    setHardwareActivity(isAudioHardwareProcessRunning());
     126    setOutputDeviceSupportsLowPowerMode(currentDeviceSupportsLowPowerBufferSize());
    78127
    79     AudioObjectPropertyAddress propertyAddress = {
    80         kAudioHardwarePropertyProcessIsRunning,
    81         kAudioObjectPropertyScopeGlobal,
    82         kAudioObjectPropertyElementMaster
    83     };
    84 
    85     m_block = Block_copy(^(UInt32, const AudioObjectPropertyAddress[]) {
    86         setHardwareActive(isAudioHardwareProcessRunning());
     128    m_block = Block_copy(^(UInt32 count, const AudioObjectPropertyAddress properties[]) {
     129        propertyChanged(count, properties);
    87130    });
    88131
    89     AudioObjectAddPropertyListenerBlock(kAudioObjectSystemObject, &propertyAddress, dispatch_get_main_queue(), m_block);
     132    AudioObjectAddPropertyListenerBlock(kAudioObjectSystemObject, &processIsRunningPropertyDescriptor(), dispatch_get_main_queue(), m_block);
     133    AudioObjectAddPropertyListenerBlock(kAudioObjectSystemObject, &outputDevicePropertyDescriptor(), dispatch_get_main_queue(), m_block);
    90134}
    91135
    92136AudioHardwareListenerMac::~AudioHardwareListenerMac()
    93137{
    94     if (hardwareActivity() == AudioHardwareActivityType::Unknown)
    95         return;
    96    
    97     AudioObjectPropertyAddress propertyAddress = {
    98         kAudioHardwarePropertyProcessIsRunning,
    99         kAudioObjectPropertyScopeGlobal,
    100         kAudioObjectPropertyElementMaster
    101     };
    102 
    103     AudioObjectAddPropertyListenerBlock(kAudioObjectSystemObject, &propertyAddress, dispatch_get_main_queue(), m_block);
    104 
     138    AudioObjectRemovePropertyListenerBlock(kAudioObjectSystemObject, &processIsRunningPropertyDescriptor(), dispatch_get_main_queue(), m_block);
     139    AudioObjectRemovePropertyListenerBlock(kAudioObjectSystemObject, &outputDevicePropertyDescriptor(), dispatch_get_main_queue(), m_block);
    105140    Block_release(m_block);
    106141}
    107142
    108 void AudioHardwareListenerMac::setHardwareActive(AudioHardwareActivityType activity)
     143void AudioHardwareListenerMac::propertyChanged(UInt32 propertyCount, const AudioObjectPropertyAddress properties[])
    109144{
    110     if (activity == m_activity)
     145    const AudioObjectPropertyAddress& deviceRunning = processIsRunningPropertyDescriptor();
     146    const AudioObjectPropertyAddress& outputDevice = outputDevicePropertyDescriptor();
     147
     148    for (UInt32 i = 0; i < propertyCount; ++i) {
     149        const AudioObjectPropertyAddress& property = properties[i];
     150
     151        if (!memcmp(&property, &deviceRunning, sizeof(AudioObjectPropertyAddress)))
     152            processIsRunningChanged();
     153        else if (!memcmp(&property, &outputDevice, sizeof(AudioObjectPropertyAddress)))
     154            outputDeviceChanged();
     155    }
     156}
     157
     158void AudioHardwareListenerMac::processIsRunningChanged()
     159{
     160    AudioHardwareActivityType activity = isAudioHardwareProcessRunning();
     161    if (activity == hardwareActivity())
    111162        return;
    112     m_activity = activity;
     163    setHardwareActivity(activity);
    113164   
    114165    if (hardwareActivity() == AudioHardwareActivityType::IsActive)
     
    118169}
    119170
     171void AudioHardwareListenerMac::outputDeviceChanged()
     172{
     173    setOutputDeviceSupportsLowPowerMode(currentDeviceSupportsLowPowerBufferSize());
     174    m_client.audioOutputDeviceChanged();
     175}
     176
    120177}
    121178
  • trunk/Source/WebCore/platform/audio/mac/AudioHardwareListenerMac.h

    r166442 r171069  
    3939    static WTF::PassRefPtr<AudioHardwareListenerMac> create(Client&);
    4040
    41 protected:
     41private:
    4242    AudioHardwareListenerMac(Client&);
    4343    virtual ~AudioHardwareListenerMac();
    4444
    45     void setHardwareActive(AudioHardwareActivityType);
     45    void processIsRunningChanged();
     46    void outputDeviceChanged();
     47
     48    void propertyChanged(UInt32, const AudioObjectPropertyAddress[]);
     49
    4650    AudioObjectPropertyListenerBlock m_block;
    4751};
  • trunk/Source/WebCore/platform/audio/mac/MediaSessionManagerMac.cpp

    r170485 r171069  
    5151        // FIXME: <http://webkit.org/b/116725> Figure out why enabling the code below
    5252        // causes media LayoutTests to fail on 10.8.
    53         AudioSession::sharedSession().setPreferredBufferSize(kLowPowerVideoBufferSize);
     53
     54        size_t bufferSize;
     55        if (m_audioHardwareListener && m_audioHardwareListener->outputDeviceSupportsLowPowerMode())
     56            bufferSize = kLowPowerVideoBufferSize;
     57        else
     58            bufferSize = kWebAudioBufferSize;
     59
     60        AudioSession::sharedSession().setPreferredBufferSize(bufferSize);
    5461    }
    5562#endif
  • trunk/Source/WebKit2/ChangeLog

    r171068 r171069  
     12014-07-14  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] don't enable low power audio mode on external output devices
     4        https://bugs.webkit.org/show_bug.cgi?id=134877
     5
     6        Reviewed by Sam Weinig.
     7
     8        * PluginProcess/PluginProcess.h: Add an empty implementation of
     9            AudioHardwareListener::audioOutputDeviceChanged.
     10
    1112014-07-14  Tim Horton  <timothy_horton@apple.com>
    212
  • trunk/Source/WebKit2/PluginProcess/PluginProcess.h

    r166845 r171069  
    102102    virtual void audioHardwareDidBecomeActive() override;
    103103    virtual void audioHardwareDidBecomeInactive() override;
     104    virtual void audioOutputDeviceChanged() override { }
    104105
    105106    void platformInitializePluginProcess(const PluginProcessCreationParameters&);
Note: See TracChangeset for help on using the changeset viewer.