Changeset 270943 in webkit


Ignore:
Timestamp:
Dec 17, 2020 1:33:12 PM (19 months ago)
Author:
jer.noble@apple.com
Message:

[macOS] Use low-power audio buffer sizes for more output devices
https://bugs.webkit.org/show_bug.cgi?id=219975
<rdar://problem/72391280>

Reviewed by Eric Carlson.

In r171069, we limited setting the preferred buffer duration to a "low power", high-duration value to
built-in hardware, as some external audio devices would report supporting those high-duration values
only to have audible glitches when that value was set. Since then, external, wireless audio devices have
become vastly more prevalent. To enable "low power" buffer durations on those devices, allow these larger
durations to be set on external devices so long as they claim to support that larger duration.

  • platform/audio/AudioHardwareListener.cpp:

(WebCore::AudioHardwareListener::AudioHardwareListener):

  • platform/audio/AudioHardwareListener.h:

(WebCore::AudioHardwareListener::BufferSizeRange::operator bool const):
(WebCore::AudioHardwareListener::BufferSizeRange::nearest const):
(WebCore::AudioHardwareListener::supportedBufferSizes const):
(WebCore::AudioHardwareListener::setSupportedBufferSizes):
(WebCore::AudioHardwareListener::outputDeviceSupportsLowPowerMode const): Deleted.
(WebCore::AudioHardwareListener::setOutputDeviceSupportsLowPowerMode): Deleted.

  • platform/audio/cocoa/MediaSessionManagerCocoa.mm:

(WebCore::MediaSessionManagerCocoa::updateSessionState):

  • platform/audio/mac/AudioHardwareListenerMac.cpp:

(WebCore::currentDeviceSupportedBufferSizes):
(WebCore::AudioHardwareListenerMac::AudioHardwareListenerMac):
(WebCore::AudioHardwareListenerMac::outputDeviceChanged):
(WebCore::currentDeviceSupportsLowPowerBufferSize): Deleted.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r270942 r270943  
     12020-12-17  Jer Noble  <jer.noble@apple.com>
     2
     3        [macOS] Use low-power audio buffer sizes for more output devices
     4        https://bugs.webkit.org/show_bug.cgi?id=219975
     5        <rdar://problem/72391280>
     6
     7        Reviewed by Eric Carlson.
     8
     9        In r171069, we limited setting the preferred buffer duration to a "low power", high-duration value to
     10        built-in hardware, as some external audio devices would report supporting those high-duration values
     11        only to have audible glitches when that value was set. Since then, external, wireless audio devices have
     12        become vastly more prevalent. To enable "low power" buffer durations on those devices, allow these larger
     13        durations to be set on external devices so long as they claim to support that larger duration.
     14
     15        * platform/audio/AudioHardwareListener.cpp:
     16        (WebCore::AudioHardwareListener::AudioHardwareListener):
     17        * platform/audio/AudioHardwareListener.h:
     18        (WebCore::AudioHardwareListener::BufferSizeRange::operator bool const):
     19        (WebCore::AudioHardwareListener::BufferSizeRange::nearest const):
     20        (WebCore::AudioHardwareListener::supportedBufferSizes const):
     21        (WebCore::AudioHardwareListener::setSupportedBufferSizes):
     22        (WebCore::AudioHardwareListener::outputDeviceSupportsLowPowerMode const): Deleted.
     23        (WebCore::AudioHardwareListener::setOutputDeviceSupportsLowPowerMode): Deleted.
     24        * platform/audio/cocoa/MediaSessionManagerCocoa.mm:
     25        (WebCore::MediaSessionManagerCocoa::updateSessionState):
     26        * platform/audio/mac/AudioHardwareListenerMac.cpp:
     27        (WebCore::currentDeviceSupportedBufferSizes):
     28        (WebCore::AudioHardwareListenerMac::AudioHardwareListenerMac):
     29        (WebCore::AudioHardwareListenerMac::outputDeviceChanged):
     30        (WebCore::currentDeviceSupportsLowPowerBufferSize): Deleted.
     31
    1322020-12-17  Kate Cheney  <katherine_cheney@apple.com>
    233
  • trunk/Source/WebCore/platform/audio/AudioHardwareListener.cpp

    r267544 r270943  
    4040{
    4141#if PLATFORM(IOS_FAMILY)
    42     m_outputDeviceSupportsLowPowerMode = true;
     42    m_supportedBufferSizes = { 32, 4096 };
    4343#endif
    4444}
  • trunk/Source/WebCore/platform/audio/AudioHardwareListener.h

    r267544 r270943  
    5252   
    5353    AudioHardwareActivityType hardwareActivity() const { return m_activity; }
    54     bool outputDeviceSupportsLowPowerMode() const { return m_outputDeviceSupportsLowPowerMode; }
     54
     55    struct BufferSizeRange {
     56        size_t minimum { 0 };
     57        size_t maximum { 0 };
     58        operator bool() const { return minimum && maximum; }
     59        size_t nearest(size_t value) const { return std::min(std::max(value, minimum), maximum); }
     60    };
     61    BufferSizeRange supportedBufferSizes() const { return m_supportedBufferSizes; }
    5562
    5663protected:
     
    5865
    5966    void setHardwareActivity(AudioHardwareActivityType activity) { m_activity = activity; }
    60     void setOutputDeviceSupportsLowPowerMode(bool support) { m_outputDeviceSupportsLowPowerMode = support; }
     67    void setSupportedBufferSizes(BufferSizeRange sizes) { m_supportedBufferSizes = sizes; }
    6168
    6269    Client& m_client;
    6370    AudioHardwareActivityType m_activity { AudioHardwareActivityType::Unknown };
    64     bool m_outputDeviceSupportsLowPowerMode { false };
     71    BufferSizeRange m_supportedBufferSizes;
    6572};
    6673
  • trunk/Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.mm

    r267541 r270943  
    110110    else if ((videoAudioCount || audioCount) && DeprecatedGlobalSettings::lowPowerVideoAudioBufferSizeEnabled()) {
    111111        size_t bufferSize;
    112         if (m_audioHardwareListener && m_audioHardwareListener->outputDeviceSupportsLowPowerMode())
    113             bufferSize = kLowPowerVideoBufferSize;
     112        if (m_audioHardwareListener && m_audioHardwareListener->supportedBufferSizes())
     113            bufferSize = m_audioHardwareListener->supportedBufferSizes().nearest(kLowPowerVideoBufferSize);
    114114        else
    115115            bufferSize = AudioUtilities::renderQuantumSize;
  • trunk/Source/WebCore/platform/audio/mac/AudioHardwareListenerMac.cpp

    r232613 r270943  
    6060}
    6161
    62 static bool currentDeviceSupportsLowPowerBufferSize()
     62static AudioHardwareListener::BufferSizeRange currentDeviceSupportedBufferSizes()
    6363{
    6464    AudioDeviceID deviceID = kAudioDeviceUnknown;
     
    7070
    7171    if (AudioObjectGetPropertyData(kAudioObjectSystemObject, &defaultOutputDeviceDescriptor, 0, 0, &descriptorSize, (void*)&deviceID))
    72         return false;
     72        return { };
    7373
    74     UInt32 transportType = kAudioDeviceTransportTypeUnknown;
    75     descriptorSize = sizeof(transportType);
    76     AudioObjectPropertyAddress tranportTypeDescriptor = {
    77         kAudioDevicePropertyTransportType,
     74    AudioValueRange bufferSizes;
     75    descriptorSize = sizeof(bufferSizes);
     76
     77    AudioObjectPropertyAddress bufferSizeDescriptor = {
     78        kAudioDevicePropertyBufferFrameSizeRange,
    7879        kAudioObjectPropertyScopeGlobal,
    7980        kAudioObjectPropertyElementMaster,
    8081    };
    8182
    82     if (AudioObjectGetPropertyData(deviceID, &tranportTypeDescriptor, 0, 0, &descriptorSize, &transportType))
    83         return false;
     83    if (AudioObjectGetPropertyData(deviceID, &bufferSizeDescriptor, 0, 0, &descriptorSize, &bufferSizes))
     84        return { };
    8485
    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;
     86    return { static_cast<size_t>(bufferSizes.mMinimum), static_cast<size_t>(bufferSizes.mMaximum) };
    8887}
     88
    8989
    9090static const AudioObjectPropertyAddress& processIsRunningPropertyDescriptor()
     
    124124{
    125125    setHardwareActivity(isAudioHardwareProcessRunning());
    126     setOutputDeviceSupportsLowPowerMode(currentDeviceSupportsLowPowerBufferSize());
     126    setSupportedBufferSizes(currentDeviceSupportedBufferSizes());
    127127
    128128    auto weakThis = makeWeakPtr(*this);
     
    173173void AudioHardwareListenerMac::outputDeviceChanged()
    174174{
    175     setOutputDeviceSupportsLowPowerMode(currentDeviceSupportsLowPowerBufferSize());
     175    setSupportedBufferSizes(currentDeviceSupportedBufferSizes());
    176176    m_client.audioOutputDeviceChanged();
    177177}
Note: See TracChangeset for help on using the changeset viewer.